如何在窗口过程方法中检测击键?
How to detect a keystroke in the Window Procedure method?
我对 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
使您的窗口重新粉刷自己。
相关文章:
- 检测win32服务创建和删除的最佳方法
- CoreCLR 中的检测探查器 - 将帮助程序程序集加载到 dotnet 进程的方法
- 通常使用什么方法来检测时间情况?
- 如何在窗口过程方法中检测击键?
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- 有什么方法可以检测我的类的对象是否在堆栈上创建
- 是否有内置方法来检测异常值?
- 使用信号检测子进程何时终止的最佳方法是什么?
- 检测 X11 与韦兰的有效方法,最好是使用 CMake
- 在Qt3D中进行碰撞检测的预期方法(或好方法)是什么?
- 有没有更好的方法来检测向量中一个项目的多次出现?
- 如何实现一致的方法来检测鼠标按钮被按住
- 在 c++ 生成器中检测绘制线的窗口坐标的最佳方法
- 无法使方法存在检测机制正常工作
- 检测特定像素上的某种颜色并在检测到后发送点击的最快方法是什么?
- Anagram检测方法C .将字符串转换为ASCII值的问题
- 在Qt中解析方法的元数据时检测方法的来源
- 如何检测方法是否为虚拟方法
- 如何在opencv中制作自己的特征检测方法
- gtest 仅在该方法在 .h 中实现时检测方法,而不是在 .cpp 中实现(cMake;问题发生在"make"之后)