PyWin32 postMessage или SendMessage не будут отправлять нажатия клавиш без фокусировки окна на BlueStacks

#python #pywin32 #sendmessage #postmessage #hwnd

Вопрос:

Я могу заставить свой код работать, если окно находится в фокусе. Однако, если я протестирую это в Блокноте или других программах, это работает просто отлично. Я использую тот же метод для имитации щелчков мыши без фокуса. Он просто не хочет отправлять нажатия клавиш без фокусировки окна.

Я пробовал использовать как SendMessage, так и postMessage, и мой HWND-это дочернее окно, которое принимает сообщение (я также пытался спуститься по дереву и использовать больше дочерних HWND).

У кого-нибудь есть обходной путь? Я открыт для использования различных библиотек, я просто не хочу фокусировать окно.

 import win32api, win32con, win32gui, win32ui 
import time

def send_input_hax(msg,pycwnd):
    for c in msg:
        if c == "n":
            pycwnd.SendMessage(win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
            pycwnd.SendMessage(win32con.WM_KEYUP, win32con.VK_RETURN, 0)
        else:
            pycwnd.SendMessage(win32con.WM_CHAR, ord(c), 0)

def click(x,y,pycwnd):
    lParam = win32api.MAKELONG(x,y)
    pycwnd.SendMessage(win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, lParam);
    pycwnd.SendMessage(win32con.WM_LBUTTONUP, 0, lParam);

def get_whndl():
    whndl = win32gui.FindWindowEx(0, 0, None, 'BlueStacks')
    return whndl

def make_pycwnd(hwnd):       
    PyCWnd = win32ui.CreateWindowFromHandle(hwnd)
    return PyCWnd

hwnd = win32gui.FindWindow(None, 'BlueStacks')
whndl = get_whndl()

def callback(hwnd, hwnds):
    if win32gui.IsWindowVisible(hwnd) and win32gui.IsWindowEnabled(hwnd):
        hwnds[win32gui.GetClassName(hwnd)] = hwnd
    return True

hwnds = {}
win32gui.EnumChildWindows(whndl, callback, hwnds)
whndl = hwnds['plrNativeInputWindowClass']
pycwnd = make_pycwnd(whndl)

time.sleep(5)
send_input_hax('red')
 

Комментарии:

1. Предполагается, что вы должны использовать SendInput для синтеза ввода с клавиатуры. Возможно, вам также придется использовать SetFocus, чтобы установить фокус на окно, которое принимает входные данные

2. Да, я пробовал использовать SetFocus, чтобы временно запустить его, и это работает. Однако, если я печатаю или нажимаю во время работы, программа будет отправлять другие нажатия клавиш в программу. Цель состоит в том, чтобы запустить его, в то время как другие задачи можно выполнять на компьютере.

3. К сожалению, Windows работает не так. Может быть только одно приложение/окно, которое имеет фокус клавиатуры. По крайней мере, номинально. может быть, есть какие-то странные трюки, которые вы могли бы попробовать, но я в целом уверен, что это невозможно. Однако вы могли бы узнать о запуске программы в отдельном сеансе входа в систему.