私はWin32C++アプリケーションに取り組んでおり、マウスイベントを無視して、ウィンドウの下のウィンドウにパススルーします。基本的に、私の下のウィンドウはマウスイベントを処理します。SendMessageを使用してマウスメッセージを自分の下のウィンドウに送信したり、SetCaptureを使用したりしたくありません。基本的にマウスイベントを無視して、Windows APIまたはスタイルで通過させる方法はありますか?私のウィンドウは透明ではないことに注意してください。
助けてくれてありがとう。
私はWin32C++アプリケーションに取り組んでおり、マウスイベントを無視して、ウィンドウの下のウィンドウにパススルーします。基本的に、私の下のウィンドウはマウスイベントを処理します。SendMessageを使用してマウスメッセージを自分の下のウィンドウに送信したり、SetCaptureを使用したりしたくありません。基本的にマウスイベントを無視して、Windows APIまたはスタイルで通過させる方法はありますか?私のウィンドウは透明ではないことに注意してください。
助けてくれてありがとう。
私はこれを、2 つの異なるサード パーティによる 2 つの異なる RDC ソリューションでテストしています。各ソリューションは、おそらく異なるスタイルなどで独自のウィンドウを作成します。 WindowProc で以下を実行すると:
case WM_MOUSEMOVE:
{
std::cout << "WM_MOUSEMOVE" << std::endl;
VideoWindowWin32* window = reinterpret_cast<VideoWindowWin32*> (GetWindowLongPtr (hWnd, GWL_USERDATA));
if (window)
{
HWND rParent = GetParent(window->window);
SetCapture(window->parent);
//SendMessage(window->parent, uMsg, wParam, lParam);
}
}
break;
すべてがそれらの1つで機能します。しかし、それは他の人には当てはまりません。
何かお勧めがあればよろしくお願いします。
WM_NCHITTESTを処理して を返してみHTNOWHERE
ます。
WS_EX_TRANSPARENT を使用するアプローチには他の副作用があり、基になるウィンドウが同じスレッドによって所有されている場合にのみ役立つと思います。質問から、下にあるウィンドウが同じアプリケーションの一部なのか、その下にある古いアプリケーションの一部なのかは明らかではありません。
Adrian McCarthy に基づいていますが、実際には私にとってはうまくいきます (ただし、親が子ウィンドウを所有している場合のみです。そうでない場合、ウィンドウは再びマウスをキャッチします):
case WM_NCHITTEST: return HTTRANSPARENT;
HTNOWHERE
ウィンドウの LoadCursor() が表示されなくなっただけです。
これらの値は可能であるようです:
#ifndef NONCMESSAGES
/*
* WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes
*/
#define HTERROR (-2)
#define HTTRANSPARENT (-1)
#define HTNOWHERE 0
#define HTCLIENT 1
#define HTCAPTION 2
#define HTSYSMENU 3
#define HTGROWBOX 4
#define HTSIZE HTGROWBOX
#define HTMENU 5
#define HTHSCROLL 6
#define HTVSCROLL 7
#define HTMINBUTTON 8
#define HTMAXBUTTON 9
#define HTLEFT 10
#define HTRIGHT 11
#define HTTOP 12
#define HTTOPLEFT 13
#define HTTOPRIGHT 14
#define HTBOTTOM 15
#define HTBOTTOMLEFT 16
#define HTBOTTOMRIGHT 17
#define HTBORDER 18
#define HTREDUCE HTMINBUTTON
#define HTZOOM HTMAXBUTTON
#define HTSIZEFIRST HTLEFT
#define HTSIZELAST HTBOTTOMRIGHT
#if(WINVER >= 0x0400)
#define HTOBJECT 19
#define HTCLOSE 20
#define HTHELP 21
#endif /* WINVER >= 0x0400 */
/*
* SendMessageTimeout values
*/
#define SMTO_NORMAL 0x0000
#define SMTO_BLOCK 0x0001
#define SMTO_ABORTIFHUNG 0x0002
#if(WINVER >= 0x0500)
#define SMTO_NOTIMEOUTIFNOTHUNG 0x0008
#endif /* WINVER >= 0x0500 */
#if(WINVER >= 0x0600)
#define SMTO_ERRORONEXIT 0x0020
#endif /* WINVER >= 0x0600 */
#if(WINVER >= 0x0602)
#endif /* WINVER >= 0x0602 */
#endif /* !NONCMESSAGES */