亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 見招拆招windows程序設計(五).txt

?? 會變語言實現的一些程序
?? TXT
?? 第 1 頁 / 共 5 頁
字號:
WndProc endp
END START

      
    	

        
字符消息


    前面討論了利用位移狀態信息把按鍵消息翻譯為字符消息的方法,并且提到,僅利用轉換狀態信息還不夠,因為還需要知道與國家/地區有關的鍵盤配置。由于這個原因,您不應該試圖把按鍵消息翻譯為字符代碼。Windows會為您完成這一工作,在前面我們曾看到過以下的程序代碼:

while       (GetMessage (&msg, NULL, 0, 0))
        
{
        
    TranslateMessage (&msg) ;
        
    DispatchMessage (&msg) ;
        
}
        
    這是WinMain中典型的消息循環。GetMessage函數用隊列中的下一個消息填入msg結構的字段。DispatchMessage以此消息為參數呼叫適當的窗口消息處理程序。

    在這兩個函數之間是TranslateMessage函數,它將按鍵消息轉換為字符消息。如果消息為WM_KEYDOWN或者WM_SYSKEYDOWN,并且按鍵與位移狀態相組合產生一個字符,則TranslateMessage把字符消息放入消息隊列中。此字符消息將是GetMessage從消息隊列中得到的按鍵消息之后的下一個消息。

四類字符消息


字符消息可以分為四類,如表6-9所示。

表6-9
 


  字符
 死字符
 
非系統字符 WM_CHAR WM_DEADCHAR 
系統字符 WM_SYSCHAR WM_SYSDEADCHAR 

    WM_CHAR和WM_DEADCHAR消息是從WM_KEYDOWN得到的;而WM_SYSCHAR和WM_SYSDEADCHAR消息是從WM_SYSKEYDOWN     消息得到的(我將簡要地討論一下什么是死字符)。

    有一個好消息:在大多數情況下,Windows程序會忽略除WM_CHAR之外的任何消息。伴隨四個字符消息的lParam參數與產生字符代碼消息的按鍵消息之lParam參數相同。不過,參數wParam不是虛擬鍵碼。實際上,它是ANSI或Unicode字符代碼。

    這些字符消息是我們將文字傳遞給窗口消息處理程序時遇到的第一個消息。它們不是唯一的消息,其它消息伴隨以0結尾的整個字符串。窗口消息處理程序是如何知道該字符是8位的ANSI字符還是16位的Unicode寬字符呢?很簡單:任何與您用RegisterClassA(RegisterClass的ANSI版)注冊的窗口類別相聯系的窗口消息處理程序,都會獲得含有ANSI字符代碼的消息。如果窗口消息處理程序用RegisterClassW(RegisterClass的寬字符版)注冊,那么傳遞給窗口消息處理程序的消息就帶有Unicode字符代碼。如果程序用RegisterClass注冊窗口類別,那么在UNICODE標識符被定義時就呼叫RegisterClassW,否則呼叫RegisterClassA。

    除非在程序寫作的時候混合了ANSI和Unicode的函數與窗口消息處理程序,用WM_CHAR消息(及其它三種字符消息)說明的字符代碼將是:

(TCHAR) wParam
        
    同一個窗口消息處理程序可能會用到兩個窗口類別,一個用RegisterClassA注冊,而另一個用RegisterClassW注冊。也就是說,窗口消息處理程序可能會獲得一些ANSI字符代碼消息和一些Unicode字符代碼消息。如果您的窗口消息處理程序需要曉得目前窗口是否處理Unicode消息,則它可以呼叫:

fUnicode = IsWindowUnicode (hwnd) ;
        
    如果hwnd的窗口消息處理程序獲得Unicode消息,那么變量fUnicode將為TRUE,這表示窗口是用RegisterClassW注冊的窗口類別。

消息順序


    因為TranslateMessage函數從WM_KEYDOWN和WM_SYSKEYDOWN消息產生了字符消息,所以字符消息是夾在按鍵消息之間傳遞給窗口消息處理程序的。例如,如果Caps Lock未打開,而使用者按下再釋放A鍵,則窗口消息處理程序將接收到如表6-10所示的三個消息:

