使用什么SendMessage发送键盘输入到另一个窗口?
我正在尝试使用 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)
1 个回答
7
当我写这个问题的时候,我知道 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)
所以答案是,我在消息类型或消息内容上并没有做错,只是发送到了错误的地方。