【问题标题】:Is there a way to invoke a leftclick in python?有没有办法在 python 中调用左键?
【发布时间】:2012-12-21 23:43:12
【问题描述】:

我只有 python 2.6。我可以在不使用外部库的情况下做到这一点吗?我只想在光标当前所在的位置单击鼠标左键。

【问题讨论】:

  • 首先,你有 PyWin32,还是算作“外部库”?其次,您是否希望在“将相同的 Windows 消息发送到将接收点击的窗口”级别模拟鼠标点击,或者您是否也希望能够欺骗较低级别的东西?
  • 嗨,我刚刚检查了我没有 pywin32。至于事件,我不会使用它们,但我需要窗口来接收点击事件,就像我点击它一样。所以不确定这是否需要较低级别的东西?
  • “事件”这个词在 Windows 术语中有点含糊,但忘记这一点吧。如果您只是想欺骗被单击的窗口,而不关心其他任何事情,则不需要较低级别的东西。这很好,因为那会很痛苦。

标签: python windows automation mouse ctypes


【解决方案1】:

好的,首先你要知道如何通过ctypes打开user32windll,也就是trivial

from ctypes import *
user32 = windll.user32

接下来,您要调用的 Win32 函数可能是 SendInput,尽管您可能想查看 mouse_event 和可能的 SendMessage(以及 WM_* 消息对应于鼠标单击的文档)以进行比较和对比。

假设您使用SendInput,您将发送一个MOUSEEVENTF_LEFTDOWN,然后发送一个MOUSEEVENTF_LEFTUP,除了dwFlags之外的所有参数都为0。

那么,你怎么称呼它?好吧,这里是 C API:

UINT WINAPI SendInput(
  _In_  UINT nInputs,
  _In_  LPINPUT pInputs,
  _In_  int cbSize
);

LPINPUT 表示您有一个指向 INPUT 结构数组的指针。由于INPUT 结构本身具有MOUSEINPUTKBDINPUTHARDWAREINPUT 的联合,因此您还需要定义它们(尽管您可以只定义第一个并假装其他没有存在,因为第一个是您唯一需要的)。

因此,使用ctypes 执行此操作的步骤是:

  • MOUSEINPUTINPUT 定义Structures。
  • 加载user32windll。
  • argtypes 设置为user32.SendInput
  • 创建您的第一个 MOUSEINPUT 实例,使用 dwFlags= MOUSEEVENTF_LEFTDOWN 和与之配套的 INPUT 实例。
  • 致电user32.SendInput(1, [myinput], len(INPUT))user32.SendInput(1, addressof(myinput), len(INPUT)) 或其他任何方式(取决于您如何定义argtypes)。
  • 创建您的第二个 MOUSEINPUT 实例,使用 dwFlags= MOUSEEVENTF_LEFT 和与之配套的 INPUT 实例。
  • 再次致电user32.SendInput()

最后一点:在 Vista 及更高版本上,您必须具有正确的“完整性级别”才能执行此操作。例如,普通应用程序无法将点击发送到“提升”应用程序(例如,安装程序)。希望这对您来说不是问题。如果是,您需要阅读 UIPI 和 UAC……如果最坏的情况发生,您可能需要退回到较低级别的技巧。

这就够了,或者您需要帮助解决其中的某些特定部分吗?

【讨论】:

  • 谢谢,这很有帮助。我最终使用了 ctypes.windll.user32.mouse_event(MOUSEEVENTF_CLICK, 0, 0, 0, 0),这和 SendInput 有什么区别?我还没有尝试过您的方法,但是在第二个答案中,我尝试了他的 SendInput 但它有诸如指针(x)之类的东西,它返回了未定义的错误。 stackoverflow.com/questions/2964051/python-win32-simulate-click
  • 好吧,SendInput 可以做mouse_event 做不到的事情,但你不在乎。所以唯一真正的区别是mouse_event 被“取代”,可能会被弃用并最终被删除。只要您预计不需要在不更改任何代码的情况下支持 Windows 9 或 10,就可以了。
  • 非常感谢,感谢您的详细回复。如果我将来需要进行更改,将使用它。圣诞快乐 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
  • 2012-10-28
  • 1970-01-01
相关资源
最近更新 更多