Как имитировать событие mousemove из одного окна в другое?

Я пытаюсь создать пустое окно, которое обрабатывает сообщение WM_MOUSEMOVE в WinProc:

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, когда я имитирую наведение на ссылку («Сегодняшние предложения»), ссылка мигает.

Я думаю, что есть лучший способ сделать это, даже если окно IE закрыто некоторыми другими окнами, это может заставить IE действовать с событием мыши. жду лучшего решения ~ орз

Выше приведены журналы шпиона ++, когда я действительно наводил ссылку. и имитация такая же, как и реальное сообщение

<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

person Gohan    schedule 18.01.2010    source источник


Ответы (2)


Это связано с тем, что IE вызывает WindowFromPoint() для получения окна переднего плана, и если результатом является не ваше окно IE, он знает, что вашей мыши там нет. Возможное решение — подключить API.

person krrrr0    schedule 23.02.2012

В вашем коде нет ничего плохого. Проблема в том, как Windows отправляет сообщения.

Когда вы двигаете мышью, Windows отправляет сообщения всем окнам на экране. Поэтому всякий раз, когда вы отправляете сообщение WM_MOUSEMOVE дескриптору окна IE, сама Windows отправляет другое сообщение о том, что мыши там нет.

Итак, небольшая гонка...

person Paulo Santos    schedule 18.01.2010
comment
Я не вижу этого другого сообщения, использующего spy++. И я пытаюсь захватить изображение веб-браузера и показать его в своем пустом окне. Это работает. Через изображение, которое я сделал, сообщение об отправке по-прежнему вызывает нестабильное зависание, даже если я делаю пустое окно и окно веб-браузера в одном и том же положении. - person Gohan; 18.01.2010