如何在窗口过程方法中检测击键?

How to detect a keystroke in the Window Procedure method?

本文关键字:检测 方法 窗口 过程      更新时间:2023-10-16

我对 c++ 有点陌生,我正在尝试创建一个 gui 应用程序来告诉我我的大写锁定是否处于活动状态。我已经设置了基本 UI,它按计划启动(通过颜色向我显示我的锁定状态(,但我无法在运行时更改窗口颜色。

这是我的代码:

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
bool state = false;
switch (uMsg) {
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// All painting occurs here, between BeginPaint and EndPaint.
if ((GetKeyState(VK_CAPITAL) & 0x0001) != 0) {
FillRect(hdc, &ps.rcPaint, CreateSolidBrush(RGB(0, 255, 0)));
}
else {
FillRect(hdc, &ps.rcPaint, CreateSolidBrush(RGB(255, 0, 0)));
}
EndPaint(hwnd, &ps);
}
case WM_KEYUP:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// All painting occurs here, between BeginPaint and EndPaint.
if ((GetKeyState(VK_CAPITAL) & 0x0001) != 0) {
FillRect(hdc, &ps.rcPaint, CreateSolidBrush(RGB(0, 255, 0)));
}
else {
FillRect(hdc, &ps.rcPaint, CreateSolidBrush(RGB(255, 0, 0)));
}
EndPaint(hwnd, &ps);
}
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

并提前感谢。

不要在WM_KEYUP处理程序中调用(Begin/End)Paint(),也不要在WM_PAINT处理程序中调用GetKeyState()WM_KEY(DOWN|UP)将所需的颜色保存到变量中,然后在该变量更改值时调用InvalidateRect()以触发窗口的重新绘制。让我们根据需要使用该变量的当前值绘制窗口WM_PAINT

此外,您的case块缺少break语句。 而且您正在泄露CreateSolidBrush()返回的HBRUSH.

尝试更多类似的东西:

COLORREF color;
void UpdateColorForCapsLock()
{
if (GetKeyState(VK_CAPITAL) & 0x0001) {
color = RGB(0, 255, 0);
}
else {
color = RGB(255, 0, 0);
}
}
RESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg) {
case WM_CREATE:
{
UpdateColorForCapsLock();
break;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
HBRUSH hBrush = CreateSolidBrush(color);
FillRect(hdc, &ps.rcPaint, hBrush);
DeleteObject(hBrush);
EndPaint(hwnd, &ps);
return 0;
}
case WM_KEYDOWN:
case WM_KEYUP:
{
if (wParam == VK_CAPITAL)
{
UpdateColorForCapsLock();
InvalidateRect(hwnd, NULL, TRUE);
}
break;
}
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

捕获WM_KEYDOWN消息。如果我是大写锁定键(检查参数(,请通过调用InvalidateRect使您的窗口重新粉刷自己。