在python中,有没有一种方法可以将单击事件发送到后台的窗口?

在python中,有没有一种方法可以将单击事件发送到后台的窗口?,python,android-emulator,mouseevent,bluestacks,Python,Android Emulator,Mouseevent,Bluestacks,因此,我正试图构建一个机器人来自动化手机游戏中的一些动作,我正在通过Bluestack在我的pc上运行 我的程序截取窗口的屏幕截图,在图像中查找某些按钮模板并返回它们的坐标 我现在希望能够在这些坐标处向窗口发送单击事件,但由于我还希望在机器人在后台运行时执行其他操作,因此我正在寻找一种方法,将鼠标事件直接发送到窗口(即使它在后台最小化),在我做其他事情或将窗口移到前台时,不影响鼠标的移动/不使其动画化。这可能吗?我了解到,您需要使用正确的库才能正常工作。我发现pynput工作得很好。除了您正在尝

因此,我正试图构建一个机器人来自动化手机游戏中的一些动作,我正在通过Bluestack在我的pc上运行

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


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

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

让我来帮你节省很多浏览所有不同库的时间:我建议使用pynput。你可以读到它。下面你可以找到我从这个网站复制的一段示例代码(如果它曾经离线):


我使用win32api在windws10上解决了这个问题

在Spy++中,我查看了单击Bluestack时出现的鼠标消息。 我发现我应该找到标题为“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)

这对我来说是有效的,即使窗口最小化到托盘。

基于Dmitry的回答。xy必须是相对于Bluestack窗口而不是屏幕的坐标

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)

如果您真的想自动化Bluestack,您可以使用adb(它可以完成指定的工作,比如单击按钮,即使在最小化窗口的情况下)
Ppadb(纯Python adb模块)用于实现自动化。ppadb也可以在mac和Linux中使用,但win32仅限于Windows。

据我从其文档中了解,pynput不允许您直接将事件发送到特定窗口,它只需单击指定位置。哦,我误解了您的问题。您仍然可以使用pynput暂时禁用用户输入,打开窗口,单击,再次最小化启用用户输入。但这并不理想,因为bot需要每分钟或soHi执行几秒钟的操作,谢谢您的回答。你能多发一点你的代码吗?我尝试过这个,但它对我不起作用,它不会给出任何错误,但也不会发送鼠标事件。
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)