使用啥 SendMessage 将密钥直接发送到另一个窗口?
Posted
技术标签:
【中文标题】使用啥 SendMessage 将密钥直接发送到另一个窗口?【英文标题】:what SendMessage to use to send keys directly to another window?使用什么 SendMessage 将密钥直接发送到另一个窗口? 【发布时间】:2011-07-02 03:12:51 【问题描述】:我正在尝试使用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】:当我写下这个问题时,我了解到SendKeys
是生成键盘输入的正确方法,并且这是唯一适用于所有情况的方法。但是,我不能使用SendKeys
,因为我的程序正在运行的计算机将在我的程序运行时被积极使用,这意味着鼠标点击可以随时发生,这将改变窗口的焦点并让@ 987654323@开始将输入发送到错误的窗口。
我想知道的是为什么我的代码无法正常工作——我发送的消息类型是否有问题? 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)
所以答案是我在消息类型或消息内容方面没有做错任何事情,只是发送到了错误的目的地。
【讨论】:
+1 但请注意,以防其他人发生这种情况:在某些应用程序中,您必须使用PostMessage
而不是SendMessage
才能模拟VK_RETURN
才能工作。以上是关于使用啥 SendMessage 将密钥直接发送到另一个窗口?的主要内容,如果未能解决你的问题,请参考以下文章