按键消息的处理

fengzongkui 2010-09-13 10:36:23
win32 application程序

#include <windows.h>
long WINAPI WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
BOOL InitWindowsClass(HINSTANCE hInstance);
BOOL InitWindows(HINSTANCE hInstance, int nCmdShow);
HWND hWinMain = NULL;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int

nShowCmd)
{
MSG msg;
if (!InitWindowsClass(hInstance))
{
MessageBox(NULL, "没有注册成功!", "注册", MB_OK);
return FALSE;
}
if (!InitWindows(hInstance, nShowCmd))
{
MessageBox(NULL,"创建窗口失败!","创建",MB_OK);
return FALSE;
}
while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

long WINAPI WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
HPEN hPen;
HBRUSH hBr;
static char cUp[] = "UP Key";
static char cCtrl[] = "Ctrl Key";
static char cShift[] = "SHIFT Key";
static char cCtrl_A[] = "Ctrl A Key";
static char cShift_B[] = "Shift B Key";
static BOOL bUpKeyDown = FALSE, bShiftKeyDown = FALSE, bCtrlKeyDown = FALSE,
bCtrlAKeyDown = FALSE, bShiftBKeyDown = FALSE;
switch (message)
{
case WM_KEYDOWN:
{
switch (wParam)
{
case VK_UP:
bUpKeyDown = TRUE;
break;
case VK_SHIFT:
bShiftKeyDown = TRUE;
break;
case VK_CONTROL:
bCtrlKeyDown = TRUE;
break;
default:
break;
}
}
break;
case WM_KEYUP:
InvalidateRect(hWnd, NULL, FALSE);
break;
case WM_CHAR:
if (wParam == (65 & VK_CONTROL)) //A键
{
if (bCtrlKeyDown == TRUE) //检查Ctrl键是否按下
{
bCtrlAKeyDown = TRUE;
bCtrlKeyDown = FALSE;
}
}
else if (wParam == 98 || wParam == 66) //B键
{
if (bShiftKeyDown == TRUE) //检查Shift键是否按下
{
bShiftBKeyDown = TRUE;
bShiftKeyDown = FALSE;
}
}
break;
case WM_PAINT:
hDC = BeginPaint(hWnd, &ps);
hBr = CreateSolidBrush(RGB(255,0,255));
hPen = (HPEN)GetStockObject(WHITE_PEN);
SelectObject(hDC, hPen);
SelectObject(hDC, hBr);
SetTextColor(hDC, RGB(0,0,255));
SetBkColor(hDC, RGB(255,255,0));
if (bUpKeyDown == TRUE) // Up
{
Rectangle(hDC, 0, 0, 300, 200);
TextOut(hDC, 0, 0, cUp, strlen(cUp));
bUpKeyDown = FALSE;
}
else if (bCtrlAKeyDown == TRUE) //Ctrl + A
{
Rectangle(hDC, 0, 0, 300, 200);
TextOut(hDC, 0, 100, cCtrl_A, strlen(cCtrl_A));
bCtrlAKeyDown = FALSE;
bCtrlKeyDown = FALSE;
}
else if (bCtrlKeyDown == TRUE && bCtrlAKeyDown == FALSE) //Ctrl
{
Rectangle(hDC, 0, 0, 300, 200);
TextOut(hDC, 0, 60, cCtrl, strlen(cCtrl));
bCtrlKeyDown = FALSE;
}
else if (bShiftBKeyDown == TRUE)
{
Rectangle(hDC, 0, 0, 300, 200);
TextOut(hDC, 0, 0, cShift_B, strlen(cShift_B));
bShiftBKeyDown = FALSE;
bShiftKeyDown = FALSE;
}
else if (bShiftKeyDown == TRUE && bShiftBKeyDown == FALSE)
{
Rectangle(hDC, 0, 0, 300, 200);
TextOut(hDC, 0, 0, cShift, strlen(cShift));
bShiftKeyDown = FALSE;
}
DeleteObject(hPen);
DeleteObject(hBr);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

BOOL InitWindows(HINSTANCE hInstance, int nCmdShow)
{
......创建窗口并显示
}

BOOL InitWindowsClass(HINSTANCE hInstance)
{......注册窗口
}

这是黄维通的Win32 API教程中的一个例子。主要的问题是WM_CHAR消息中的if (wParam == (65 & VK_CONTROL)),解释是按下了Ctrl + A键,VK_CONTROL值是0X11,65 & VK_CONTROL的值是1,但是比如按下Ctrl + C时结果应该也是1啊,67 & VK_CONTROL不也是1吗?为什么这边会是这种判断呢(判断处理是按下Ctrl + A键)?而且为什么我按下Ctrl + C 或者Ctrl + E等不会处理呢?网上搜索了下,有人是在PreTranslateMessage中处理按键( if( ( GetKeyState(VK_CONTROL) & 0xF0000000) && ( pMsg->wParam=='A' || pMsg->wParam=='a') ))。但应该也可以在消息处理函数中直接处理按键消息吧。求解答。
...全文
170 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengzongkui 2011-02-17
  • 打赏
  • 举报
回复
不好意思啊,忘了结这帖子了。
fengzongkui 2010-09-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dclchj 的回复:]
标准ASCII表
Bin Dec Hex 缩写/字符 解释
01000001 65 41 A
01000011 67 43 C

65 & VK_CONTROL 和 67 & VK_CONTROL 不一样。
[/Quote]

VK_CONTROL和65,67按位与之后不都是1吗?
fengzongkui 2010-09-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 void_wuyu 的回复:]
if (wParam == (65 & VK_CONTROL)) //A键
{
if (bCtrlKeyDown == TRUE) //检查Ctrl键是否按下
{
bCtrlAKeyDown = TRUE;
bCtrlKeyDown = FALSE;
}
}
你这里不是写着吗,先判断A是否按下,然后判断Ctrl是否按下,难道我看错了?
[/Quote]

你是说wParam == (65 & VK_CONTROL)这个是判断A键是否按下?
乐CC 2010-09-17
  • 打赏
  • 举报
回复
if (wParam == (65 & VK_CONTROL)) //A键
{
if (bCtrlKeyDown == TRUE) //检查Ctrl键是否按下
{
bCtrlAKeyDown = TRUE;
bCtrlKeyDown = FALSE;
}
}
你这里不是写着吗,先判断A是否按下,然后判断Ctrl是否按下,难道我看错了?
dclchj 2010-09-17
  • 打赏
  • 举报
回复
标准ASCII表
Bin Dec Hex 缩写/字符 解释
01000001 65 41 A
01000011 67 43 C

65 & VK_CONTROL 和 67 & VK_CONTROL 不一样。
Defonds 2010-09-17
  • 打赏
  • 举报
回复
黄维通
fengzongkui 2010-09-13
  • 打赏
  • 举报
回复
谁能帮忙解答下

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