【问题标题】:How to mouseclick into other application?如何鼠标点击进入其他应用程序?
【发布时间】:2022-01-09 01:50:01
【问题描述】:

我需要发送 mouseclick down 和 mouseclick up 。我得到了意想不到的结果。如果我删除 mouseclick up 消息,则 mouseclick down 消息有效。应用程序内的按钮仍然按住按钮。它需要释放才能执行某些操作。但发布不起作用。在逐行测试 1 之后,我遵循 spy++ 的日志。我测试它只需要 2 条消息。 WM_LBUTTONDOWN 和 WM_LBUTTONUP。因为我看到按钮仍然按住。

  1. S WM_NCHITTEST xPos:1485 yPos:755
  2. R WM_NCHITTEST nHittest:HTCLIENT
  3. S WM_MOUSEACTIVATE hwndTopLevel:000504BA nHittest:HTCLIENT uMsg:WM_LBUTTONDOWN
  4. R WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE
  5. S WM_WINDOWPOSCHANGING lpwp:0000004553CCEA70
  6. R WM_WINDOWPOSCHANGING
  7. S WM_WINDOWPOSCHANGED lpwp:0000004553CCEA70
  8. R WM_WINDOWPOSCHANGED
  9. S WM_ACTIVATEAPP fActive:True dwThreadID:00000000
  10. R WM_ACTIVATEAPP
  11. S WM_NCACTIVATE fActive:True
  12. R WM_NCACTIVATE
  13. S WM_ACTIVATE fActive:WA_CLICKACTIVE fMinimized:False hwndPrevious:(null)
  14. S WM_IME_SETCONTEXT fSet:1 iShow:C000000F
  15. S WM_IME_NOTIFY dwCommand:IMN_OPENSTATUSWINDOW dwCommand:00000002 dwData:00000000
  16. R WM_IME_NOTIFY
  17. R WM_IME_SETCONTEXT
  18. S WM_SETFOCUS hwndLoseFocus:(null)
  19. R WM_SETFOCUS
  20. R WM_ACTIVATE
  21. S WM_SETCURSOR hwnd:000504BA nHittest:HTCLIENT wMouseMsg:WM_LBUTTONDOWN
  22. R WM_SETCURSOR fHaltProcessing:False
  23. P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:1240 yPos:697
  24. P WM_MOUSEMOVE fwKeys:MK_LBUTTON xPos:1240 yPos:697
  25. S WM_NCHITTEST xPos:1485 yPos:755
  26. R WM_NCHITTEST nHittest:HTCLIENT
  27. P WM_LBUTTONUP fwKeys:0000 xPos:1240 yPos:697
  28. S WM_CAPTURECHANGED hwndNewCapture:00000000
  29. 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 将其带到前台。

标签: c++ windows winapi


【解决方案1】:

根据文档,对于接收 WM_LBUTTONUP 消息的窗口,它必须先捕获鼠标输入。所以你必须让窗口以某种方式捕获鼠标输入。但我不推荐这种方法。

【讨论】:

  • 这不是文档所说的。此外,文档是指正常的输入处理。它没有说明程序发布虚假消息的影响。
  • @IInspectable 你可能是对的。对这个错误深表歉意。
  • 这个结论是错误的。窗口管理器确定应作为输入处理结果接收消息的窗口,然后将输入消息发布到相应窗口的输入队列。当消息被其他代码发布时,窗口管理器什么都不做
  • WM_LBUTTONUP 正在发布,但不是以其他程序可以接受的方式发布。
  • 一旦您停止使用常识,窗口管理器就不会解决问题。 Replaying input is not the same as reprocessing it 解释了输入处理的一些基础知识。当流氓应用程序开始发布虚假输入消息时,窗口管理器实际上无法做任何事情。这里的核心问题是,人们似乎严重低估了在游戏中作弊所需的技能数量。
猜你喜欢
  • 2017-06-13
  • 2013-03-24
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多