我一直在尝试在我的 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/