【问题标题】:why can't I send a PostMessage?为什么我不能发送 PostMessage?
【发布时间】:2018-06-11 04:25:27
【问题描述】:
PostMessage(FindWindow(NULL, TEXT("notepad")), WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(160, 140));

此代码无法发送LBUTTONDOWN,有什么问题吗?

我不确定.. 也许它可以发送LBUTTONDOWN 但位置错误

【问题讨论】:

  • 编辑您的问题以包含minimal reproducible example
  • 这家伙知道一两件事。他的帖子可能包含一些很好的建议:stackoverflow.com/a/28390315/4581301
  • 可能值得在这里添加 SendInput 接受 screen 坐标,因此您需要检索记事本的窗口矩形并将其考虑在内。
  • 每条语句调用一个 API 函数,并检查返回值是否有错误。如果有错误,请致电GetLastError() 了解详细信息并将其与失败的函数名称一起打印
  • 即使您成功发布消息,请记住,这将是“真实”输入处理的错误副本 - 您可能没有发布其他相关消息,GetCursorPos 将返回不连贯的数据等等。为了更好地模拟这些东西,请使用SendInput

标签: c++ winapi


【解决方案1】:
  1. 没有标题为"notepad" 的窗口。记事本窗口标题遵循模式 filename - Notepad
  2. FindWindow 返回NULL
  3. 因为PostMessage 的第一个参数为零,所以消息被传递到您的线程而不是记事本的窗口。

您应该始终检查 Windows API 函数的返回值。当失败原因不明显时,GetLastError() 的值会提供额外的线索。

【讨论】:

  • 记事本的窗口属于“记事本”。知道这应该会让你更近一步。另外,上次我查看时,文本本身存在于一个编辑控件中,它是记事本主窗口的 child。我想这也是你需要允许的。 Spy++ 会告诉你更多——你应该学会使用这个工具。但无论如何,如上所述,您可能应该改用SendInput()
  • @PaulSanders:使用类名不会让你更近一步。你不能像那样伪造输入。使用SendInput 可能是另一种选择。或 UI 自动化。在绝大多数情况下,当人们请求帮助伪造输入时,后者是规范的解决方案。
  • @IInspectable 当然,我在评论的最后提到了SendInput
  • @PaulSanders:当然,您忽略了 UI 自动化的首要考虑因素。在屏幕键盘之外,几乎没有理由使用SendInput
猜你喜欢
  • 2013-01-26
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
相关资源
最近更新 更多