1

HwndHostを含むユーザーコントロールを備えたWPFアプリがあります。HwndHostは次のように作成されます。

  hwndHost = CreateWindowEx(0, "static", "",
                            WS_CHILD | WS_VISIBLE,
                            0, 0,
                            hostHeight, hostWidth,
                            hwndParent.Handle,
                            (IntPtr)HOST_ID,
                            IntPtr.Zero,
                            0);

  hwndControl = CreateWindowEx(0, "Static", "",
                                WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN
                                  ,
                                0, 0,
                                hostHeight, hostWidth,
                                hwndHost,
                                (IntPtr)PICTUREBOX_ID,
                                IntPtr.Zero,
                                0);

次に、HwndSourceHookを使用してメッセージポンプに接続すると、大量のメッセージが送信されます。

必要なもの、つまりWM_MOUSEMOVE、WM_MOUSEHOVER、WM_LBUTTONDOWN、およびWM_LBUTTONUPを除きます。

また、OnMouseLeftButtonDownイベントは、メインウィンドウまたはコントロールのWPFコードでは発生しません。これは、Windowsがイベントをトラップして破棄しているためだと思います。

WIN32ウィンドウメッセージを使用するかどうかにかかわらず、これらをどのように処理できるかを知っている人はいますか?

4

3 に答える 3

4

WM_NCHITTESTを処理する必要があります。そうするまで、マウスメッセージは送信されません。

// C++/CLI implementation of HwndHost.WndProc().
virtual IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, bool% handled) override
{
    switch (msg)
    {
        case WM_NCHITTEST:
        {
            handled = true;
        return IntPtr(HTCLIENT);
        }
    }

    return IntPtr::Zero;
}
于 2010-11-10T19:30:54.703 に答える
1

WPFのBorder要素は、OnMouseLeftButtonDownがスローされないように見えます。より良いものが見つかるまでの一時的な解決策は、WPFの境界線をWPFボタンに変更することです。そうすると、すべてのマウスイベントがトリガーされます。

ほとんどの人にとって理想的ではありませんが、3Dをレンダリングするために使用しているので、その下に何があるかは関係ありません。

于 2010-04-14T12:17:59.273 に答える
0

メッセージポンプをフックする代わりに、WndClassを登録して、メッセージを独自のWndProcに配信してみませんか?私はあなたがはるかに良い結果を得るだろうと思う。

于 2010-03-25T15:44:06.757 に答える