tft每日頭條

 > 科技

 > win32編程實例

win32編程實例

科技 更新时间:2024-06-28 05:26:18

總有一天你會明白,能治愈你的,從來都不是時間,而是心理的那股釋懷和淡然。。。。

---- 網易雲熱評

一、鍵盤消息

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、運行結果

win32編程實例(win32編程--鍵盤消息)1

win32編程實例(win32編程--鍵盤消息)2

歡迎關注公衆号:順便編點程​

win32編程實例(win32編程--鍵盤消息)3

win32編程實例(win32編程--鍵盤消息)4

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved