0

WinProc で WM_MOUSEMOVE メッセージを処理する空のウィンドウを作成しようとしています。

case WM_MOUSEMOVE:
    {
        HWND otherHwnd = HWND(0x000608FC);
        POINT pt = {LOWORD(lParam), HIWORD(lParam)};

        ClientToScreen(otherHwnd, &pt);
        PostMessage(otherHwnd, WM_TIMER, WPARAM(4096), 0);
        PostMessage(otherHwnd, message, wParam, lParam);
        SendMessage(otherHwnd, WM_NCHITTEST, NULL, (LPARAM)MAKELONG(pt.x, pt.y));
        SendMessage(otherHwnd, WM_NCHITTEST, NULL, (LPARAM)MAKELONG(pt.x, pt.y));
        SendMessage(otherHwnd, WM_NCHITTEST, NULL, (LPARAM)MAKELONG(pt.x, pt.y));
        SendMessage(otherHwnd, WM_SETCURSOR, WPARAM(otherHwnd), (LPARAM)MAKELONG(HTCLIENT, WM_MOUSEMOVE));
        break;
    }

IEでハイパーリンクをホバーできることを願っていますが、結果として、ハイパーリンクは非常に短時間でホバースタイルとしてのみ表示され、その後通常に戻り、再びホバーしてから通常になります。www.amazon.com で、 link("Today's Deals ") をホバーするようにシミュレートすると、リンクが点滅します。

IEウィンドウが他のウィンドウで覆われていても、マウスイベントでIEを動作させることができます。最善の解決策を待っています〜 orz

上記は、実際にリンクにカーソルを合わせたときのスパイ++ログです。シミュレートは実際のメッセージと同じです

<01277> 000608FC S WM_SETCURSOR hwnd:000608FC nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<01278> 000608FC R WM_SETCURSOR fHaltProcessing:False
<01279> 000608FC P WM_MOUSEMOVE fwKeys:0000 xPos:406 yPos:50
<01280> 000608FC P WM_TIMER wTimerID:4096 tmprc:00000000
<01281> 000608FC S WM_NCHITTEST xPos:520 yPos:283
<01282> 000608FC R WM_NCHITTEST nHittest:HTCLIENT
<01283> 000608FC S WM_NCHITTEST xPos:520 yPos:283
<01284> 000608FC R WM_NCHITTEST nHittest:HTCLIENT
<01285> 000608FC S WM_NCHITTEST xPos:520 yPos:283
<01286> 000608FC R WM_NCHITTEST nHittest:HTCLIENT
<01287> 000608FC S WM_NCHITTEST xPos:520 yPos:283
<01288> 000608FC R WM_NCHITTEST nHittest:HTCLIENT
<01289> 000608FC S WM_SETCURSOR hwnd:000608FC nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<01290> 000608FC R WM_SETCURSOR fHaltProcessing:False
<01291> 000608FC P WM_MOUSEMOVE fwKeys:0000 xPos:406 yPos:50
<01292> 000608FC P WM_TIMER wTimerID:4096 tmprc:00000000
<01293> 000608FC S WM_NCHITTEST xPos:520 yPos:283
<01294> 000608FC R WM_NCHITTEST nHittest:HTCLIENT
<01295> 000608FC S WM_NCHITTEST xPos:520 yPos:283
<01296> 000608FC R WM_NCHITTEST nHittest:HTCLIENT
<01297> 000608FC S WM_NCHITTEST xPos:520 yPos:283
<01298> 000608FC R WM_NCHITTEST nHittest:HTCLIENT
<01299> 000608FC S WM_NCHITTEST xPos:520 yPos:283
<01300> 000608FC R WM_NCHITTEST nHittest:HTCLIENT
<01301> 000608FC S WM_SETCURSOR hwnd:000608FC nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<01302> 000608FC R WM_SETCURSOR fHaltProcessing:False
<01303> 000608FC P WM_MOUSEMOVE fwKeys:0000 xPos:406 yPos:50
<01304> 000608FC S WM_NCHITTEST xPos:520 yPos:283
<01305> 000608FC R WM_NCHITTEST nHittest:HTCLIENT
<01306> 000608FC P WM_TIMER wTimerID:4096 tmprc:00000000
<01307> 000608FC S WM_NCHITTEST xPos:520 yPos:283
<01308> 000608FC R WM_NCHITTEST nHittest:HTCLIENT
<01309> 000608FC S WM_NCHITTEST xPos:520 yPos:283
<01310> 000608FC R WM_NCHITTEST nHittest:HTCLIENT
<01311> 000608FC S WM_NCHITTEST xPos:521 yPos:281
<01312> 000608FC R WM_NCHITTEST nHittest:HTCLIENT
4

2 に答える 2

1

これは、IE が WindowFromPoint() を呼び出して前景ウィンドウを取得するためです。結果が IE ウィンドウでない場合、マウスがそこにないことを認識します。考えられる解決策は、API をフックすることです。

于 2012-02-23T02:17:08.870 に答える
0

コードに問題はありません。問題は、Windows がメッセージを送信する方法にあります。

マウスを動かすと、Windows は画面上のすべてのウィンドウにメッセージを送信します。したがって、メッセージを IE ウィンドウ ハンドルに送信するたびにWM_MOUSEMOVE、Windows 自体が別のメッセージを送信して、マウスがそこにないことを伝えます。

だから、それは小さなレースです...

于 2010-01-18T12:43:50.340 に答える