我只有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,因此您还需要定义它们(尽管您可以只定义第一个并假装其他不存在,因为第一个是您唯一需要的) .KBDINPUTHARDWAREINPUT
因此,执行此操作的步骤ctypes是:
- 定义
StructuresMOUSEINPUT和INPUT。 - 加载
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……如果最坏的情况发生,您可能需要退回到较低级别的技巧。
这是否足够,或者您需要帮助解决其中的某些特定部分吗?