python - 如何用python模拟桌面在(x,y)位置的点击?

标签 python winapi click desktop lparam

我正在尝试单击桌面上的某个位置,我正在使用带有 win32 api 的 python,我正在使用 python 32 位,但我的计算机是 64 位计算机。我相信 lParam 变量没有保存我期望的值,而且我对这个变量本身仍然有点困惑,假设我从 wintypes 导入它谁能告诉我如何使用它?为什么我下面的功能不起作用?

我有一个函数如下,这似乎不起作用:

def clickDesktop(x=0, y=0):

    # Get handle to desktop window
    desktop = win32gui.GetDesktopWindow()

    # Create variable lParam that contains the x-coordinate in  the low-order word while
    # the high-order word contains the y coordinate.
    lParam = y << 16 | x

    # Click at x, y in the desktop window
    win32gui.PostMessage(desktop, win32con.WM_LBUTTONDOWN, MK_LBUTTON, lParam)
    win32gui.PostMessage(desktop, win32con.WM_LBUTTONUP, 0, lParam)

最佳答案

以下代码适用于 Windows 7 上的 Python33。

我使用了 ctypes

WM_LBUTTONDBLCLKLPARAM 参数将 x 和 y 合并为一个 32 位值。

当我运行该代码时,它会打开位于桌面左上角的“我的电脑”图标(我的任务栏也在左侧,因此 x 的高值为 110)。

from ctypes import windll

WM_LBUTTONDBLCLK = 0x0203
MK_LBUTTON = 0x0001

if __name__=='__main__':
    hProgman = windll.User32.FindWindowW( "Progman", 0 )
    if hProgman != 0:
        hFolder = windll.User32.FindWindowExW( hProgman, 0, "SHELLDLL_DefView", 0 )
        if hFolder != 0:
            hListView = windll.User32.FindWindowExW( hFolder, 0, "SysListView32", 0 )
            if hListView != 0:
                windll.User32.PostMessageW( hListView, WM_LBUTTONDBLCLK, MK_LBUTTON,
                                            110 + (65536*32) )

编辑 WM_LBUTTON* 消息通常由 Windows 发布到指针下的窗口。桌面窗口窗口,也就是那些“在指针下”的子窗口。如果您想要使用 PostMessage API,您需要知道您将把消息发布到哪个窗口。

如果您不想理会 Windows 层次结构,只需使用 SendInput。然后 Window 将为您完成工作,并最终将鼠标消息发送到正确的句柄。

关于python - 如何用python模拟桌面在(x,y)位置的点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21586632/

相关文章:

c++ - 编辑后保留文件的旧时间戳

c++ - 通过检查其返回值作为 -32767 和 0x8000 来使用 GetAsyncKeyState() 有什么区别?

windows - 我们如何在delphi中获取键盘空闲时间

javascript - 禁用超链接左键单击但允许右键单击

python - 内置函数的 dill/pickle 问题

python - 如何将列表作为新行附加到 pandas 数据框

python - Python不检测单个字母,但是可以检测两个字母

jquery - d3 mouseout 改变所选元素的属性

javascript - 如果在数组中找到特定单词则运行函数

python - 使用 selenium 滚动网站的特定部分。