在 windows C++ 中模拟选择
simulate selection in windows C++
我的记事本里有这个:
hello
我想使用 Windows' keybd_event
函数在 C++ 中模拟 selecting。
这是我的代码:
keybd_event(VK_SHIFT, 0, 0, 0);
for (size_t i = 0; i < 5; i++)
{
keybd_event(VK_LEFT, 0, 0, 0);
keybd_event(VK_LEFT, 0, KEYEVENTF_KEYUP, 0);
}
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
但是在我 运行 之后,它什么都没有 select,它只是转到文件的开头。为什么这不起作用?
添加 KEYEVENTF_EXTENDEDKEY 将 select 正确。
https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-keybdinput#members
#include <windows.h>
void main()
{
Sleep(2000);
keybd_event(VK_SHIFT, MapVirtualKey(VK_SHIFT, 0), KEYEVENTF_EXTENDEDKEY, 0);
for (size_t i = 0; i < 5; i++)
{
keybd_event(VK_LEFT, 0, 0, 0);
keybd_event(VK_LEFT, 0, KEYEVENTF_KEYUP, 0);
Sleep(20);
}
keybd_event(VK_SHIFT, MapVirtualKey(VK_SHIFT, 0), KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
}
在keybd_event中使用VK_SHIFT,存在shift无法释放的问题,建议大家使用SendInput而不是keybd_event。
对于higher-level操作,我也推荐你使用UI Automation.
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendinput
https://docs.microsoft.com/en-us/windows/win32/winauto/entry-uiauto-win32
我的记事本里有这个:
hello
我想使用 Windows' keybd_event
函数在 C++ 中模拟 selecting。
这是我的代码:
keybd_event(VK_SHIFT, 0, 0, 0);
for (size_t i = 0; i < 5; i++)
{
keybd_event(VK_LEFT, 0, 0, 0);
keybd_event(VK_LEFT, 0, KEYEVENTF_KEYUP, 0);
}
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
但是在我 运行 之后,它什么都没有 select,它只是转到文件的开头。为什么这不起作用?
添加 KEYEVENTF_EXTENDEDKEY 将 select 正确。
https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-keybdinput#members
#include <windows.h>
void main()
{
Sleep(2000);
keybd_event(VK_SHIFT, MapVirtualKey(VK_SHIFT, 0), KEYEVENTF_EXTENDEDKEY, 0);
for (size_t i = 0; i < 5; i++)
{
keybd_event(VK_LEFT, 0, 0, 0);
keybd_event(VK_LEFT, 0, KEYEVENTF_KEYUP, 0);
Sleep(20);
}
keybd_event(VK_SHIFT, MapVirtualKey(VK_SHIFT, 0), KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
}
在keybd_event中使用VK_SHIFT,存在shift无法释放的问题,建议大家使用SendInput而不是keybd_event。 对于higher-level操作,我也推荐你使用UI Automation.
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendinput https://docs.microsoft.com/en-us/windows/win32/winauto/entry-uiauto-win32