Winapi 如何模拟从一个窗口到另一个窗口的mousemove事件?

Winapi 如何模拟从一个窗口到另一个窗口的mousemove事件?,winapi,messaging,sendmessage,Winapi,Messaging,Sendmessage,我试图创建一个空窗口,该窗口在WinProc中处理WM_MOUSEMOVE消息: case WM_MOUSEMOVE: { HWND otherHwnd = HWND(0x000608FC); POINT pt = {LOWORD(lParam), HIWORD(lParam)}; ClientToScreen(otherHwnd, &pt); PostMessage(otherHwnd, WM_TIMER, WP

我试图创建一个空窗口,该窗口在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中悬停hyberlink,但结果是hyberlink只能在很短的时间内显示为悬停样式,然后它变为正常,然后再次悬停,然后正常。 在www.amazon.com上,当我模拟悬停链接(“今日交易”)时,链接正在闪烁

我认为有一个更好的方法可以做到这一点,即使IE窗口被其他一些窗口覆盖,它也可以使IE与MouseeEvent一起工作。等待最佳解决方案~ 奥兹

上面是我真正悬停链接时的spy++日志。 模拟结果与真实信息一致

<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
000608FC S WM_SETCURSOR hwnd:000608FC nHittest:HTCLIENT wmousemg:WM_MOUSEMOVE
000608FC R WM_设置光标fHaltProcessing:错误
000608FC P WM_鼠标移动键:0000 xPos:406 yPos:50
000608FC P WM_定时器,时间间隔:4096 tmprc:00000000
000608FC S WM_NCHITTEST XPO:520 YPO:283
000608FC R WM\U NCHITTEST NHITEST:HTCLIENT
000608FC S WM_NCHITTEST XPO:520 YPO:283
000608FC R WM\U NCHITTEST NHITEST:HTCLIENT
000608FC S WM_NCHITTEST XPO:520 YPO:283
000608FC R WM\U NCHITTEST NHITEST:HTCLIENT
000608FC S WM_NCHITTEST XPO:520 YPO:283
000608FC R WM\U NCHITTEST NHITEST:HTCLIENT
000608FC S WM_设置光标hwnd:000608FC nHittest:HTCLIENT wMouseMsg:WM_鼠标移动
000608FC R WM_设置光标fHaltProcessing:错误
000608FC P WM_鼠标移动键:0000 xPos:406 yPos:50
000608FC P WM_定时器,时间间隔:4096 tmprc:00000000
000608FC S WM_NCHITTEST XPO:520 YPO:283
000608FC R WM\U NCHITTEST NHITEST:HTCLIENT
000608FC S WM_NCHITTEST XPO:520 YPO:283
000608FC R WM\U NCHITTEST NHITEST:HTCLIENT
000608FC S WM_NCHITTEST XPO:520 YPO:283
000608FC R WM\U NCHITTEST NHITEST:HTCLIENT
000608FC S WM_NCHITTEST XPO:520 YPO:283
000608FC R WM\U NCHITTEST NHITEST:HTCLIENT
000608FC S WM_设置光标hwnd:000608FC nHittest:HTCLIENT wMouseMsg:WM_鼠标移动
000608FC R WM_设置光标fHaltProcessing:错误
000608FC P WM_鼠标移动键:0000 xPos:406 yPos:50
000608FC S WM_NCHITTEST XPO:520 YPO:283
000608FC R WM\U NCHITTEST NHITEST:HTCLIENT
000608FC P WM_定时器,时间间隔:4096 tmprc:00000000
000608FC S WM_NCHITTEST XPO:520 YPO:283
000608FC R WM\U NCHITTEST NHITEST:HTCLIENT
000608FC S WM_NCHITTEST XPO:520 YPO:283
000608FC R WM\U NCHITTEST NHITEST:HTCLIENT
000608FC S WM_NCHITTEST XPO:521 YPO:281
000608FC R WM\U NCHITTEST NHITEST:HTCLIENT

您的代码没有问题。问题在于Windows发送消息的方式

当您移动鼠标时,Windows会向屏幕上的每个窗口发送消息。因此,每当您向IE windows句柄发送
WM_MOUSEMOVE
消息时,windows本身就会发送另一条消息,告诉您鼠标不在那里


这是一个小竞赛…

这是因为IE调用WindowFromPoint()来获取前景窗口,如果结果不是你的IE窗口,它知道你的鼠标不在那里。一个可能的解决方案是挂接API

我无法使用spy++看到另一条消息。我试图捕捉Webbrowser的图片,并在我的空窗口中显示它,它工作了。通过我拍摄的图片,发送消息仍然使不稳定的悬停,即使我使空窗口和Webbrowser窗口处于同一位置。