我只有python 2.6。我可以在不使用外部库的情况下做到这一点吗?我只想在光标当前所在的任何位置执行左键单击。
1 回答
好的,首先你必须知道如何打开 user32 windll ctypes
,这是微不足道的:
from ctypes import *
user32 = windll.user32
接下来,您要调用的 Win32 函数可能是SendInput,尽管您可能希望查看mouse_event
并可能SendMessage
(以及 WM_* 消息对应于鼠标单击的文档)进行比较和对比。
假设您使用SendInput
,您将先发送一个,MOUSEEVENTF_LEFTDOWN
然后发送一个MOUSEEVENTF_LEFTUP
,除 0 之外的所有参数都为 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
)。 - 创建您的第二个
MOUSEINPUT
实例,使用dwFlags= MOUSEEVENTF_LEFT
,以及与之配套的INPUT
实例。 - 再打电话
user32.SendInput()
。
最后一点:在 Vista 及更高版本上,您必须具有正确的“完整性级别”才能执行此操作。例如,普通应用程序无法将点击发送到“提升的”应用程序(例如,安装程序)。希望这对您来说不是问题。如果是这样,您需要阅读 UIPI 和 UAC……如果最坏的情况发生,您可能需要退回到较低级别的技巧。
这是否足够,或者您需要帮助解决其中的某些特定部分吗?