【问题标题】:How to simulate desktop click at (x,y) position with python?如何用python模拟(x,y)位置的桌面点击?
【发布时间】:2014-02-05 19:26:38
【问题描述】:

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

【问题讨论】:

  • 您应该使用 SendInput Win32 API。
  • 你想点击的地方会显示什么?
  • 使用 ctypes 调用 SendInput。例如,请参阅 stackoverflow.com/questions/19288656/… 以获取伪造键盘。
  • 这也不起作用,我没有看到任何事情发生..
  • 你想点击的地方会显示什么?

标签: python winapi click desktop lparam


【解决方案1】:

【讨论】:

  • 我看过 pywinauto,它是一个非常有趣的工具,但是,它们仍然在相对于屏幕的绝对位置执行点击,并且不会向特定窗口发送点击消息。跨度>
  • @yasman 稍微更新了答案。现在你必须等到有人挑选出必要的部分并编写代码 sn-p 来满足你的需要。
  • 谢谢,我会自己试一试,看看能得到什么。
【解决方案2】:

以下代码适用于 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 将为您完成工作并最终将鼠标消息发布到正确的句柄。

【讨论】:

  • 你为什么使用三个不同的句柄来访问桌面,我不明白为什么简单地调用 win32gui.GetDesktopWindow() 不会返回我们需要的句柄?什么是 progman,然后是文件夹,然后是列表视图?
  • @yasman 你试过我的代码了吗?有用。如果要单击图标,则需要将消息发布到 SysListView 窗口,而不是桌面窗口。您可以使用 GetDesktopWindow,但最终还是会使用 FindWindow API 来获取 SysListView 句柄。
  • 我仍然没有得到的一件事是你的参数 110 + (65536*32) 它是如何工作的?
  • 它有效,谢谢!我在想 win32gui.GetDesktopWindow() 实际上将窗口检索到我期望的“桌面”,但显然在我正在寻找的桌面后面有一个完整的窗口层次结构,我想要的是在类名 SysListView32 下正如你提到的。但是,您的代码在我的机器上对我不起作用,Progman 窗口没有子窗口,我找到列表视图的方式是遍历桌面窗口的子窗口。不过,我仍然对 x 和 y 参数有问题..
  • x
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多