Как отличить guish между клавишей со стрелкой и цифровой панелью в обработчике WindowPro c? - PullRequest
0 голосов
/ 19 июня 2020

Я пишу приложение на C ++ для Windows, и я хотел бы предоставить систему ввода, которая кажется действительно приятной, но есть некоторые крайние случаи, когда пользователь может нажимать клавиши цифровой клавиатуры, например Numpad 2 с выключенным numlock или сдвигом клавишу вниз, что вызовет соответствующие события WM_KEYUP и WM_KEYDOWN для клавиши со стрелкой вниз.

1 Ответ

0 голосов
/ 19 июня 2020

Помимо использования расширенных клавиш для различия guish между клавишами со стрелками и клавишами с цифрами c, мы также можем использовать GetKeyNameText для получения строки имен клавиш. Даже когда Num Lock выключен, мы все равно можем правильно читать имена цифровых c клавиш.

Согласно GetKeyNameText : мы можем использовать:

GetKeyNameText ( lParam, KeyNameBuffer, sizeof (KeyNameBuffer) / sizeof (TCHAR));

После вызова функция вернет имя текущей клавиши. Клавиши со стрелками: Вверх Вниз Влево Вправо, а цифровые клавиши c: Num 8 Num 2 Num 4 Num 6, так что мы можем просто различать guish между клавишами со стрелками и цифровыми c клавишами.

Вот пример:

    #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);
}

Когда вы нажимаете кнопку, появляется диалоговое окно с названием кнопки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...