【发布时间】:2021-12-20 03:18:33
【问题描述】:
我正在编写一个程序,它将检测按键并执行某些操作(在本例中,显示一个消息框)。
一切正常,除了当我尝试退出程序时,它会显示一个类似以下错误窗口的弹出窗口:
现在,这个窗口不会弄乱我的程序中的任何东西,所以我可以把它留在那里,但它很烦人。
这是一个最小可重现示例,我刚开始在 Win32 中编写代码,所以请不要批评我的低效代码。
#include <Windows.h>
#include <thread>
#include <chrono>
#define HFFFA 1001
#define MAINWINDOWSTYLE WS_OVERLAPPED| WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
std::chrono::milliseconds THREAD_WAIT(50);
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg)
{
case WM_COMMAND:
{
switch (wp)
{
case HFFFA:
{
MessageBox(hwnd, L"Sucess", L"Success", MB_OK);
break;
}
break;
}
break;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW));
EndPaint(hwnd, &ps);
break;
}
case WM_DESTROY:
{
PostQuitMessage(0);
break;
}
break;
}
return DefWindowProc(hwnd, msg, wp, lp);
}
void GetKeyPress(HWND hwnd)
{
int keypressed = -1;
while (TRUE)
{
if (GetAsyncKeyState(VK_F6))
{
SendMessage(hwnd, WM_COMMAND, (WPARAM)HFFFA, TRUE);
}
std::this_thread::sleep_for(THREAD_WAIT);
}
}
int WINAPI wWinMain(HINSTANCE hinst, HINSTANCE hiprevinst, PWSTR nCmdLine, int ncmdshow)
{
const wchar_t CLASS_NAME[] = L"Axom";
WNDCLASS wc = { };
wc.lpfnWndProc = WndProc;
wc.hInstance = hinst;
wc.lpszClassName = CLASS_NAME;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
RegisterClass(&wc);
HWND hwnd = CreateWindowEx(0, CLASS_NAME, L"Axom", MAINWINDOWSTYLE, CW_USEDEFAULT, CW_USEDEFAULT, 592, 600, NULL, NULL, hinst, NULL);
ShowWindow(hwnd, ncmdshow);
std::thread td(GetKeyPress, hwnd);
MSG msg;
while (GetMessage(&msg, NULL, NULL, NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
【问题讨论】:
-
您正在寻找
RegisterHotKey。