如何在 WindowProc 处理程序中区分箭头键和数字键盘?

How to distinguish between arrow key and numpad in WindowProc handler?

本文关键字:数字 键盘 WindowProc 处理 中区 程序      更新时间:2023-10-16

我正在为 Windows 编写一个C++应用程序,我想提供一个感觉非常好的输入系统,但在某些边缘情况下,用户可以按数字键盘键,例如关闭数字锁定的 Numpad 2 或 shift 键关闭,这将导致相应的WM_KEYUPWM_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);
}

按下按钮时,将弹出一个带有按钮名称的对话框。