使用 win32api keybd_event 选择文本

Posted

技术标签:

【中文标题】使用 win32api keybd_event 选择文本【英文标题】:Select text with win32api keybd_event 【发布时间】:2020-01-07 11:17:41 【问题描述】:

我正在尝试创建一种方法来使用以下组合键选择记事本文件的文本内容:CTRL+END 然后 SHIFT+HOME

我有以下代码来按下、按住和释放一系列键:

import win32api
import win32con
import win32gui
import time

def keyboard_press_hold_release(*keys):
    for k in keys:
        win32api.keybd_event(VK_CODE[k], 0, 0, 0)
        time.sleep(.05)
    for k in keys:
        win32api.keybd_event(VK_CODE[k], 0, win32con.KEYEVENTF_KEYUP, 0)
        time.sleep(.1)

并调用它来组合 CTRL+END 和 SHIFT+HOME:

keyboard_press_hold_release('ctrl', 'end')
keyboard_press_hold_release('shift', 'home')

结果是 CTRL+END 命令有效,但 SHIFT+HOME 没有选择文本,只需将光标移动到行首。

怎么了?

【问题讨论】:

不要使用keybd_event。它的文档非常清楚地表明输入伪造的正确 API 是SendInput。但不要伪造输入。使用 UI 自动化。 顺便说一句,Ctrl+A 是一个快捷键。 @DavidHeffernan 你对 UI 自动化库有什么建议吗? @ipaleka,这个解决方案的真正用途不会是记事本,而是另一个不支持Ctrl+A行为的应用程序。 好的。另一个顺便说一句:您需要Ctrl + Shift + Home 才能在以Ctrl + End 结尾后选择所有文本。但是它错过了解释为什么您的 line 未被选中... 【参考方案1】:

您可以为此目的使用keyboard 模块。这是一个例子:

import keyboard
import time

time.sleep(5)     #You need some wait to switch to your window after executing

keyboard.press_and_release("ctrl+end")
keyboard.press_and_release("shift+home")

如果 Shift+Home 对您不起作用,那么您可以使用 Ctrl+A.

keyboard.press_and_release("ctrl+a")

【讨论】:

我也有同样的行为。谢谢你的尝试。

以上是关于使用 win32api keybd_event 选择文本的主要内容,如果未能解决你的问题,请参考以下文章

Python win32api keybd_event alt 键卡住

请用Python如何模拟键盘操作

c++ win32编程问题

Delphi模拟win+tab按键效果

C#中调用user32.dll库的keybd_Event函数,操作键盘

想要使用 windows api 从键盘获取输入