python - 什么 SendMessage 用于将键直接发送到另一个窗口?

标签 python winapi input pywin32

我正在尝试使用 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 还是 SendWPARAM 应该是什么?等等...答案可能是因为我将消息发送到记事本窗口,而不是发送到记事本中的编辑控件 - 我怀疑这会起作用。

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

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/

相关文章:

python - Pandas 数据框分组求和

Python - 读取特定的文本行

python - 获取 ImportError : libcublas. so.9.0:无法打开共享对象文件:没有这样的文件或目录 - 降级 TF 版本不起作用

最初未绘制组合框下拉列表

javascript - 我有一个输入类型文件列表,它仅接受图像..添加图像时如何查看图像?

JQuery 从 <td>&lt;input&gt; 之前的单元格 <td> 获取值,jsfiddle

c - 将 scanf 与通过引用传递的结构一起使用

python - Psycopg2 错误信息

multithreading - WaitForSingleObject while debugging(调试期间一般缓慢)

windows - RegSvr32 退出代码文档?