【问题标题】:Using post/sendmessage to do mouse clicks doesnt work [duplicate]使用 post/sendmessage 进行鼠标单击不起作用 [重复]
【发布时间】:2012-11-19 05:24:14
【问题描述】:

可能重复:
How to simulate Mouse Click in C#?

我试过了

Window = FindWindow(null, "untitled - Paint");
PostMessage(WindowToFind, WM_MOUSEMOVE, 0, location); 
PostMessage(WindowToFind, WM_LBUTTONDOWN, ((int)Keys.LButton), location);

位置是100 * 0x10000 + 100 for 100x100 等。我怀疑它错了。我尝试将((int)Keys.LButton)0 交换,但没有奏效。我尝试将thread.sleep 放在lbuttondownlbuttonup 之间(好吧,如果没有thread.sleep,邮件应该等待,但无论如何)我将0x0200 用于mousemove,0x0202 用于左键常量。

不知道为什么它根本不起作用。

【问题讨论】:

  • 要求窗口在前面并实际点击。我试图模拟它。 (我只是阅读代码,没有看到任何窗口的东西,所以我可能不正确)仍然,谢谢。

标签: c# sendmessage postmessage user32


【解决方案1】:

没错。 The PostMessage and SendMessage functions were never intended to synthesize mouse (or keyboard) events。他们可能有时会为此工作,但这不是你应该依赖的东西,因为大部分时间他们不会工作。

相反,您应该使用SendInput function 来正确合成鼠标事件。与其他 Win32 API 函数一样,您需要 P/Invoke 才能从 C# 调用它。这个定义可以从文档中手动生成,或者很容易找到elsewhere on the Internet。唯一棘手的部分是您需要声明适当的结构以及函数本身。

除了SendInput 之外,mouse_event function 也存在作为合成鼠标事件的一种方式,但正如链接文档所表明的那样,此功能已被SendInput 取代。您应该始终喜欢在新应用程序中使用SendInput

唯一的问题是您似乎试图将这些鼠标事件发送到一个不同的应用程序。这会带来一些问题,因为SendInput 只是将事件注入到键盘/鼠标流中。处理它们的应用程序将是具有前景窗口的应用程序。因此,您需要先将焦点设置到另一个窗口,并确保您不会与 UIPI 发生冲突。

您拥有的代码在另一个层面上相对脆弱:一旦您使用不同的名称保存文档,绘图窗口就会更改其名称。并且假设 Windows 9 不会将 Paint 重命名为其他名称 - 它以前发生过,该应用程序曾经被称为“Paintbrush”。希望这只是您想要完成的事情的一个示例。无论哪种方式,我都可能建议您研究更强大的自动化方法(例如,Microsoft UI Automation 框架),而不是盲目地注入输入。

【讨论】:

  • 啊,我只是在尝试用油漆。 sendinput 似乎需要关注,如果我误解了,请见谅。你能详细说明“强大的自动化方法”吗? “ui 自动化”似乎无关紧要,因为我读到它只是自动修改 ui ?
猜你喜欢
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
相关资源
最近更新 更多