有没有办法在python中将点击事件发送到后台窗口?

fri*_*kai 8 python mouseevent android-emulator bluestacks

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

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

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

小智 7

基于德米特里的回答。x和y必须是相对于 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)
Run Code Online (Sandbox Code Playgroud)


小智 5

我在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)
Run Code Online (Sandbox Code Playgroud)

即使窗口最小化到托盘,这对我也有效。


小智 0

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

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

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)
Run Code Online (Sandbox Code Playgroud)