按键消息的处理
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') ))。但应该也可以在消息处理函数中直接处理按键消息吧。求解答。