我试过了
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
放在lbuttondown
和lbuttonup
之间(以及post postssssage应该等待thread.sleep
但是等等)我使用0x0200
进行mousemove和0x0202
左键按钮。
不知道为什么它根本不起作用。
答案 0 :(得分:3)
这是对的。 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
除了SendInput
之外还存在mouse_event
function作为合成鼠标事件的方法,但正如链接文档所表明的那样,此功能已被淘汰,有利于SendInput
。您应该始终更喜欢在新应用程序中使用SendInput
。
唯一的问题是您似乎正在尝试将这些鼠标事件发送到不同的应用程序。这会造成一些问题,因为{{1}}只是将事件注入键盘/鼠标流。处理它们的应用程序将是具有前台窗口的应用程序。因此,您需要先将焦点设置到另一个窗口,并确保不要与UIPI发生冲突。
您拥有的代码在另一个层面上相对脆弱,但是:只要您使用其他名称保存文档,Paint窗口就会更改其名称。并且假设Windows 9没有将Paint重命名为其他东西 - 之前发生过,该应用程序曾被称为“画笔”。希望这只是你想要完成的事情的一个例子。无论哪种方式,我可能会建议您研究更强大的自动化方法(例如Microsoft UI Automation框架),而不是盲目地注入输入。