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

时间:2014-02-05 19:26:39

标签: 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)

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

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

我使用了ctypes

LPARAM的{​​{1}}参数将x和y组合在一个32位值中。

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

WM_LBUTTONDBLCLK

EDIT 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) ) 消息通常由Windows发布到指针下的窗口。桌面窗口具有 窗口,那就是那些“在指针下”的子窗口。如果您想要使用PostMessage API,您需要知道将在哪个窗口发布消息。

如果您不想打扰Windows层次结构,只需使用WM_LBUTTON*即可。然后,窗口将为您完成工作,最后将鼠标消息发布到正确的句柄。