Windows 程序设计--(六)键盘
6.2 击键消息
当按下一个键时,Windows把WM_KEYDOWN或者WM_SYSKEYDOWN消息放入有输入焦点的窗口的消息队列;当您释放一个键时,Windows把WM_KEYUP或者WM_SYSKEYUP消息放入消息队列中。
|
键按下 |
键释放 |
|
|
非系统键 |
WM_KEYDOWN |
WM_KEYUP |
|
系统键 |
WM_SYSKEYDOWN |
WM_SYSKEYUP |
通常「down(按下)」和「up(放开)」消息是成对出现的。不过,如果您按住一个键使得自动重复功能生效,那么当该键最后被释放时,Windows会给窗口消息处理程序发送一系列WM_KEYDOWN(或者WM_SYSKEYDOWN)消息和一个WM_KEYUP(或者WM_SYSKEYUP)消息。像所有放入队列的消息一样,按键消息也有时间信息。通过呼叫GetMessageTime,您可以获得按下或者释放键的相对时间。
6.2.1 系统键击和非系统键击
一般来说和ALT组合的都是系统键击,其它的都是非系统键击。
#include <Windows.h>
#include <iostream> using namespace std; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("WNDCLASS NAME");
HWND hwnd;
MSG msg;
WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = ;
wndclass.cbWndExtra = ;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) {
MessageBox(NULL, TEXT("窗口创建失败!需要Windows NT!(传递消息为UNICODE)"), szAppName, MB_ICONERROR); return ;
} hwnd = CreateWindow(
szAppName,
TEXT("Hk_Mayfly"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
,//宽度
,//高度
NULL,
NULL,
hInstance,
NULL
);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd); while (GetMessage(&msg, NULL, , )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
} LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) {
case WM_SYSKEYDOWN:
MessageBox(hwnd, TEXT("系统键击按下!"), TEXT("test!"), NULL);
return ;
case WM_KEYDOWN:
MessageBox(hwnd, TEXT("非系统键击按下!"), TEXT("test!"), NULL);
return ;
case WM_DESTROY:
PostQuitMessage();
return ;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}