表6-10
 


消息
 按鍵或者代碼
 
WM_KEYDOWN 「A」的虛擬鍵碼(0x41) 
WM_CHAR 「a」的字符代碼(0x61) 
WM_KEYUP 「A」的虛擬鍵碼(0x41) 

    如果您按下Shift鍵,再按下A鍵,然后釋放A鍵,再釋放Shift鍵,就會輸入大寫的A,而窗口消息處理程序會接收到五個消息,如表6-11所示:

表6-11
 


消息
 按鍵或者代碼
 
WM_KEYDOWN 虛擬鍵碼VK_SHIFT (0x10) 
WM_KEYDOWN 「A」的虛擬鍵碼(0x41) 
WM_CHAR 「A」的字符代碼(0x41) 
WM_KEYUP 「A」的虛擬鍵碼(0x41) 
WM_KEYUP 虛擬鍵碼VK_SHIFT(0x10) 

Shift鍵本身不產生字符消息。

如果使用者按住A鍵,以使自動重復產生一系列的按鍵,那么對每條WM_KEYDOWN消息,都會得到一條字符消息,如表6-12所示:

表6-12
 


消息
 按鍵或者代碼
 
WM_KEYDOWN 「A」的虛擬鍵碼(0x41) 
WM_CHAR 「a」的字符代碼(0x61) 
WM_KEYDOWN 「A」的虛擬鍵碼(0x41) 
WM_CHAR 「a」的字符代碼(0x61) 
WM_KEYDOWN 「A」的虛擬鍵碼(0x41) 
WM_CHAR 「a」的字符代碼(0x61) 
WM_KEYDOWN 「A」的虛擬鍵碼(0x41) 
WM_CHAR 「a」的字符代碼(0x61) 
WM_KEYUP 「A」的虛擬鍵碼(0x41) 

如果某些WM_KEYDOWN消息的重復計數大于1,那么相應的WM_CHAR消息將具有同樣的重復計數。

組合使用Ctrl鍵與字母鍵會產生從0x01(Ctrl-A)到0x1A(Ctrl-Z)的ASCII控制代碼,其中的某些控制代碼也可以由表6-13列出的鍵產生:

表6-13
 


