2

可能重复:
如何在 C# 中模拟鼠标单击?

我努力了

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

位置是100 * 0x10000 + 100等的100x100。我怀疑它错了。我试过用 交换,没有((int)Keys.LButton)用。0我尝试在和thread.sleep之间放置(好吧,postmessage 应该等待,但无论如何)我用于 mousemove 和左键常量。lbuttondownlbuttonupthread.sleep0x02000x0202

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

4

1 回答 1

4

这是正确的。和函数从未打算合成鼠标(或键盘)PostMessage事件SendMessage。他们有时可能会为此工作,但这不是你应该依赖的东西,因为大多数时候他们不会工作。

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

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

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

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

于 2012-11-30T23:37:11.350 回答