如何在 WindowProc 处理程序中区分箭头键和数字键盘?
How to distinguish between arrow key and numpad in WindowProc handler?
我正在为 Windows 编写一个C++应用程序,我想提供一个感觉非常好的输入系统,但在某些边缘情况下,用户可以按数字键盘键,例如关闭数字锁定的 Numpad 2 或 shift 键关闭,这将导致相应的WM_KEYUP
和WM_KEYDOWN
事件用于箭头键向下。
除了使用扩展键来区分箭头键和数字键外,我们还可以使用 GetKeyNameText 来获取键名的字符串。即使 Num Lock 关闭,我们仍然可以正确读取数字键的名称。
根据 GetKeyNameText:我们可以使用:
GetKeyNameText(lParam, KeyNameBuffer, sizeof(KeyNameBuffer(/sizeof(TCHAR((;
调用后,该函数将返回当前键的名称。箭头键是:上下左右,数字键是:Num 8 Num 2 Num 4 Num 6,这样我们就可以简单地区分箭头键和数字键。
下面是示例:
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND, UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("windows");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if (!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
}
hwnd = CreateWindow(szAppName,
TEXT("program"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while (GetMessageW(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
TCHAR szKeyName[32];
switch (message)
{
case WM_KEYDOWN:
GetKeyNameText(lParam, szKeyName, sizeof(szKeyName) / sizeof(TCHAR));
MessageBox(0, szKeyName, "title", 0);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
按下按钮时,将弹出一个带有按钮名称的对话框。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 物理键盘上的触发器按键
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 如何使用C/C++在MacOSX中获得键盘布局
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 如何在 WindowProc 处理程序中区分箭头键和数字键盘?
- ImGui 使用'enter'和数字键盘'enter'作为ImGuiKey_Enter
- 有没有办法检查(在控制台应用程序中)键盘上是否按下了 A-Z 和 1-9 的任何字母数字键
- 如何在SDL 2.0 C++中使用操纵杆的数字键盘
- C++Qt Q带数字键盘键的快捷键
- 翻译电话键盘数字成字母
- 识别中心键上的数字键盘(与numlock关闭)与Qt
- 如何获取键盘按键值(或数字/代码)
- 用键盘输入数字到数组中,但只有一行