Cla*_*diu 2 python winapi input pywin32
我正在尝试SendMessage将键盘输入发送到另一个窗口.我知道缺点,但我必须这样做,因为我必须发送几个键,我不能保证窗口将有焦点 - 所以当窗口没有焦点时这必须工作.
我正在通过尝试将密钥发送到记事本窗口来测试它.我尝试了以下变化,但没有一个有效:
def post_keys1(hwnd):
win32api.SendMessage(
hwnd, win32con.WM_KEYDOWN, ord('A'),
0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
win32api.SendMessage(
hwnd, win32con.WM_CHAR, ord('A'),
0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
win32api.SendMessage(
hwnd, win32con.WM_KEYUP, ord('A'),
0 + (0 << 8) + (ord('A') << 16) + (0xC0 << 24))
def post_keys2(hwnd):
win32api.PostMessage(
hwnd, win32con.WM_KEYDOWN, ord('A'),
0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
win32api.PostMessage(
hwnd, win32con.WM_CHAR, ord('A'),
0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
win32api.PostMessage(
hwnd, win32con.WM_KEYUP, ord('A'),
0 + (0 << 8) + (ord('A') << 16) + (0xC0 << 24))
def post_keys3(hwnd):
win32api.SendMessage(hwnd, win32con.WM_CHAR,
ord('A'), 0)
def post_keys4(hwnd):
win32api.PostMessage(hwnd, win32con.WM_CHAR,
ord('A'), 0)
def post_keys5(hwnd):
win32api.PostMessage(hwnd, win32con.WM_KEYDOWN, ord('A'), 0)
win32api.PostMessage(hwnd, win32con.WM_CHAR, ord('A'), 0)
win32api.PostMessage(hwnd, win32con.WM_KEYUP, ord('A'), 0)
def post_keys6(hwnd):
win32api.SendMessage(hwnd, win32con.WM_KEYDOWN, ord('A'), 0)
win32api.SendMessage(hwnd, win32con.WM_CHAR, ord('A'), 0)
win32api.SendMessage(hwnd, win32con.WM_KEYUP, ord('A'), 0)
Run Code Online (Sandbox Code Playgroud)
当我写这个问题时,我明白这SendKeys是生成键盘输入的正确方法,而且这是唯一适用于所有情况的方法.但是,我无法使用SendKeys,因为我的程序运行时将运行我的程序运行的计算机,这意味着可以随时发生鼠标单击,这将改变窗口的焦点并SendKeys开始发送输入到错误的窗口.
我想知道的是为什么特别是我的代码无法正常工作 - 我是否对我发送的消息类型做错了什么?Post与Send?应该WPARAM是什么?等等......答案可能是因为我将消息发送到记事本窗口,而不是记事本中找到的编辑控件 - 我怀疑它会起作用.
无论如何,我尝试向我希望它实际工作的应用程序发送输入,这最终起作用:
def send_input_hax(hwnd, msg):
for c in msg:
if c == "\n":
win32api.SendMessage(hwnd, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
win32api.SendMessage(hwnd, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
else:
win32api.SendMessage(hwnd, win32con.WM_CHAR, ord(c), 0)
Run Code Online (Sandbox Code Playgroud)
所以答案是我在消息类型或消息内容方面没有做任何错误,只是到了一个不正确的目的地.