我使用PostMessage只是点击看似有效的不同标签。但我尝试自动按下某些按钮,当运行此功能时,它会突出显示该按钮,就好像我将鼠标悬停在按钮上但没有点击一样。 我以为某种程度上按钮更改颜色使得布尔值为假,所以我添加了按钮颜色的异常,同时它会徘徊。没有区别,我不想使用SetCursorPos&使用SendInput模拟鼠标点击。我希望了解问题/问题我为什么不点击。
void click(const std::vector<uint_16>& x, const uint_16& y)
{
for(uint_8 i = 0; i < 5; i++)
{
if(content::MyClass().firstMatch(GetPixel(hdc, x[i], y)))
{
PostMessage(hwnd, WM_LBUTTONDOWN, 0, MAKELPARAM(x[i], y));
return;
}
}
if(content::MyClass().secondMatch(GetPixel(hdc, x[4], y)))
{
PostMessage(hwnd, WM_LBUTTONDOWN, 0, MAKELPARAM(x[4], y));
}
}
答案 0 :(得分:4)
您使用的解决方案不可靠,因为您在窗口上短路输入系统而没有专门针对您尝试按下的按钮。
至于您的代码当前没有工作的原因,您只需向窗口发送WM_LBUTTONDOWN
消息。由于大多数按钮都是WM_LBUTTONDOWN
和WM_LBUTTONUP
的组合,因此您的程序不会导致按钮单击方法激活。
在鼠标按下后添加PostMessage(hwnd, WM_LBUTTONUP, 0, MAKELPARAM(x[i], y));
将导致按钮单击进行注册。
将来作为一个更可靠的解决方案,专门针对窗口上的按钮并单击它,您可能需要查看BM_CLICK
PostMessage参数。使用它而不是尝试模拟鼠标单击更为正确,因为Windows将触发在使用鼠标按下并鼠标上发布命令时可能会忘记的事件。
一个例子:
int retVal = 0;
HANDLE hwndDialog;
HANDLE hwndButton;
/* First, see if the dialog box (titled "Inactivity Warning" ) is currently open. */
hwndDialog = FindWindow( 0, "Inactivity Warning" );
if ( hwndDialog == 0 ) return;
/* Now get a handle to the "Resume" button in the dialog. */
hwndButton = FindWindowEx( hwndDialog, 0, 0, "Resume" );
/* After making sure that the dialog box is the active window, click "Resume". */
retval = SetActiveWindow( hwndDialog );
/* converted from SendMessage. */
retval = PostMessage( hwndButton, BM_CLICK, 0, 0 );
来源found Here,由我转换自VB。
有关输入系统Here is a good article的进一步阅读 Blog Post by Raymond Chen详细介绍了这些命令及其注意事项。