按鍵
 字符代碼
 產生方法
 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-[  

    最右列給出了在ANSI C中定義的控制字符,它們用于描述這些鍵的字符代碼。

    有時Windows程序將Ctrl與字母鍵的組合用作菜單快捷鍵(我將后面一期討論),此時,不會將字母鍵轉換成字符消息。

處理控制字符


    處理按鍵和字符消息的基本規則是:如果需要讀取輸入到窗口的鍵盤字符,那么您可以處理WM_CHAR消息。如果需要讀取光標鍵、功能鍵、Delete、Insert、Shift、Ctrl以及Alt鍵,那么您可以處理WM_KEYDOWN消息。

    但是Tab鍵怎么辦?Enter、Backspace和Escape鍵又怎么辦?傳統上,這些鍵都產生表6-13列出的ASCII控制字符。但是在Windows中,它們也產生虛擬鍵碼。這些鍵應該在處理WM_CHAR或者在處理WM_KEYDOWN期間處理嗎?

    經過10年的考慮(回顧這些年來我寫過的Windows程序代碼),我更喜歡將Tab、Enter、Backspace和Escape鍵處理成控制字符,而不是虛擬鍵。我通常這樣處理WM_CHAR:

case WM_CHAR:
        
            //其它行程序
        
    switch (wParam)
        
    {
        
    case '\b':            // backspace
        
            //其它行程序
        
            break ;
        
    case '\t':            // tab
        
            //其它行程序
        
            break ;
        
    case '\n':            // linefeed
        
            //其它行程序
        
            break ;
        

    case '\r':            // carriage return
        
            //其它行程序
        
            break ;
        

    default:                      // character codes
        
            //其它行程序
        
            break ;
        
    }
        
    return 0 ;
        
死字符消息


    Windows程序經常忽略WM_DEADCHAR和WM_SYSDEADCHAR消息,但您應該明確地知道死字符是什么,以及它們工作的方式。

    在某些非U.S.英語鍵盤上,有些鍵用于給字母加上音調。因為它們本身不產生字符,所以稱之為「死鍵」。例如,使用德語鍵盤時,對于U.S.鍵盤上的+/=鍵,德語鍵盤的對應位置就是一個死鍵,未按下Shift鍵時它用于標識銳音,按下Shift鍵時則用于標識抑音。

    當使用者按下這個死鍵時,窗口消息處理程序接收到一個wParam等于音調本身的ASCII或者Unicode代碼的WM_DEADCHAR消息。當使用者再按下可以帶有此音調的字母鍵(例如A鍵)時,窗口消息處理程序會接收到WM_CHAR消息,其中wParam等于帶有音調的字母「a」的ANSI代碼。

    因此,使用者程序不需要處理WM_DEADCHAR消息,原因是WM_CHAR消息已含有程序所需要的所有信息。Windows的做法甚至還設計了內部錯誤處理。如果在死鍵之后跟有不能帶此音調符號的字母(例如「s」),那么窗口消息處理程序將在一行接收到兩條WM_CHAR消息-前一個消息的wParam等于音調符號本身的ASCII代碼(與傳遞到WM_DEADCHAR消息的wParam值相同),第二個消息的wParam等于字母s的ASCII代碼。

    當然,要感受這種做法的運作方式,最好的方法就是實際操作。您必須加載使用死鍵的外語鍵盤,例如前面講過的德語鍵盤。您可以這樣設定:在「控制面板」中選擇「鍵盤」,然后選擇「語系」頁面標簽。然后您需要一個應用程序,該程序可以顯示它接收的每一個鍵盤消息的詳細信息。下面的KEYVIEW1就是這樣的程序。

鍵盤消息和字符集


    本章剩下的范例程序有缺陷。它們不能在所有版本的Windows下都正常執行。這些缺陷不是特意引過程序代碼中的;事實上,您也許永遠不會遇到這些缺陷。只有在不同的鍵盤語言和鍵盤布局間切換,以及在多字節字符集的遠東版Windows下執行程序時,這些問題才會出現-所以我不愿將它們稱為「錯誤」。

   不過,如果程序使用Unicode編譯并在Windows NT下執行,那么程序會執行得更好。

KEYVIEW1程序


    了解鍵盤國際化問題的第一步,就是檢查Windows傳遞給窗口消息處理程序的鍵盤內容和字符消息。程序6-2所示的KEYVIEW1會對此有所幫助。該程序在顯示區域顯示Windows向窗口消息處理程序發送的8種不同鍵盤消息的全部信息。


程序6-2 KEYVIEW1 

        
KEYVIEW1.ASM
        
;MASMPlus 代碼模板 - 普通的 Windows 程序代碼

.386
.Model Flat, StdCall
Option Casemap :None

Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc
Include libc.inc

includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
IncludeLib msvcrt.lib
include macro.asm
	
	WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
	WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.DATA
	szAppName   db "KeyView1",0
	
   szTop 		DB "Message         Key       Char    Repeat  Scan Ext   ALT Prev Tran",0
   szUnd 		DB "_______         ___       ____    ______  ____ ___   ___ ____ ____",0
        
	szFormat0	DB "%-13s %3d %-15s",0
	szFormat1	db "%-13s            0x%04X%1s%c",0
        
   szYes  		DB "  Yes",0
	szNo   		DB "  No ",0
	szDown 		DB " Down",0
	szUp   		DB	" Up  ",0

	szMessage 	DB	"WM_KEYDOWN    ",0,
						"WM_KEYUP      ",0,
						"WM_CHAR       ",0,
						"WM_DEADCHAR   ",0,
						"WM_SYSKEYDOWN ",0,
						"WM_SYSKEYUP   ",0,
						"WM_SYSCHAR    ",0,
						"WM_SYSDEADCHAR",0
.DATA?
   cLinesMax	DD	?
   cLines 		DD ?
   pmsg 			DD ?
   rectScroll	RECT  <>           
	hInstance	dd ?
   cxClientMax	dd	?
   cyClientMax	dd	?
   cxClient		dd	?
   cyClient		dd	?
   cxChar		dd	?
   cyChar 		dd	?
.CODE

START:   ;從這里開始執行
	invoke   GetModuleHandle,NULL
	mov 		hInstance,eax
	invoke   WinMain,hInstance,NULL,NULL,SW_SHOWDEFAULT
	invoke   ExitProcess,0

WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,iCmdShow:DWORD
	LOCAL wndclass :WNDCLASSEX
	LOCAL msg  		:MSG
	local hWnd 		:HWND
	mov wndclass.cbSize,sizeof WNDCLASSEX	
	mov wndclass.style,CS_HREDRAW or CS_VREDRAW	
	mov wndclass.lpfnWndProc,offset WndProc

	mov wndclass.cbClsExtra,0
	mov

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美国产一区在线观看| 欧美在线一二三四区| 日韩欧美的一区二区| 天天av天天翘天天综合网| 欧美挠脚心视频网站| 亚洲成人精品在线观看| 91精品国产综合久久久久| 蜜臀va亚洲va欧美va天堂| 2023国产精华国产精品| 国产成人免费视频网站| 国产精品美女久久久久高潮| 色综合久久66| 日韩精品电影在线| 国产偷国产偷亚洲高清人白洁| 国产黄人亚洲片| 亚洲日本在线天堂| 欧美人伦禁忌dvd放荡欲情| 美脚の诱脚舐め脚责91 | 夜夜嗨av一区二区三区网页| 欧美在线视频你懂得| 美女网站色91| 亚洲同性同志一二三专区| 欧美日韩亚州综合| 国产在线不卡一区| 亚洲视频一区二区在线| 91精品欧美综合在线观看最新 | 中文字幕乱码一区二区免费| 91视频国产资源| 日本不卡一二三| 欧美国产97人人爽人人喊| 欧美浪妇xxxx高跟鞋交| 国产盗摄视频一区二区三区| 亚洲午夜在线视频| 亚洲国产成人午夜在线一区| 欧美人xxxx| 97久久精品人人澡人人爽| 日本欧美一区二区在线观看| 国产精品卡一卡二| 日韩一区二区影院| 一本大道av伊人久久综合| 国产一区二区三区美女| 亚洲成人777| 亚洲手机成人高清视频| 精品国产乱码久久久久久图片| 97久久精品人人做人人爽50路| 久久福利资源站| 亚洲精品水蜜桃| 国产精品区一区二区三区| 欧美电影免费提供在线观看| 欧美在线不卡一区| 日韩精品一区二| 99久久99久久精品免费看蜜桃| 亚洲国产视频网站| 国产精品久久久久影院色老大| 日韩免费高清电影| 欧美日韩一区二区在线视频| 成人高清视频免费观看| 久久电影国产免费久久电影| 亚洲成人自拍网| 亚洲精品午夜久久久| 中文在线资源观看网站视频免费不卡| 91精品国产欧美一区二区成人 | 成人免费视频一区| 狠狠色综合色综合网络| 日韩精品免费专区| 亚洲一区二区三区四区五区中文 | 国产精品午夜春色av| 精品久久国产字幕高潮| 欧美日韩精品专区| 成人免费毛片app| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | av亚洲精华国产精华精| 国产成人一级电影| 国产美女精品在线| 激情欧美日韩一区二区| 久久狠狠亚洲综合| 久久超碰97中文字幕| 狠狠狠色丁香婷婷综合激情| 九九视频精品免费| 国产麻豆9l精品三级站| 风间由美一区二区av101| 粉嫩av亚洲一区二区图片| 丁香亚洲综合激情啪啪综合| 成人三级在线视频| 日本道精品一区二区三区| 欧美午夜寂寞影院| 欧美欧美午夜aⅴ在线观看| 欧美一区二区三区人| 日韩免费视频一区二区| 久久精品这里都是精品| 中文av字幕一区| 一区二区三区中文字幕在线观看| 亚洲欧美激情一区二区| 亚洲电影一级片| 国产综合色精品一区二区三区| 国产91清纯白嫩初高中在线观看| eeuss鲁片一区二区三区| 91精品福利视频| 91麻豆精品91久久久久久清纯| 日韩精品一区二区三区在线观看| 久久精品综合网| 亚洲综合男人的天堂| 丝袜亚洲精品中文字幕一区| 黄色资源网久久资源365| 成人黄色小视频在线观看| 欧美最猛黑人xxxxx猛交| 日韩一级黄色大片| 中文字幕巨乱亚洲| 亚洲高清久久久| 国产福利电影一区二区三区| 色综合咪咪久久| 日韩三级视频在线看| 成人免费一区二区三区在线观看| 亚洲韩国一区二区三区| 国产成人在线观看免费网站| 91福利小视频| 欧美精品一区二区三区久久久| 中文字幕在线视频一区| 日韩国产成人精品| 成人免费视频国产在线观看| 欧美高清hd18日本| 中文字幕欧美三区| 免费精品99久久国产综合精品| 国产suv一区二区三区88区| 欧美精品久久天天躁| 国产精品乱码人人做人人爱 | 亚洲成av人片| 成人免费视频一区| 日韩一级黄色片| 亚洲蜜臀av乱码久久精品| 奇米色一区二区三区四区| aaa亚洲精品| 久久久久久一级片| 亚洲1区2区3区4区| 99精品热视频| 久久久99精品免费观看不卡| 亚洲成av人片在线观看无码| 不卡视频一二三四| 2020国产精品| 日韩高清一区二区| 欧美日韩久久久一区| 亚洲视频精选在线| 国产精品一二三在| 日韩一区二区三区观看| 亚洲一区二区三区四区在线| 不卡视频一二三四| 欧美极品xxx| 国产大陆精品国产| 久久―日本道色综合久久| 日本女人一区二区三区| 欧美图区在线视频| 一区二区三区中文在线| 9人人澡人人爽人人精品| 久久久久久久久岛国免费| 蜜臀久久99精品久久久久久9| 欧美日韩一区二区三区免费看| 亚洲素人一区二区| www.亚洲精品| 综合精品久久久| 91影视在线播放| 亚洲乱码国产乱码精品精可以看| 成人丝袜视频网| 日韩一区欧美小说| 99久久精品免费观看| 国产精品国产三级国产aⅴ无密码| 国产1区2区3区精品美女| 国产日韩精品视频一区| 成人一区二区三区视频| 中文成人av在线| 91丝袜高跟美女视频| 亚洲欧美日韩小说| 欧美色精品天天在线观看视频| 亚洲福中文字幕伊人影院| 欧美优质美女网站| 亚洲sss视频在线视频| 4438成人网| 久久99国产精品久久99果冻传媒| 久久亚洲春色中文字幕久久久| 国产精品1024久久| ㊣最新国产の精品bt伙计久久| 大胆欧美人体老妇| 一区二区三区四区国产精品| 欧美亚州韩日在线看免费版国语版| 亚洲小说春色综合另类电影| 91精品国产综合久久久久久久久久 | 青青草一区二区三区| 欧美精品一区二区精品网| 国产麻豆91精品| |精品福利一区二区三区| 欧美日韩精品一区二区三区四区 | 亚洲第一主播视频| 欧美一区二区三区免费在线看| 久久精品国产免费| 国产日韩欧美综合一区| 色综合一个色综合| 日韩电影在线观看网站| 久久美女艺术照精彩视频福利播放 | 一区二区三区四区高清精品免费观看| 欧美久久久久中文字幕| 国产精品一级二级三级|