9

私はWin32C++アプリケーションに取り組んでおり、マウスイベントを無視して、ウィンドウの下のウィンドウにパススルーします。基本的に、私の下のウィンドウはマウスイベントを処理します。SendMessageを使用してマウスメッセージを自分の下のウィンドウに送信したり、SetCaptureを使用したりしたくありません。基本的にマウスイベントを無視して、Windows APIまたはスタイルで通過させる方法はありますか?私のウィンドウは透明ではないことに注意してください。

助けてくれてありがとう。

4

4 に答える 4

1

私はこれを、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つで機能します。しかし、それは他の人には当てはまりません。

何かお勧めがあればよろしくお願いします。

于 2012-10-26T14:28:58.793 に答える
1

WM_NCHITTESTを処理して を返してみHTNOWHEREます。

WS_EX_TRANSPARENT を使用するアプローチには他の副作用があり、基になるウィンドウが同じスレッドによって所有されている場合にのみ役立つと思います。質問から、下にあるウィンドウが同じアプリケーションの一部なのか、その下にある古いアプリケーションの一部なのかは明らかではありません。

于 2012-10-25T16:51:09.280 に答える
0

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 */
于 2016-11-12T16:59:59.573 に答える