使用post / sendmessage做鼠标点击不起作用

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

我试过了

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

位置是100 * 0x10000 + 100 100x100等。我怀疑它是错的。 我尝试用0交换((int)Keys.LButton) ,没有用。 我尝试在lbuttondownthread.sleep之间lbuttondown lbuttonup (以及postmessage应该等待没有thread.sleep但是等等)我使用0x0200进行mousemove和0x0202进行左键按钮。

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

那是对的。 PostMessageSendMessage函数从未用于合成鼠标(或键盘)事件 。 他们有时可能会这样做,但这不是你应该依赖的东西,因为大多数时候他们都不会工作。

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

除了SendInput之外, mouse_event函数也作为一种合成鼠标事件的方式存在,但是正如链接文档所表明的那样,这个函数已被废弃,有利于SendInput 。 您应该始终更喜欢在新应用程序中使用SendInput

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

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