如何在 Windows 中模拟 SHIFT+END 组合键

Posted

技术标签:

【中文标题】如何在 Windows 中模拟 SHIFT+END 组合键【英文标题】:How to simulate SHIFT+END key combination in Windows 【发布时间】:2013-11-12 14:17:55 【问题描述】:

我使用 keybd_event 函数模拟 SHIFT+END 组合键,但它不起作用:

keybd_event(VK_SHIFT,0,0,0);
keybd_event(VK_END,0,0,0);
keybd_event(VK_END,0,KEYEVENTF_KEYUP,0);
keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);

插入符号移动到行尾,但不选择文本(突出显示)。就像输入一个 END 键一样。 有人可以帮忙吗?非常感谢~


我已经解决了这个问题! 我使用 spy++ 来查找当我使用键盘发送键 Shift + End 时会发生什么,并且 我收到了这些消息:

WM_KEYDOWN nVirtKey:VK_SHIFT cRepeat:1 ScanCode:2A fExtended:0 fAltDown:0 fRepeat:0 fUp:0
WM_KEYDOWN nVirtKey:VK_END cRepeat:1 ScanCode:4F fExtended:1 fAltDown:0 fRepeat:0 fUp:0
WM_KEYUP nVirtKey:VK_END cRepeat:1 ScanCode:4F fExtended:1 fAltDown:0 fRepeat:1 fUp:1
WM_KEYUP nVirtKey:VK_SHIFT cRepeat:1 ScanCode:2A fExtended:0 fAltDown:0 fRepeat:1 fUp:1

当我运行上面的代码时,我收到了这些消息:

WM_KEYDOWN nVirtKey:VK_SHIFT cRepeat:1 ScanCode:0 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
WM_KEYUP nVirtKey:VK_SHIFT cRepeat:1 ScanCode:0 fExtended:0 fAltDown:0 fRepeat:1 fUp:1
WM_KEYDOWN nVirtKey:VK_END cRepeat:1 ScanCode:0 fExtended:1 fAltDown:0 fRepeat:0 fUp:0
WM_KEYUP nVirtKey:VK_END cRepeat:1 ScanCode:0 fExtended:1 fAltDown:0 fRepeat:1 fUp:1
WM_KEYDOWN nVirtKey:VK_SHIFT cRepeat:1 ScanCode:0 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
WM_KEYUP nVirtKey:VK_SHIFT cRepeat:1 ScanCode:0 fExtended:0 fAltDown:0 fRepeat:1 fUp:1

窗口在 VK_END 的 WM_KEYDOWN 消息之前获得 VK_SHIFT 的 WM_KEYUP 消息。 消息之间的区别在于“fExtended”的值。 当我使用键盘时,END 键的 fExtended 值为 1,而当我运行代码时值为 0。 所以我尝试将fExtended值设置为1,我找到了keybd_event函数的“dwFlags [in]”参数。 当我按如下方式运行代码时,组合键起作用:

keybd_event(VK_SHIFT,0x2A,0,0);
keybd_event(VK_END,0x4F,KEYEVENTF_EXTENDEDKEY | 0,0);
keybd_event(VK_END,0x4F,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0);
keybd_event(VK_SHIFT,0x2A,KEYEVENTF_KEYUP,0); 

【问题讨论】:

【参考方案1】:
UINT m_scanShift = MapVirtualKey(VK_SHIFT, 0);
UINT m_scanEnd   = MapVirtualKey(VK_END, 0);

keybd_event(VK_SHIFT, m_scanShift, 0, 0);
Sleep(10);
keybd_event(VK_END, m_scanEnd, 0, 0);
Sleep(10);
keybd_event(VK_END, m_scanEnd, KEYEVENTF_KEYUP, 0);
Sleep(10);
keybd_event(VK_SHIFT, m_scanShift, KEYEVENTF_KEYUP, 0);

【讨论】:

谢谢你的回答~不过好像不行,即使加上扫码和休眠时间~我猜可能有一个Windows API来实现“选择文本”操作~跨度> 【参考方案2】:

同时使用 shift VK_LSHIFT 和 VK_RSHIFT down 然后 VK_END 然后同时使用 SHIFT UP 左右同时对我有用

【讨论】:

以上是关于如何在 Windows 中模拟 SHIFT+END 组合键的主要内容,如果未能解决你的问题,请参考以下文章

hbuilderx 怎么连接到手机模拟器 教你如何正确连接

如何修复win10的windows功能

在 Windows 上检测 Java 中的 SHIFT 键时出现问题

无法使用 Win32::GuiTest 发送 shift-end

word文件中,如何把需要的部分全部选中?

在idea中怎么不能使用shift键全部选中?