为什么win32api.SendMessage不能在某些应用程序中执行鼠标单击

2024-07-04 06:08:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是Windows操作系统,我试图在后台(非活动)应用程序上执行单击操作,而不将它们带到前台。 我已经成功地在Microsoft Paint中完成了(在最小化的Paint实例上绘制一个点),但由于某些原因,这似乎无法在基于Java的应用程序(RuneLite.exe)上运行,我正在为其编写此程序

一些补充资料:

  • Paint有很多子窗口,当我在一个特定的子窗口(类:Afx:00007FF758890000:8)上执行单击时,执行单击似乎只起作用。这是最内部的窗口
  • RuneLite窗口结构如下所示:
    • RuneLite(等级:SunAwtFrame)
      • 未知(类别:SunAwtCanvas)
        • 未知(SunAwtCanvas类)
  • 我试过使用上面三个窗口的手柄,但似乎都不起作用
  • 代码能够找到窗口的句柄,并且是正确的(使用Spy++检查)
  • 运行代码后,该窗口在任务栏中呈橙色闪烁,因此一定触发了某些事件
  • 我通过截屏窗口并使用油漆找到特定位置的坐标来确定坐标。(如果有更好的方法,请告诉我)
from pywinauto.application import Application

amount = 2
handles = []

def start_apps():
    for i in range(amount):
        a = Application()
        a.start("D:\\Users\\Arno\\AppData\\Local\\RuneLite\\RuneLite.exe")
        time.sleep(15)
        handle = a.window().child_window(class_name="SunAwtCanvas", found_index=1).handle # select the most inner window
        handles.append(handle)


def do_click(h, x, y):
    long_position = win32api.MAKELONG(x, y)  # simulate the mouse pointer and send it to the specified coordinates
    win32api.SendMessage(h, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position)  # simulate mouse press
    win32api.SendMessage(h, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, long_position)  # Simulate mouse up


start_apps()
print(handles)
time.sleep(20)
for h in handles:
    do_click(h, 450, 290)

Output of the code

有人知道为什么会发生这种情况,以及我如何着手解决它吗


Tags: the应用程序positionwindowexestarthandleslong

热门问题