【发布时间】:2022-01-09 01:50:01
【问题描述】:
我需要发送 mouseclick down 和 mouseclick up 。我得到了意想不到的结果。如果我删除 mouseclick up 消息,则 mouseclick down 消息有效。应用程序内的按钮仍然按住按钮。它需要释放才能执行某些操作。但发布不起作用。在逐行测试 1 之后,我遵循 spy++ 的日志。我测试它只需要 2 条消息。 WM_LBUTTONDOWN 和 WM_LBUTTONUP。因为我看到按钮仍然按住。
- S WM_NCHITTEST xPos:1485 yPos:755
- R WM_NCHITTEST nHittest:HTCLIENT
- S WM_MOUSEACTIVATE hwndTopLevel:000504BA nHittest:HTCLIENT uMsg:WM_LBUTTONDOWN
- R WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE
- S WM_WINDOWPOSCHANGING lpwp:0000004553CCEA70
- R WM_WINDOWPOSCHANGING
- S WM_WINDOWPOSCHANGED lpwp:0000004553CCEA70
- R WM_WINDOWPOSCHANGED
- S WM_ACTIVATEAPP fActive:True dwThreadID:00000000
- R WM_ACTIVATEAPP
- S WM_NCACTIVATE fActive:True
- R WM_NCACTIVATE
- S WM_ACTIVATE fActive:WA_CLICKACTIVE fMinimized:False hwndPrevious:(null)
- S WM_IME_SETCONTEXT fSet:1 iShow:C000000F
- S WM_IME_NOTIFY dwCommand:IMN_OPENSTATUSWINDOW dwCommand:00000002 dwData:00000000
- R WM_IME_NOTIFY
- R WM_IME_SETCONTEXT
- S WM_SETFOCUS hwndLoseFocus:(null)
- R WM_SETFOCUS
- R WM_ACTIVATE
- S WM_SETCURSOR hwnd:000504BA nHittest:HTCLIENT wMouseMsg:WM_LBUTTONDOWN
- R WM_SETCURSOR fHaltProcessing:False
- P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:1240 yPos:697
- P WM_MOUSEMOVE fwKeys:MK_LBUTTON xPos:1240 yPos:697
- S WM_NCHITTEST xPos:1485 yPos:755
- R WM_NCHITTEST nHittest:HTCLIENT
- P WM_LBUTTONUP fwKeys:0000 xPos:1240 yPos:697
- S WM_CAPTURECHANGED hwndNewCapture:00000000
- R WM_CAPTURECHANGED
#include <windows.h>
#include <iostream>
int main()
{
HWND hWnd = FindWindow("AppliationWindow", "Application1");
if(hWnd != NULL)
{
std::cout << "Found";
}else{
std::cout << "It's not found";
};
PostMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(1240, 697));
PostMessage(hWnd, WM_LBUTTONUP, 0, MAKELPARAM(1240, 697));
std::cin.get();
return 0;
}
【问题讨论】:
-
You can't simulate keyboard input with PostMessage。同样的原则也适用于鼠标输入。无论您遇到什么问题,这都不是解决方案。
-
@IInspectable 我不知道你的意思。在这个应用程序中,我可以毫无问题地发送击键。但这里的问题是,我需要在后台发送鼠标输入。 WM_LBUTTONUP 消息不起作用,而 WM_LBUTTONDOWN 起作用。我在运行我的应用程序时检查过。我看到与 spy++ 捕获相同的消息。
-
@IInspectable 我发现了。 WM_LBUTTONUP 有效。但行动不起作用。我添加了睡眠功能来检查。它推动和释放。但没有行动。它只需单击并释放。正是当该按钮单击新对话框窗口时才会出现。我在 lbuttondown 和 lbuttonup 之后再次检查 spy++ 没有其他消息。这里有什么问题?我尝试模拟的应用程序是基于统一应用程序的。
-
你不能这样做。如果需要模拟输入,请使用
SendInput。如果您需要自动化 UI,请使用 UI Automation。 -
@IInspectable 我测试 sendinput,它需要将应用程序带到前台。完成后如何将应用程序再次设置为后台?我知道用 SetForegroundWindow 将其带到前台。