c++ - Win32 键盘加速器不工作 C++

标签 c++ windows winapi handle

我一直在尝试在我的 Win32 应用程序中创建键盘快捷键。这是一个 F5 刷新快捷方式。

我一直在关注这个例子:http://msdn.microsoft.com/en-us/library/windows/desktop/ms646337%28v=vs.85%29.aspx#wm_command .

我已经将其包含在“menu.rc”文件中:

IDR_MYACC ACCELERATORS
BEGIN
    VK_F5, ID_EDIT_REFRESH, VIRTKEY
END

在“main.cpp”文件中:

HWND   hwnd;
HANDLE hinstAcc;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[] = TEXT("CPUTemp");
    MSG        msg;
    WNDCLASSEX wc;
    BOOL       bRet;

    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON));
    wc.hIconSm       = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON), 
                                        IMAGE_ICON, 16, 16, 0);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); // use default colour as window background
    wc.lpszMenuName  = MAKEINTRESOURCE(IDR_MYMENU);
    wc.lpszClassName = szAppName;

    if (!RegisterClassEx(&wc)) {
        MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, szAppName, "CPU Temperature", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 150, NULL, NULL, hInstance, NULL);

    ShowWindow(GetConsoleWindow(), 0);
    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);

    HACCEL haccel = LoadAccelerators(hinstAcc, MAKEINTRESOURCE(IDR_MYACC));

    if (haccel == NULL) {
        MessageBox(NULL, "Accelerator Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    // get and dispatch messages until a WM_QUIT message is received
    while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
    {
        if (bRet == -1) {
            MessageBox(NULL, "Message Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
            return 0;
        } else {
            // Check for accelerator keystrokes
            if (!TranslateAccelerator( 
                hwnd,   // handle to receiving window 
                haccel, // handle to active accelerator table 
                &msg))  // message data 
            {
                TranslateMessage(&msg); // translate virtual-key messages into character messages
                DispatchMessage(&msg);  // send message to window procedure 
            }
        }
    }

    return msg.wParam; // the program return-value is 0 - value that PostQuitMessage() gave
}

编译时出现问题 - 我收到一条错误消息“此行从‘HANDLE aka void’到‘HINSTANCE’的无效转换:

HACCEL haccel = LoadAccelerators(hinstAcc, MAKEINTRESOURCE(IDR_MYACC));

但如果我尝试用“hInstance”替换“hinstAcc”,它会编译并运行,但加速器最终为 NULL。

我该如何解决这个问题?

最佳答案

编译问题:

使用 hInstance,或者更好,使用 GetModuleHandle(0) 并抛弃愚蠢、冗长和非标准的 WinMain(使用标准 main 代替)

更一般地说,只需查阅有关 Windows API 函数参数的文档

例如google LoadAccelerators,单击指向 MSDN 文档的链接。


重新

“ if I try replacing "hinstAcc" with "hInstance", it compiles and runs, but the accelerator ends up being NULL.”

我在提供的代码中看不到任何原因。

也许您忘记了链接资源。

关于c++ - Win32 键盘加速器不工作 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22427474/

相关文章:

c - 对于 32 位提升的进程,OpenProcess 返回 ERROR_ACCESS_DENIED

c++ - 继承与类型转换

c++ - 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法

java - 如何在 Windows(非 Java)应用程序中使用 Java 时区 ID?

c - PlaySound() 在 WM_DESTROY 和 DrawText 问题后继续播放我的 .wav

c++ - CreateProcess 这样子进程在父进程被杀死时被杀死?

delphi - 如何重定向 CreateProcess 执行的命令的大量输出?

c++ - 传递不同数据类型的问题

c++ - "Elements of Programming"现实世界的例子?

windows - 从 NT 服务向远程桌面 session 发送消息