6.2.2 虚拟键代码
扫描码(通码)和断码的相关信息可以在https://www.cnblogs.com/Mayfly-nymph/p/11228966.html 找到说明。
前四个虚拟键码中有三个指的是鼠标键:
|
十进制 |
十六进制 |
WINUSER.H标识符 |
必需? |
IBM兼容键盘 |
|
1 |
01 |
VK_LBUTTON |
鼠标左键 |
|
|
2 |
02 |
VK_RBUTTON |
鼠标右键 |
|
|
3 |
03 |
VK_CANCEL |
ˇ |
Ctrl-Break |
|
4 |
04 |
VK_MBUTTON |
鼠标中键 |
我们不能在击键消息中检测到鼠标消息。
虚拟键代码
| Symbolic Constant Name | Hexadecimal Value | Mouse Or Keyboard Equivalent |
| VK_LBUTTON | 01 | Left mouse button |
| VK_RBUTTON | 02 | Right mouse button |
| VK_CANCEL | 03 | Control-break processing |
| VK_MBUTTON | 04 | Middle mouse button (three-button mouse) |
| VK_XBUTTON1 | 05 | Windows 2000: X1 mouse button |
| VK_XBUTTON2 | 06 | Windows 2000: X2 mouse button |
| | 07 | Undefined |
| VK_BACK | 08 | BACKSPACE key |
| VK_TAB | 09 | TAB key |
| | 0A0B | Reserved |
| VK_CLEAR | 0C | CLEAR key |
| VK_RETURN | 0D | ENTER key |
| | 0E0F | Undefined |
| VK_SHIFT | 10 | SHIFT key |
| VK_CONTROL | 11 | CTRL key |
| VK_MENU | 12 | ALT key |
| VK_PAUSE | 13 | PAUSE key |
| VK_CAPITAL | 14 | CAPS LOCK key |
| VK_KANA | 15 | IME Kana mode |
| VK_HANGUEL | 15 | IME Hanguel mode (maintained for compatibility; use VK_HANGUL) |
| VK_HANGUL | 15 | IME Hangul mode |
| | 16 | Undefined |
| VK_JUNJA | 17 | IME Junja mode |
| VK_FINAL | 18 | IME final mode |
| VK_HANJA | 19 | IME Hanja mode |
| VK_KANJI | 19 | IME Kanji mode |
| | 1A | Undefined |
| VK_ESCAPE | 1B | ESC key |
| VK_CONVERT | 1C | IME convert |
| VK_NONCONVERT | 1D | IME nonconvert |
| VK_ACCEPT | 1E | IME accept |
| VK_MODECHANGE | 1F | IME mode change request |
| VK_SPACE | 20 | SPACEBAR |
| VK_PRIOR | 21 | PAGE UP key |
| VK_NEXT | 22 | PAGE DOWN key |
| VK_END | 23 | END key |
| VK_HOME | 24 | HOME key |
| VK_LEFT | 25 | LEFT ARROW key |
| VK_UP | 26 | UP ARROW key |
| VK_RIGHT | 27 | RIGHT ARROW key |
| VK_DOWN | 28 | DOWN ARROW key |
| VK_SELECT | 29 | SELECT key |
| VK_PRINT | 2A | PRINT key |
| VK_EXECUTE | 2B | EXECUTE key |
| VK_SNAPSHOT | 2C | PRINT SCREEN key |
| VK_INSERT | 2D | INS key |
| VK_DELETE | 2E | DEL key |
| VK_HELP | 2F | HELP key |
| '0' | 30 | 0 key |
| '1' | 31 | 1 key |
| '2' | 32 | 2 key |
| '3' | 33 | 3 key |
| '4' | 34 | 4 key |
| '5' | 35 | 5 key |
| '6' | 36 | 6 key |
| '7' | 37 | 7 key |
| '8' | 38 | 8 key |
| '9' | 39 | 9 key |
| | 3A40 | Undefined |
| 'A' | 41 | A key |
| 'B' | 42 | B key |
| 'C' | 43 | C key |
| 'D' | 44 | D key |
| 'E' | 45 | E key |
| 'F' | 46 | F key |
| 'G' | 47 | G key |
| 'H' | 48 | H key |
| 'I' | 49 | I key |
| 'J' | 4A | J key |
| 'K' | 4B | K key |
| 'L' | 4C | L key |
| 'M' | 4D | M key |
| 'N' | 4E | N key |
| 'O' | 4F | O key |
| 'P' | 50 | P key |
| 'Q' | 51 | Q key |
| 'R' | 52 | R key |
| 'S' | 53 | S key |
| 'T' | 54 | T key |
| 'U' | 55 | U key |
| 'V' | 56 | V key |
| 'W' | 57 | W key |
| 'X' | 58 | X key |
| 'Y' | 59 | Y key |
| 'Z' | 5A | Z key |
| VK_LWIN | 5B | Left Windows key (Microsoft Natural Keyboard) |
| VK_RWIN | 5C | Right Windows key (Microsoft Natural Keyboard) |
| VK_APPS | 5D | Applications key (Microsoft Natural Keyboard) |
| | 5E | Reserved |
| VK_SLEEP | 5F | Computer Sleep key |
| VK_NUMPAD0 | 60 | Numeric keypad 0 key |
| VK_NUMPAD1 | 61 | Numeric keypad 1 key |
| VK_NUMPAD2 | 62 | Numeric keypad 2 key |
| VK_NUMPAD3 | 63 | Numeric keypad 3 key |
| VK_NUMPAD4 | 64 | Numeric keypad 4 key |
| VK_NUMPAD5 | 65 | Numeric keypad 5 key |
| VK_NUMPAD6 | 66 | Numeric keypad 6 key |
| VK_NUMPAD7 | 67 | Numeric keypad 7 key |
| VK_NUMPAD8 | 68 | Numeric keypad 8 key |
| VK_NUMPAD9 | 69 | Numeric keypad 9 key |
| VK_MULTIPLY | 6A | Multiply key |
| VK_ADD | 6B | Add key |
| VK_SEPARATOR | 6C | Separator key |
| VK_SUBTRACT | 6D | Subtract key |
| VK_DECIMAL | 6E | Decimal key |
| VK_DIVIDE | 6F | Divide key |
| VK_F1 | 70 | F1 key |
| VK_F2 | 71 | F2 key |
| VK_F3 | 72 | F3 key |
| VK_F4 | 73 | F4 key |
| VK_F5 | 74 | F5 key |
| VK_F6 | 75 | F6 key |
| VK_F7 | 76 | F7 key |
| VK_F8 | 77 | F8 key |
| VK_F9 | 78 | F9 key |
| VK_F10 | 79 | F10 key |
| VK_F11 | 7A | F11 key |
| VK_F12 | 7B | F12 key |
| VK_F13 | 7C | F13 key |
| VK_F14 | 7D | F14 key |
| VK_F15 | 7E | F15 key |
| VK_F16 | 7F | F16 key |
| VK_F17 | 80H | F17 key |
| VK_F18 | 81H | F18 key |
| VK_F19 | 82H | F19 key |
| VK_F20 | 83H | F20 key |
| VK_F21 | 84H | F21 key |
| VK_F22 | 85H | F22 key |
| VK_F23 | 86H | F23 key |
| VK_F24 | 87H | F24 key |
| | 888F | Unassigned |
| VK_NUMLOCK | 90 | NUM LOCK key |
| VK_SCROLL | 91 | SCROLL LOCK key |
| 9296 | OEM specific | |
| | 979F | Unassigned |
| VK_LSHIFT | A0 | Left SHIFT key |
| VK_RSHIFT | A1 | Right SHIFT key |
| VK_LCONTROL | A2 | Left CONTROL key |
| VK_RCONTROL | A3 | Right CONTROL key |
| VK_LMENU | A4 | Left MENU key |
| VK_RMENU | A5 | Right MENU key |
| VK_BROWSER_BACK | A6 | Windows 2000: Browser Back key |
| VK_BROWSER_FORWARD | A7 | Windows 2000: Browser Forward key |
| VK_BROWSER_REFRESH | A8 | Windows 2000: Browser Refresh key |
| VK_BROWSER_STOP | A9 | Windows 2000: Browser Stop key |
| VK_BROWSER_SEARCH | AA | Windows 2000: Browser Search key |
| VK_BROWSER_FAVORITES | AB | Windows 2000: Browser Favorites key |
| VK_BROWSER_HOME | AC | Windows 2000: Browser Launch and Home key |
| VK_VOLUME_MUTE | AD | Windows 2000: Volume Mute key |
| VK_VOLUME_DOWN | AE | Windows 2000: Volume Down key |
| VK_VOLUME_UP | AF | Windows 2000: Volume Up key |
| VK_MEDIA_NEXT_TRACK | B0 | Windows 2000: Next Track key |
| VK_MEDIA_PREV_TRACK | B1 | Windows 2000: Previous Track key |
| VK_MEDIA_STOP | B2 | Windows 2000: Stop Media key |
| VK_MEDIA_PLAY_PAUSE | B3 | Windows 2000: Play/Pause Media key |
| VK_LAUNCH_MAIL | B4 | Windows 2000: Launch Mail key |
| VK_LAUNCH_MEDIA_SELECT | B5 | Windows 2000: Select Media key |
| VK_LAUNCH_APP1 | B6 | Windows 2000: Launch Application 1 key |
| VK_LAUNCH_APP2 | B7 | Windows 2000: Launch Application 2 key |
| | B8-B9 | Reserved |
| VK_OEM_1 | BA | Windows 2000: for the US standard keyboard, the ';:' key |
| VK_OEM_PLUS | BB | Windows 2000: for any country/region, the '+' key |
| VK_OEM_COMMA | BC | Windows 2000: for any country/region, the ',' key |
| VK_OEM_MINUS | BD | Windows 2000: for any country/region, the '-' key |
| VK_OEM_PERIOD | BE | Windows 2000: for any country/region, the '.' key |
| VK_OEM_2 | BF | Windows 2000: for the US standard keyboard, the '/?' key |
| VK_OEM_3 | C0 | Windows 2000: for the US standard keyboard, the '`~' key |
| | C1D7 | Reserved |
| | D8DA | Unassigned |
| VK_OEM_4 | DB | Windows 2000: for the US standard keyboard, the '[{' key |
| VK_OEM_5 | DC | Windows 2000: for the US standard keyboard, the '\|' key |
| VK_OEM_6 | DD | Windows 2000: for the US standard keyboard, the ']}' key |
| VK_OEM_7 | DE | Windows 2000: for the US standard keyboard, the 'single-quote/double-quote' key |
| VK_OEM_8 | DF | |
| | E0 | Reserved |
| E1 | OEM specific | |
| VK_OEM_102 | E2 | Windows 2000: either the '<>' key or the '\|' key on the RT 102-key keyboard |
| E3E4 | OEM specific | |
| VK_PROCESSKEY | E5 | Windows 95, Windows NT 4.0, and Windows 2000: IME PROCESS key |
| E6 | OEM specific | |
| VK_PACKET | E7 | Windows 2000: Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. The Unicode character is the high word. |
| | E8 | Unassigned |
| E9F5 | OEM specific | |
| VK_ATTN | F6 | Attn key |
| VK_CRSEL | F7 | CrSel key |
| VK_EXSEL | F8 | ExSel key |
| VK_EREOF | F9 | Erase EOF key |
| VK_PLAY | FA | Play key |
| VK_ZOOM | FB | Zoom key |
| VK_NONAME | FC | Reserved for future use |
| VK_PA1 | FD | PA1 key |
| VK_OEM_CLEAR | FE | Clear key |
6.2.4 转移状态
是否按下了位移键(Shift、Ctrl和Alt)或开关键(Caps Lock、Num Lock和Scroll Lock)。通过呼叫GetKeyState函数,您就能获得此信息。例如:
iState = GetKeyState (VK_SHIFT) ;
如果按下了Shift,则iState值为负(即设定了最高位置位)。如果Caps Lock键打开,则从
iState = GetKeyState (VK_CAPITAL) ;
6.3 字符消息
6.3.1 四类字符消息
|
字符 |
死字符 |
|
|
非系统字符 |
WM_CHAR |
WM_DEADCHAR |
|
系统字符 |
WM_SYSCHAR |
WM_SYSDEADCHAR |
WM_CHAR和WM_DEADCHAR消息是从WM_KEYDOWN得到的;而WM_SYSCHAR和WM_SYSDEADCHAR消息是从WM_SYSKEYDOWN消息得到的(我将简要地讨论一下什么是死字符)。
6.3.2 消息顺序
|
按键 |
字符代码 |
产生方法 |
ANSI C控制字符 |
|
Backspace |
0x08 |
Ctrl-H |
\b |
|
Tab |
0x09 |
Ctrl-I |
\t |
|
Ctrl-Enter |
0x0A |
Ctrl-J |
\n |
|
Enter |
0x0D |
Ctrl-M |
\r |
|
Esc |
0x1B |
Ctrl-[ |
#include <Windows.h>
#include <iostream> using namespace std; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("WNDCLASS NAME");
HWND hwnd;
MSG msg;
WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = ;
wndclass.cbWndExtra = ;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) {
MessageBox(NULL, TEXT("窗口创建失败!需要Windows NT!(传递消息为UNICODE)"), szAppName, MB_ICONERROR); return ;
} hwnd = CreateWindow(
szAppName,
TEXT("Hk_Mayfly"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
,//宽度
,//高度
NULL,
NULL,
hInstance,
NULL
);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd); while (GetMessage(&msg, NULL, , )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
} LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) {
case WM_CHAR:
switch (wParam) {
case 'A':
MessageBox(hwnd, TEXT("A键被按下!"), TEXT("TEST!"), NULL);
break;
case 0x61:
MessageBox(hwnd, TEXT("a键被按下!"), TEXT("TEST!"), NULL);
break;
case '\n':
MessageBox(hwnd, TEXT("回车键被按下!"), TEXT("TEST!"), NULL);
break;
case '\r':
MessageBox(hwnd, TEXT("Enter--换行键被按下!"), TEXT("TEST!"), NULL);
break;
} return ;
case WM_DESTROY:
PostQuitMessage();
return ;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}

