【问题标题】:Is there a way to send a click event to a window in the background in python?有没有办法在python的后台向窗口发送点击事件?
【发布时间】:2019-12-11 12:28:34
【问题描述】:

因此,我正在尝试构建一个机器人来自动化我通过 Bluestacks 在我的电脑上运行的手机游戏中的一些操作。

我的程序截取窗口的屏幕截图,在图像中查找某些按钮模板并返回它们的坐标。

我现在希望能够在这些坐标处向窗口发送点击事件,但由于我还想在机器人在后台运行时做其他事情,所以我正在寻找一种发送鼠标的方法事件直接到窗口(即使它被最小化/在后台),而不会影响鼠标的移动,而我正在做其他事情或将窗口带到前台/取消最小化它。这可能吗?

【问题讨论】:

    标签: python android-emulator mouseevent bluestacks


    【解决方案1】:

    基于德米特里的回答。 xy 必须是相对于 Bluestacks 窗口而非屏幕的坐标。

    def click(x, y):
        hWnd = win32gui.FindWindow(None, "BlueStacks")
        lParam = win32api.MAKELONG(x, y)
    
        hWnd1= win32gui.FindWindowEx(hWnd, None, None, None)
        win32gui.SendMessage(hWnd1, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, lParam)
        win32gui.SendMessage(hWnd1, win32con.WM_LBUTTONUP, None, lParam)
    
    click(100,100)
    

    【讨论】:

      【解决方案2】:

      我在windws 10上使用win32api解决了这个问题。

      在 Spy++ 中,我查看了单击 Bluestacks 时出现的鼠标消息。 我发现我应该找到标题为“BlueStacks Android PluginAndroid”的bluestacks子窗口的hwnd。并向他们发送鼠标点击事件:

      lParam = win32api.MAKELONG(x, y)
      win32api.PostMessage(hWnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, lParam)
      win32api.PostMessage(hWnd, win32con.WM_LBUTTONUP, None, lParam)
      

      即使窗口最小化到托盘,这也适用于我。

      【讨论】:

      • 您好,感谢您的回答。你能发布更多的代码吗?我试过了,但它对我不起作用,它没有给出任何错误,但也没有发送鼠标事件。
      【解决方案3】:

      我了解到您需要使用正确的库才能使其正常工作。我发现 pynput 效果很好。除了您尝试执行的操作之外,它还可以在您的操作系统处理之前获取鼠标和键盘上的用户输入。

      让我帮助您节省大量浏览所有不同库的时间:我建议使用 pynput。你可以阅读它here。您可以在下面找到我从该网站复制的一段示例代码(如果它会离线):

      from pynput.mouse import Button, Controller
      
      mouse = Controller()
      
      # Read pointer position
      print('The current pointer position is {0}'.format(
          mouse.position))
      
      # Set pointer position
      mouse.position = (10, 20)
      print('Now we have moved it to {0}'.format(
          mouse.position))
      
      # Move pointer relative to current position
      mouse.move(5, -5)
      
      # Press and release
      mouse.press(Button.left)
      mouse.release(Button.left)
      
      # Double click; this is different from pressing and releasing
      # twice on Mac OSX
      mouse.click(Button.left, 2)
      
      # Scroll two steps down
      mouse.scroll(0, 2)
      

      【讨论】:

      • 据我从其文档中了解到,pynput 不允许您将事件直接发送到特定窗口,它只需单击指定位置。
      • 哦,我看错了你的问题。您仍然可以使用 pynput 暂时禁用用户输入,打开窗口,单击,再次最小化启用用户输入。
      • 这并不理想,因为机器人需要每分钟左右采取几秒钟的行动
      【解决方案4】:

      如果您真的想自动化 bluestacks,您可以使用 adb(它可以完成分配的工作,例如单击按钮,即使窗口已最小化)您可以使用 Ppadb(纯 Python adb 模块)用于自动化它。而且ppadb也可以在mac和Linux下使用,但是win32仅限于windows。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-12
        • 1970-01-01
        • 1970-01-01
        • 2021-08-24
        • 1970-01-01
        • 2014-03-19
        • 2021-02-17
        相关资源
        最近更新 更多