使用啥 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@开始将输入发送到错误的窗口。

我想知道的是为什么我的代码无法正常工作——我发送的消息类型是否有问题? PostSendWPARAM 应该是什么?等等......答案可能是因为我将消息发送到记事本窗口,而不是在记事本中找到的编辑控件 - 我怀疑这会起作用。

无论如何,我尝试将输入发送到我希望它实际运行的应用程序,这最终成功了:

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 将密钥直接发送到另一个窗口?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JavaScript 将 pdf 文件直接发送到打印机?

如何通过gmail将链接直接发送到本地服务器文件

将数据帧作为镶木地板文件直接发送到保管箱

如何将CSV文件直接发送到FTP服务器

从 Winforms 应用程序发送全局击键/伪造全局热键

刷新按钮/ F5在javascript中有window.onbeforeunload时直接发送到控制器(mvc)