1. 程式人生 > >Windows核心程式設計_Edit控制元件無法輸入問題

Windows核心程式設計_Edit控制元件無法輸入問題

最近博主遇到一個很奇怪的問題:

CreateWindow(   //edit控制元件
		"edit",
		"",
		WS_VISIBLE | WS_CHILD | WS_BORDER/*|DT_CENTER*/ | DT_VCENTER,
		100, 70, 100, 25,
		hWnd,
		NULL,
		NULL,
		NULL);

建立了一個edit控制元件,看起來沒有什麼問題,執行一下:

會發現無論怎樣敲擊鍵盤,Edit都不會接收鍵盤輸入的字元,經過博主的除錯以及摸索發現:EDIT控制元件只接受WM_CHAR字元訊息,而不是WM_KEYDEMO這樣的虛擬鍵程式碼訊息,所以我們需要在訊息迴圈函式裡使用:

TranslateMessage來將虛擬鍵程式碼訊息轉換成WM_CHAR訊息派發出去:

// 獲取訊息
	while (GetMessage(&msg, NULL, 0, 0)) // 當接收到WM_QIUT訊息時,GetMessage函式返回0,結束迴圈
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg); // 派發訊息,到WindowPro函式處理
	}

再次執行就發現可以輸入了:

但是還有一個問題,是博主沒有加TranslateMessage的時候使用輸入法漢字模式下可以輸入,原因在於:當我們把焦點放到一個窗體或控制元件上的時候,按下鍵盤上的任何按鍵,輸入法會自動獲取焦點視窗控制代碼,然後將我們所按下的每一個按鍵在自己的漢字型檔裡面尋找,將結果儲存成一個連結串列,每一個漢字沒有具體的ascii碼錶的對應,因為編碼的不同,比如:

gb2312:

high8 = 0xa1-->0xfe (161 - 254)

low8 = 0xa1-->0xfe  (161 - 254)

gbk:

high8 = 0x80-->0xfe (128 - 254)

low8 = 0x40-->0xfe (64 - 254)

比如你的系統使用的漢字編碼是gbk,那麼你就要傳送兩次,第一次傳送高位,第二次傳送低位即可!

而edit控制元件會根據編碼的不同來接受不同的字元資訊,但是edit每次只能處理wm_char訊息一次,當我們傳送漢字的時候需要兩次,但是漢字對應的ascii碼不在英文的ascii碼的對應表裡,所以edit會認為這是一個漢字,就等待下一次的接受,下一次接受的資料會在編碼表裡尋找對應的編碼,如果長時間沒有收到則會視為無效ascii 碼,打印出未知的字元!

但是如果你的系統是unicode(包含utf-16)編碼(寬位元組底層也是這種編碼),一次發完即可!

這裡在補充一個小知識,那就是每個鍵盤的鍵程式碼可能不一樣,也就是掃描碼,當出廠商在製作鍵盤時,每按下一個按鍵,都會修改指定暫存器裡的值,這個值裡面包含了鍵程式碼,但是有的鍵程式碼可能不一樣,所以誕生了驅動檔案來告訴作業系統鍵程式碼對應什麼鍵!