6.3.4 死字符消息
Windows程序经常忽略WM_DEADCHAR和WM_SYSDEADCHAR消息。
定义:在某些非U.S.英语键盘上,有些键用于给字母加上音调。因为它们本身不产生字符,所以称之为「死键」。
工作方式:当使用者按下这个死键时,窗口消息处理程序接收到一个wParam等于音调本身的ASCII或者Unicode代码的WM_DEADCHAR消息。当使用者再按下可以带有此音调的字母键(例如A键)时,窗口消息处理程序会接收到WM_CHAR消息,其中wParam等于带有音调的字母「a」的ANSI代码。
6.5 插入符号(不是光标)
当您往程序中输入文字时,通常有一个底线、竖条或者方框来指示输入的下一个字符将出现在屏幕上的位置。这个标志通常称为「光标」,但是在Windows下写程序,您必须改变这个习惯。在Windows中,它称为「插入符号」。「光标」是指表示鼠标位置的那个位图图像。
键盘操作实例--贪吃球球
整体思路:
- 在客户区绘制球球和食物
- 捕获键盘消息,根据键盘操作改变球球的坐标(位置+大小)
- 当食物与球球接触,食物消息,更新球球大小,随机产生另一个食物
#include <Windows.h>
#include <iostream>
#include <time.h>
#include <tchar.h> #define random(x) (rand()%x) using namespace std; bool Flag = TRUE; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("WNDCLASS NAME");
HWND hwnd;
MSG msg;
WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = ;
wndclass.cbWndExtra = ;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) {
MessageBox(NULL, TEXT("窗口创建失败!需要Windows NT!(传递消息为UNICODE)"), szAppName, MB_ICONERROR); return ;
} hwnd = CreateWindow(
szAppName,
TEXT("Hk_Mayfly"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,//宽度
CW_USEDEFAULT,//高度
NULL,
NULL,
hInstance,
NULL
);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd); while (GetMessage(&msg, NULL, , )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
} LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
HDC hdc;
PAINTSTRUCT ps;
int i = ;
static int cxClient, cyClient, cxFood, cyFood, Count, cyChar;
static POINT apt[];
srand((int)time(NULL));
static HBRUSH hBrush;
TCHAR szBuffer[], szBuffer_A[];
TEXTMETRIC tm; switch (message) {
case WM_CREATE:
hdc = GetDC(hwnd);
GetTextMetrics(hdc, &tm);
cyChar = tm.tmHeight + tm.tmExternalLeading;
hBrush = CreateSolidBrush(RGB(, , ));
ReleaseDC(hwnd, hdc);
return ;
case WM_SIZE:
/*
初始化球球位置为客户区正中心
*/
if (Flag) {
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam); apt[].x = cxClient / - ;
apt[].y = cyClient / - ;
apt[].x = cxClient / + ;
apt[].y = cyClient / + ; Flag = FALSE;
}
/*
食物地址随机
*/
cxFood = random(cxClient);
cyFood = random(cyClient);
return ;
case WM_KEYDOWN:
/*
按键控制球球的移动方向
*/
switch (wParam) {
case VK_UP:
apt[].y -= ;
apt[].y -= ;
break;
case VK_DOWN:
apt[].y += ;
apt[].y += ;
break;
case VK_LEFT:
apt[].x -= ;
apt[].x -= ;
break;
case VK_RIGHT:
apt[].x += ;
apt[].x += ;
break;
case VK_ESCAPE:
wsprintf(szBuffer, TEXT("Congratulation!!! You Get %d"), Count);
MessageBox(hwnd, szBuffer, TEXT("Grade"), 0x4L | 0x40L);
exit();
}
/*
客户区无效化
*/
InvalidateRect(hwnd, NULL, TRUE);
return ;
case WM_PAINT:
/*
判断球球是否吃到食物
*/
if (apt[].x <= cxFood - && apt[].x >= cxFood + && apt[].y <= cyFood - && apt[].y >= cyFood + ) {
/*
生成新的食物,且食物不能在球球内
*/
cxFood = random(cxClient);
cyFood = random(cyClient);
while (apt[].x <= cxFood - && apt[].x >= cxFood + && apt[].y <= cyFood - && apt[].y >= cyFood + ) {
cxFood = random(cxClient);
cyFood = random(cyClient);
}
/*
球球长大了
*/
apt[].x -= ;
apt[].x += ;
apt[].y -= ;
apt[].y += ;
++Count;
}
hdc = BeginPaint(hwnd, &ps);
SelectObject(hdc, GetStockObject(GRAY_BRUSH));
//绘制球球
Ellipse(hdc, apt[].x, apt[].y, apt[].x, apt[].y);
SelectObject(hdc, hBrush);
//绘制食物
Ellipse(hdc, cxFood - , cyFood - , cxFood + , cyFood + ); TextOut(hdc, cxClient - , + cyChar * i++, szBuffer_A, wsprintf(szBuffer_A, TEXT("当前分数:%d"), Count));
TextOut(hdc, cxClient - , + cyChar * i++, szBuffer_A, wsprintf(szBuffer_A, TEXT("向上移动:↑")));
TextOut(hdc, cxClient - , + cyChar * i++, szBuffer_A, wsprintf(szBuffer_A, TEXT("向下移动:↓")));
TextOut(hdc, cxClient - , + cyChar * i++, szBuffer_A, wsprintf(szBuffer_A, TEXT("向左移动:←")));
TextOut(hdc, cxClient - , + cyChar * i++, szBuffer_A, wsprintf(szBuffer_A, TEXT("向右移动:→")));
TextOut(hdc, cxClient - , + cyChar * i++, szBuffer_A, wsprintf(szBuffer_A, TEXT("退出:ESC")));
EndPaint(hwnd, &ps);
return ;
case WM_DESTROY:
PostQuitMessage();
return ;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}

