我正在尝试使用 SendMessage
将键盘输入发送到另一个窗口。我知道缺点,但我必须这样做,因为我必须发送几个键,而且我不能保证窗口会有焦点 - 所以当窗口没有焦点时这必须起作用。
我正在通过尝试将 key 发送到记事本窗口来对其进行测试。我尝试了以下变体,但没有一个奏效:
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)
最佳答案
当我写这个问题时,我明白 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)
所以答案是我在消息类型或消息内容方面没有做错任何事情,只是发往了错误的目的地。
关于python - 什么 SendMessage 用于将键直接发送到另一个窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5080777/