python - 有没有办法在 python 中调用左键单击?

标签 python windows automation mouse ctypes

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

最佳答案

OK,首先你要知道如何通过ctypes打开user32 windll,也就是trivial :

from ctypes import *
user32 = windll.user32

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

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

那么,你怎么调用它呢?那么,这是 C API:

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

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

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

  • 定义 Structure s MOUSEINPUTINPUT .
  • 加载 user32 windll。
  • 设置argtypes对于 user32.SendInput
  • 创建您的第一个 MOUSEINPUT 实例,使用 dwFlags= MOUSEEVENTF_LEFTDOWNINPUT 实例。
  • 调用 user32.SendInput(1, [myinput], len(INPUT))user32.SendInput(1, addressof(myinput), len(INPUT))或其他(取决于您如何定义 argtypes)。
  • 使用 dwFlags= MOUSEEVENTF_LEFT 创建您的第二个 MOUSEINPUT 实例,以及与之配套的 INPUT 实例。
  • 再次调用 user32.SendInput()

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

这就够了吗,还是您需要这方面的某些特定部分的帮助?

关于python - 有没有办法在 python 中调用左键单击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13998610/

相关文章:

vb.net - 无法使用 AutoIt 从 Windows 窗体的下拉列表中选择值

python - Python打印的区别

python - 不同大小数组的 Numpy 运算

c++ - 如何使用 Windows 套接字查找 : number of bytes in output buffer pending send, 但尚未传输到电线上?

windows - 如何在 Windows 批处理文件中包含带有多行 var 的回车符?

javascript - Protractor - 比较 2 个数组的差异

jsp - JSP 多语言化自动化

python - 在 Python 中使用 Matplotlib 缩放 y 轴

python - 如何在 python 中将所有负数更改为零?

Windows 批处理脚本将 run_dt=1/3/2015 拆分为 "/"