破解贪吃球球
有兴趣可以看下:点击进入
Windows 程序设计--(六)键盘的更多相关文章
- Windows 程序设计 笔记
知识点 双字节字符集和Unicode字符集有何区别?采用双字节字符集有何问题 双字节字符集(DBCS)编码是0-255,DBCS含有1字节代码与2字节代码,而Unicode是统一的16位系统,这样就允 ...
- Windows程序设计学习笔记(1):一个简单的windows程序
<Windows程序设计>(第五版)(美Charles Petzold著) #include<windows.h> LRESULT CALLBACK WndProc(HWND, ...
- Windows 程序设计(4) MFC 03 -系列学习
本文整体目录和绝大部门内容来自 [鸡啄米网站]的MFC系列文章,欢迎支持原创 (一)VS2010/MFC编程入门之前言 VC++全称是Visual C++,是由微软提供的C++开发工具,它与C++的根 ...
- Windows 程序设计
一.Win32 API /******************************************************************** created: 2014/04/1 ...
- 关于《Windows程序设计(第五版)》中一个实例程序的疑问
最近一直在看Charlse Petzold的<Windows程序设计>,作为一个新得不能再新的新手,只能先照着书的抄抄源码了,之前的例子一直都很正常,但昨天遇到一个很诡异的BUG. 先看实 ...
- windows 程序设计自学:添加图标资源
#include <windows.h> #include "resource.h" LRESULT CALLBACK MyWndProc( HWND hwnd, // ...
- windows程序设计笔记
2014.05.06 新建一个visual C++ -- 常规 -- 空白 的项目,用.c后缀名指定这是一个用C语言来写的windows项目.和C语言的hellworld程序做了一个比较,按照wind ...
- 《Windows程序设计第5版》学习进度备忘
书签:另外跳过的内容有待跟进 __________________学习资源: <Windows程序设计第5版珍藏版> __________________知识基础支持: _________ ...
- MFC Windows程序设计源代码免费下载
本人近期在网上找到了<MFC Windows程序设计>第二版的书内程序的源代码,特意上传CSDN上面,供学习MFC的程序猿们免费下载. 源代码下载: http://download.csd ...
- windows 程序设计 SetPolyFillMode关于ALTERNATE、WINDING的详细解释
看windows程序第五章GDI编程部分.一直卡壳在这里了. 下面我来说下自己的想法.看是否对您有帮助. 首先我们来看一个图. SetPolyFillMode(ALTERNATE); // 系统默认 ...
随机推荐
- jmeter post请求在终端传参,并且指定请求参数文件
命令:jmeter -n -t jmeter_1.jmx -l report/report30.jtl -Jnum=3000 -e -o webresult/3000result ...
- TCP: time wait bucket table overflow
.TCP: time wait bucket table overflow tcp的连接数超出了服务器设置的连接数 1 2 3 4 5 6 [root@test log]# netstat -antp ...
- mybatis返回新增对象的主键
加这两行就可以返回这个插入对象的自增的主键<insert id="insertSeatPortraitData" parameterType="seatPortra ...
- windows 安装 mysql 5.6
从官方网站下载安装包:mysql-5.6.33-winx64.zip,解压到d:\java,然后将解压后的bin目录加入系统环境变量Path中,进入mysql根目录,编辑my-default.ini, ...
- 在idea中把springboot项目打成jar包遇到的问题(没有主清单属性)
正确的姿势:<plugin> <groupId>org.springframework.boot</groupId> <artifactId>sprin ...
- JAVA学习纲要
这份面试题,包含的内容了十九了模块:Java 基础.容器.多线程.反射.对象拷贝.Java Web 模块.异常.网络.设计模式.Spring/Spring MVC.Spring Boot/Spring ...
- redis测试
1,安装redis软件 2,引入redis jar包 3,案例 package test; import java.util.List; import redis.clients.jedis.Jedi ...
- GIS矢量大数据采集
1.使用什么工具采集 2.在哪个网站采集 3.采集哪一种数据 >>地理大数据公众号 >>大数据公众号 >>智能数据湖公众号 点.线.面.体 可视化 >> ...
- windows下使用Ant编译Android项目
1. 安装ant,配置环境变量 2. 执行命令: android update project -p 项目路径 例:android update project -p D:\project\UI_de ...
- web css
CSS圆角——透明圆角化背景图片 序言:第一章中我介绍了最基本的纯CSS圆角框的实现原理,并给出Demo,在本章中会对上一个模型作一些新的创新,实现将背景图片透明圆角化.并给出一些漂亮的通用演示效果. ...