可能的重复:
如何在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)
with 0
,没有用。我尝试把thread.sleep
之间lbuttondown
and lbuttonup
(好吧,postmessage 应该等待而不thread.sleep
但无论如何)我用0x0200
用于鼠标移动和0x0202
对于左按钮常量。
不知道为什么它根本不起作用。
这是正确的。The PostMessage and SendMessage函数从来没有打算合成鼠标(或键盘)事件. They might有时会为此而努力,但这不是您应该依赖的东西,因为大多数时候他们不会工作。
相反,您应该使用SendInput功能正确合成鼠标事件。与其他 Win32 API 函数一样,您需要 P/Invoke 才能从 C# 调用它。这个定义可以从文档中手动生成,或者很容易找到互联网上的其他地方。唯一棘手的部分是您需要声明适当的结构以及函数本身。
The mouse_event功能除了以下还存在SendInput
作为合成鼠标事件的一种方式,但正如链接文档所表明的那样,该函数已被废弃,以支持SendInput
。你应该总是更喜欢使用SendInput
在新的应用中。
唯一的问题是您似乎试图将这些鼠标事件发送到不同的应用。这会带来一些问题,因为SendInput
只需将事件注入键盘/鼠标流。处理它们的应用程序将是具有前台窗口的应用程序。因此,您需要首先将焦点设置到另一个窗口,并确保不会与 UIPI 发生冲突。
不过,您拥有的代码在另一个层面上相对脆弱:一旦您使用不同的名称保存文档,绘图窗口就会更改其名称。这假设 Windows 9 不会将 Paint 重命名为其他名称 - 以前也发生过这种情况,该应用程序曾经被称为“Paintbrush”。希望这只是您想要完成的事情的一个示例。无论哪种方式,我可能建议您研究更强大的自动化方法(例如,微软用户界面自动化框架)而不是盲目注入输入。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)