總有一天你會明白,能治愈你的,從來都不是時間,而是心理的那股釋懷和淡然。。。。
---- 網易雲熱評
一、鍵盤消息
1、鍵盤消息
WM_KEYDOWN:按鍵被按下時産生
WM_KEYUP:按鍵被放開時産生
WM_SYSKEYDOWN:系統鍵按下時産生 比如ALT、F10
WM_SYSKEYUP:系統鍵放開時産生
WM_CHAR :字符消息(TranslateMessage函數發送的)
2、消息參數
按鍵消息:
WPARAM:按鍵的Virtual Key
LPARAM:按鍵的參數,例如按下次數
WM_CHAR消息:
WPARAM:輸入的字符的ASCII字符編碼值
LPARAM:按鍵的相關參數
3、消息的使用
KEYDOWN可以重複出現,KEYUP隻能在按鍵松開時出現1次
TranslateMessage在轉換WM_KEYDOWN消息時,對于可見字符可以産生WM_CHAR,不可見字符無此消息。
WM_KEYDOWN/UP的wParam是表示的按鍵的虛拟鍵碼值
WM_CHAR的wParam是表示輸入的字符的ASCII編碼值。
4、相關代碼
#include <windows.h>
#include <stdio.h>
HINSTANCE g_hInstance = 0;//接收當前程序實例句柄
HANDLE g_輸出句柄 = 0;//接收标準輸出句柄
void 按下鍵(HWND hWnd,WPARAM wParam)
{
wchar_t s[256] = {0};
swprintf_s(s, L"按下:X\n", wParam);
WriteConsole(g_輸出句柄, s, wcslen(s), NULL, NULL);
return;
}
void 放開鍵(HWND hWnd, WPARAM wParam)
{
wchar_t s[256] = { 0 };
swprintf_s(s, L"松開:X\n", wParam);
WriteConsole(g_輸出句柄, s, wcslen(s), NULL, NULL);
return;
}
void 字符消息(HWND hWnd, WPARAM wParam)
{
wchar_t s[256] = { 0 };
swprintf_s(s, L"字符消息:X\n", wParam);
WriteConsole(g_輸出句柄, s, wcslen(s), NULL, NULL);
return;
}
//2、窗口處理函數
LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID,
WPARAM wParam, LPARAM lParam)
{
//7、處理消息
switch (msgID)
{
case WM_CHAR:
字符消息(hWnd, wParam);
break;
case WM_KEYUP:
放開鍵(hWnd, wParam);
break;
case WM_KEYDOWN:
按下鍵(hWnd,wParam);
break;
case WM_DESTROY:
PostQuitMessage(0);//銷毀窗口
break;
}
return DefWindowProc(hWnd, msgID, wParam, lParam);
}
//3、注冊函數,第一個參數,窗口類名稱,第二個參數,指向窗口處理函數的函數指針
void Register(LPCWSTR lpClassName, WNDPROC winProc)
{
WNDCLASSEX wc = { 0 };
wc.cbSize = sizeof(wc);//結構體大小
wc.cbClsExtra = 0;//窗口類的申請緩存區,0表示不開啟緩存
wc.cbWndExtra = 0;//窗口的申請緩存區,0表示不開啟緩存
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW 1);//背景顔色,一般白色
wc.hCursor = NULL;//設置光标。null表示默認
wc.hIcon = NULL;//默認左上角的圖标
wc.hInstance = g_hInstance;//第一個參數實例句柄,可以找到進程在那塊内存
wc.lpfnWndProc = winProc; //lp 一般都是指針,處理函數名或指針
wc.lpszClassName = lpClassName;//窗口類名稱,比如公司名字
wc.lpszMenuName = NULL;//沒有菜單用null
wc.style = CS_HREDRAW | CS_VREDRAW;//窗口變化,會重繪,窗口類的一般風格
RegisterClassEx(&wc);
}
//4、創建窗口,(窗口類名稱,窗口标題欄名稱)
HWND CreateMain(LPCWSTR lpClassName, LPCWSTR lpWindowName)
{
HWND hWnd = CreateWindowExW(0, lpClassName, lpWindowName, WS_OVERLAPPEDWINDOW, 100, 100, 500, 600, NULL, NULL, g_hInstance, NULL);
return hWnd;
}
//5、顯示窗口(窗口句柄)
void Display(HWND hWnd)
{
ShowWindow(hWnd, SW_SHOW);//句柄,顯示方式
UpdateWindow(hWnd);//調用一次刷新窗口
}
//6、消息循環
void Message()
{
MSG nMsg = { 0 };
while (GetMessage(&nMsg, nullptr, 0, 0))
{
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);
}
}
//1、入口函數
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevIns, LPSTR lpCmdLine, int nCmdShow)
{
AllocConsole();//顯示dos窗口
g_輸出句柄 = GetStdHandle(STD_OUTPUT_HANDLE);
g_hInstance = hInstance;
Register(L"主", WndProc);
HWND hWnd = CreateMain(L"主", L"主窗口");
Display(hWnd);
Message();
return 0;
}
5、運行結果
歡迎關注公衆号:順便編點程
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!