1

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

4

1 回答 1

3

好的,首先你必须知道如何打开 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是:

  • 定义StructuresMOUSEINPUTINPUT
  • 加载user32windll。
  • 设置argtypesuser32.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……如果最坏的情况发生,您可能需要退回到较低级别的技巧。

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

于 2012-12-22T00:02:58.893 回答