2

我正在尝试单击桌面上的某个位置,我正在使用带有 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)
4

2 回答 2

2

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

我用过ctypes

LPARAM用于WM_LBUTTONDBLCLK将 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 将为您完成工作,最后将鼠标消息发布到正确的句柄。

于 2014-02-06T17:50:37.927 回答