【问题标题】:SendMessage C++ Right mouse button doesn't work left mouse button works?SendMessage C++ 鼠标右键不起作用 鼠标左键起作用吗?
【发布时间】:2020-03-09 15:11:27
【问题描述】:

我想使用 SendMessage 来完成我的部分远程控制程序。案例我认为它会控制计算机程序而不使其获得焦点。

这是我的演示。我使用 windows mspaint 来测试它。当我发布“向左按钮向下”时它可以工作,所以我确定我的 HWND 是正确的(由 spy++ 或一些类似工具获得的绘图区域句柄)。它在我的 mspaint 中的“绘图区域”中绘制了一个点。 但是当我选择一种颜色并运行以下代码时。它不起作用。在同一个 mspaint 程序上,我的绘图区域没有任何反应。

这是我的代码:

    #include <stdio.h>
    #include <Windows.h>

    int main(){
        HWND hwnd;
        printf("Please input your handle\n");
        scanf("%d", &hwnd); 
        int x = 100, y = 100;
        //int right = SendMessageA(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(x, y)); //It works
        int wrong = SendMessageA(hwnd, WM_RBUTTONDOWN, MK_RBUTTON, MAKELPARAM(x, y));   //It doesn't work

        printf("%d", wrong);
        printf("%d", GetLastError());
        return 0;
    }

我很困惑,因为这两行非常相似。 mspaint 有什么 bug 吗?

【问题讨论】:

  • 我确定我可以用右键在绘图区画一些东西,而不是设置错误的白色。
  • 您不能以这种方式伪造输入。如果您想伪造输入,请致电SendInput
  • 并且Sendmessage函数返回零,表示成功完成。
  • @David Heffernan 但是为什么呢? SendInput 会获得焦点吗?
  • 1.如果你想伪造输入,你必须使用SendInput。 2. SendInput 将消息放入具有输入焦点的线程的队列中。一旦你理解了这两个陈述的后果,你可能已经准备好重新考虑你的目标了。这个问题每周都会在这里被问很多次。通过一些研究,您会看到我们一次又一次地给出相同的答案。也许这会对你有所帮助。

标签: c++ windows winapi sendmessage


【解决方案1】:

我很困惑,因为这两行非常相似。是否有任何错误 在 mspaint 中?

这两行代码可以成功执行,它们确实会向目标窗口发送WM_LBUTTONDOWNWM_RBUTTONDOWN 消息。我可以通过定位自己创建的窗口应用程序并在其中监视鼠标消息来确认这一点。所以可能差异取决于 mspaint 应用程序如何处理鼠标左键和右键单击。

以下代码适用于我的左右鼠标按钮。你可以试一试。

int x = 100, y = 100;

// Left mouse button click
int lResult = SendMessageA(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(x, y)); 
Sleep(500);
lResult = SendMessageA(hwnd, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(x, y));

x += 10;
// Right mouse button click
int rResult = SendMessageA(hwnd, WM_RBUTTONDOWN, MK_RBUTTON, MAKELPARAM(x, y));   
Sleep(500);
rResult = SendMessageA(hwnd, WM_RBUTTONUP, MK_RBUTTON, MAKELPARAM(x, y));

printf("Done.");

以上代码的测试结果:

注意:正如其他社区已经指出的那样,使用SendInput 而不是SendMessage合成击键、鼠标动作和按钮点击

【讨论】:

  • 是的,是mspaint的问题。我尝试添加 WM_BUTTONUP 函数,它可以工作。
  • @lyr:不。问题是你的代码和你关于系统应该如何运行的假设。你这样做是不对的。任何正确实现的 Windows 应用程序都不允许对您伪造输入的粗略尝试做出响应。因为you can't simulate keyboard input with PostMessage。您的方法从根本上存在缺陷。选择一种不是的方法,例如 UI 自动化。
猜你喜欢
  • 2014-06-14
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多