繁体   English   中英

winapi 不响应按键

[英]winapi doesn't respond to keypress

我最近决定学习一些 WinApi,但我遇到了障碍。 我想在按键后在我的窗口中显示按摩,但它似乎不起作用。 如果我多次按下该键或按住它,仍然没有任何反应。 你能告诉我我做错了什么吗?

这是完整的代码:

#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include <tchar.h>

LRESULT CALLBACK WndProc (HWND   hwnd,
                          UINT   uMsg,
                          WPARAM wParam,
                          LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    LPCWSTR display_str = L"hello";
    switch(uMsg)
    {
        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);
            if(GetAsyncKeyState(VK_UP))
            {
            TextOut(hdc,
                    15, 15,
                    display_str,
                    _tcslen(display_str));
            }
            EndPaint(hwnd, &ps);
            break;

        case WM_CLOSE:
            DestroyWindow(hwnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    HWND hwnd;
    MSG uMsg;
    HINSTANCE hInst;
    WNDCLASSEX wcex;
    LPCWSTR class_name = L"myWindowClass";

    wcex.cbSize         = sizeof(WNDCLASSEX);
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = NULL;
    wcex.lpszClassName  = class_name;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

    if(!RegisterClassEx(&wcex))
    {
        MessageBox(NULL, L"Call to RegisterClassEx failed!", L"Win32 Guided Tour!",
        MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    hInst = hInstance;

    hwnd = CreateWindowEx(
        NULL,
        class_name,
        L"Test",
        WS_OVERLAPPEDWINDOW,
        200, 200,
        740, 540,
        NULL,
        NULL,
        hInstance,
        NULL
        );

    if(!hwnd)
    {
        MessageBox(NULL, L"Window Creation Failed!", L"Error!",
        MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&uMsg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&uMsg);
        DispatchMessage(&uMsg);
    }
    return uMsg.wParam;
}

当按下某个键时,Windows 会发送WM_KEYDOWN消息。 WndProc处理 WM_KEYDOWN 消息中,使用窗口的 Client rect 调用InvalidateRect并在 WM_PAINT 消息处理程序中绘制要显示的文本。

这是我的示例,如果按下 F11 键,则在控制台字符串中打印。:

case WM_KEYDOWN:
     if(wParam==VK_F11)
     {
           std::cout << "Hello in my example!";
     }

break;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM