PostMessage没有点击按钮

PostMessage not clicking buttons

本文关键字:按钮 PostMessage      更新时间:2023-10-16

我玩了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));
    }
}

您正在使用的解决方案是不可靠的,因为您正在短路窗口上的输入系统,而不是专门针对您要按的按钮。

至于你的代码当前不工作的原因,你只发送一个WM_LBUTTONDOWN消息到窗口。由于大多数按钮工作的WM_LBUTTONDOWNWM_LBUTTONUP的组合,您的程序不会导致按钮点击方法激活。

鼠标下压后加入PostMessage(hwnd, WM_LBUTTONUP, 0, MAKELPARAM(x[i], y));会导致按键点击注册

在未来,作为一个更可靠的解决方案,将专门针对窗口上的按钮并单击它,您可能需要查看BM_CLICK PostMessage参数。使用这个而不是试图模拟鼠标点击是更正确的,因为窗口将触发事件,否则可能会被遗忘,当使用鼠标向下和鼠标向上post命令。

一个例子:

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 ); 

源代码在这里,由我从VB转换而来。

关于输入系统的进一步阅读,这里有一篇很好的文章。
Raymond Chen的一篇博文详细介绍了这些命令及其注意事项。