win32gui-除非窗口聚焦,否则无法发送消息


你好,我正在尝试创建一个简单的脚本,在窗口中键入字母A

在这种情况下,窗口为Old School Runescape。是的,这是一场比赛。

这是我使用的小代码。

import win32gui, win32ui, win32con, win32api
import time
if __name__ == "__main__":
window_name = "Old School RuneScape"
hwnd = win32gui.FindWindow(None, window_name)
win = win32ui.CreateWindowFromHandle(hwnd)
while True:
print("Sending")
win.SendMessage(win32con.WM_CHAR, ord('A'), 0)
time.sleep(2)

此代码适用于其他各种程序。然而,特别是对于这一点,除非游戏窗口处于焦点位置,否则它不会起作用。

我怀疑可能有一个内窗,因为这是一个游戏,所以我做了一点检查,发现有一个内窗。:

{'SunAwtCanvas': 1771602}

但是,当我尝试发送到主窗口/内部窗口时,它仍然不起作用。

我遵循了微软网站上的文档,并在Stackoverflow上进行了大量研究,以寻求一些帮助,但都无济于事。

有人知道可能是什么问题吗?

更新1
我尝试使用

win.PostMessage(win32con.WM_CHAR, 0x44, 0)

尽管如此,它只有在窗口聚焦时才起作用。

我用这个作为例子。但我是一个很好的

你需要使窗口激活

win32gui.SendMessage(handle, win32con.WM_ACTIVATE, win32con.WA_ACTIVE, 0)

这是我测试的代码

import time
import random
from time import sleep
import win32api, win32gui, win32con

def drawmouselocation(x,y,posss):
dc = win32gui.GetDC(0)
red = win32api.RGB(255, 0, 0)
for ii in range(10):
win32gui.SetPixel(dc, x+posss[0], y+posss[1], red)
for ofsy in range(10):
for ofsx in range(10):
win32gui.SetPixel(dc, x+posss[0]+ofsx, y+posss[1]+  ofsy, red)
time.sleep(0.01)


posss = [0,0]
num = 0
def callback(handle, param):
global num
global poss
posss = [580+random.randint(0,10),310+random.randint(0,10)]
s = win32gui.GetClassName(handle)
try:
if num == 0: #edit tis number for the right window
print(f'Current window: {handle}, {s}')
rect = win32gui.GetWindowRect(handle)
x = rect[0]
y = rect[1]
w = rect[2] - x
h = rect[3] - y
print("tLocation: (%d, %d)" % (x, y))
print("t    Size: (%d, %d)" % (w, h))

print("t   mouse click: (%d, %d)" % (posss[0],posss[1]))
drawmouselocation(x,y,posss)

tmp = win32api.MAKELONG(posss[0],posss[1])

win32gui.SendMessage(handle, win32con.WM_ACTIVATE, win32con.WA_ACTIVE, 0)
win32api.SendMessage(handle, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, tmp)
time.sleep(0.01)
win32gui.SendMessage(handle, win32con.WM_ACTIVATE, win32con.WA_ACTIVE, 0)
win32api.SendMessage(handle, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, tmp)

time.sleep(0.01)
win32gui.SendMessage(handle, win32con.WM_ACTIVATE, win32con.WA_ACTIVE, 0)
win32gui.PostMessage(handle, win32con.WM_KEYDOWN, win32con.VK_RETURN, int('0x1C0001',0))
win32gui.SendMessage(handle, win32con.WM_ACTIVATE, win32con.WA_ACTIVE, 0)
win32gui.PostMessage(handle, win32con.WM_KEYUP, win32con.VK_RETURN, int('0xC0000001',0))


except Exception:
print('Exception sending to {handle}, {s}')
num = num + 1

def send_the_keys(handle):
num = 0
win32gui.EnumChildWindows(handle, callback, 0)

def winEnumHandler( hwnd, ctx ):
if win32gui.IsWindowVisible( hwnd ):
winnn = win32gui.GetWindowText( hwnd )
if  "Rune" in winnn:
print ( hex( hwnd ), winnn)
window_id = win32gui.FindWindow(None, winnn)
send_the_keys(window_id)
if  "Oldchool" in winnn:
print ( hex( hwnd ), winnn)
window_id = win32gui.FindWindow(None, winnn)
send_the_keys(window_id)

def pressenter():                   
win32gui.EnumWindows( winEnumHandler, None )

pressenter();

使用python 3.7https://www.python.org/ftp/python/3.7.0/python-3.7.0-amd64.exe

和winpy for x64 python 3.7https://jztkft.dl.sourceforge.net/project/pywin32/pywin32/Build%20221/pywin32-221.win-amd64-py3.7.exe

最新更新