SetWindowsHookEx - VK_LSHIFT 和“搜索"之间的区别;键盘按钮 [英] SetWindowsHookEx - difference between VK_LSHIFT and "Search" keyboard button
问题描述
我使用 SetWindowsHookEx 来捕捉键盘事件
I use SetWindowsHookEx to catch keyboard events
SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0)
这里是 HookCallback
Here is HookCallback
LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0)
{
// the action is valid: HC_ACTION.
if (wParam == WM_KEYDOWN)
{
kbdStruct = *((KBDLLHOOKSTRUCT*)lParam);
printf("%ld\n", kbdStruct.vkCode);
}
}
}
当按下左移"时输出为
160
当按下搜索"按钮(笔记本上带有放大镜图标的按钮)输出为
when press "search" button (button with loupe icon on notebooks) output is
160
91
132
如何检查 HookCallback 中是否按下了左移"或搜索"按钮?
How to check if "left shift" or "search" button is pressed inside HookCallback ?
推荐答案
160为VK_LSHIFT
,91为VK_LWIN
,132为VK_F21
.请参阅虚拟密钥代码.唯一标准化的搜索键是 VK_BROWSER_SEARCH
,因此很明显您的键盘制造商使用的是非标准键作为其搜索键.
160 is VK_LSHIFT
, 91 is VK_LWIN
, and 132 is VK_F21
. See Virtual-Key Codes. The only standardized Search key is VK_BROWSER_SEARCH
, so clearly your keyboard manufacturer is using a non-standard key for its Search key.
您需要根据需要记住从一个事件到下一个事件所看到的键,例如:
You need to remember the keys you see from one event to the next as needed, eg:
bool LeftShiftIsDown = false;
bool LeftWinIsDown = false;
bool F21IsDown = false;
bool SearchIsDown = false;
LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
KBDLLHOOKSTRUCT *kbdStruct = (KBDLLHOOKSTRUCT*) lParam;
if (wParam == WM_KEYDOWN)
{
printf("%ld is down\n", kbdStruct->vkCode);
switch (kbdStruct->vkCode)
{
case VK_LSHIFT:
LeftShiftIsDown = true;
break;
case VK_LWIN:
LeftWinIsDown = true;
break;
case VK_F21:
F21IsDown = true;
break;
}
if (LeftShiftIsDown && LeftWinIsDown && F21IsDown)
{
if (!SearchIsDown)
{
SearchIsDown = true;
printf("Search is down\n");
}
}
}
else if (wParam == WM_KEYUP)
{
printf("%ld is up\n", kbdStruct->vkCode);
switch (kbdStruct->vkCode)
{
case VK_LSHIFT:
LeftShiftIsDown = false;
break;
case VK_LWIN:
LeftWinIsDown = false;
break;
case VK_F21:
F21IsDown = false;
break;
}
if (!(LeftShiftIsDown && LeftWinIsDown && F21IsDown))
{
if (SearchIsDown)
{
SearchIsDown = false;
printf("Search is up\n");
}
}
}
}
return CallNextHookEx(0, nCode, wParam, lParam);
}
这篇关于SetWindowsHookEx - VK_LSHIFT 和“搜索"之间的区别;键盘按钮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!