我只有 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
结构本身具有 MOUSEINPUT
、KBDINPUT
和 HARDWAREINPUT
的联合,因此您还需要定义那些(尽管你可以只定义第一个并假装其他的不存在,因为第一个是你唯一需要的)。
因此,使用 ctypes
执行此操作的步骤是:
- 定义
Structure
sMOUSEINPUT
和INPUT
. - 加载
user32
windll。 - 设置
argtypes
对于user32.SendInput
。 - 创建您的第一个
MOUSEINPUT
实例,使用dwFlags= MOUSEEVENTF_LEFTDOWN
和INPUT
实例。 - 调用
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/