為你介紹什么是VB.NET虛擬碼
接觸過(guò)編程2年的朋友都知道,其實(shí)編程就是那么點(diǎn)事,現(xiàn)在我們就簡(jiǎn)單的看看關(guān)于VB.NET虛擬碼的問(wèn)題。當(dāng)用戶(hù)按下鍵盤(pán)上的一個(gè)鍵時(shí),鍵盤(pán)內(nèi)的芯片會(huì)檢測(cè)到這個(gè)動(dòng)作,并把這個(gè)信號(hào)傳送到計(jì)算機(jī)。如何區(qū)別是哪一個(gè)鍵被按下了呢?鍵盤(pán)上的所有按鍵都有一個(gè)編碼,稱(chēng)作鍵盤(pán)掃描碼。當(dāng)你按下一個(gè)鍵時(shí),這個(gè)鍵的掃描碼就被傳給系統(tǒng)。掃描碼是跟具體的硬件相關(guān)的,同一個(gè)鍵,在不同鍵盤(pán)上的掃描碼有可能不同。鍵盤(pán)控制器就是將這個(gè)掃描碼傳給計(jì)算機(jī),然后交給鍵盤(pán)驅(qū)動(dòng)程序。鍵盤(pán)驅(qū)動(dòng)程序會(huì)完成相關(guān)的工作,并把這個(gè)掃描碼轉(zhuǎn)換為鍵盤(pán)虛擬碼。
什么是VB.NET虛擬碼呢?因?yàn)閽呙璐a與硬件相關(guān),不具有通用性,為了統(tǒng)一鍵盤(pán)上所有鍵的編碼,于是就提出了VB.NET虛擬碼概念。無(wú)論什么鍵盤(pán),同一個(gè)按鍵的虛擬碼總是相同的,這樣程序就可以識(shí)別了。簡(jiǎn)單點(diǎn)說(shuō),虛擬碼就是我們經(jīng)??梢钥吹降南馰K_A,VK_B這樣的常數(shù),比如鍵A的虛擬碼是65,寫(xiě)成16進(jìn)制就是&H41,注意,人們經(jīng)常用16進(jìn)制來(lái)表示虛擬碼。
#T#鍵盤(pán)驅(qū)動(dòng)程序把掃描碼轉(zhuǎn)換為虛擬碼后,會(huì)把這個(gè)鍵盤(pán)操作的掃描碼和虛擬碼還有其它信息一起傳遞給操作系統(tǒng)。然后操作系統(tǒng)則會(huì)把這些信息封裝在一個(gè)消息中,并把這個(gè)鍵盤(pán)消息插入到消息列隊(duì)。最后,要是不出意外的話(huà),這個(gè)鍵盤(pán)消息最終會(huì)被送到當(dāng)前的活動(dòng)窗口那里,活動(dòng)窗口所在的應(yīng)用程序接收到這個(gè)消息后,就知道鍵盤(pán)上哪個(gè)鍵被按下,也就可以決定該作出什么響應(yīng)給用戶(hù)了。這個(gè)過(guò)程可以簡(jiǎn)單的如下表示:
用戶(hù)按下按鍵-----鍵盤(pán)驅(qū)動(dòng)程序?qū)⒋耸录鬟f給操作系統(tǒng)-----操作系統(tǒng)將鍵盤(pán)事件插入消息隊(duì)列-----鍵盤(pán)消息被發(fā)送到當(dāng)前活動(dòng)窗口
明白了這個(gè)過(guò)程,我們就可以編程實(shí)現(xiàn)在其中的某個(gè)環(huán)節(jié)來(lái)模擬鍵盤(pán)操作了。在VB中,有多種方法可以實(shí)現(xiàn)鍵盤(pán)模擬,我們就介紹幾種比較典型的。
局部級(jí)模擬
從上面的流程可以看出,鍵盤(pán)事件是最終被送到活動(dòng)窗口,然后才引起目標(biāo)程序響應(yīng)的。那么最直接的模擬方法就是:直接偽造一個(gè)鍵盤(pán)消息發(fā)給目標(biāo)程序。哈哈,這實(shí)在是很簡(jiǎn)單,windows提供了幾個(gè)這樣的API函數(shù)可以實(shí)現(xiàn)直接向目標(biāo)程序發(fā)送消息的功能,常用的有SendMessage和 PostMessage,它們的區(qū)別是PostMessage函數(shù)直接把消息仍給目標(biāo)程序就不管了,而SendMessage把消息發(fā)出去后,還要等待目標(biāo)程序返回些什么東西才好。這里要注意的是,模擬鍵盤(pán)消息一定要用PostMessage函數(shù)才好,用SendMessage是不正確的(因?yàn)槟M鍵盤(pán)消息是不需要返回值的,不然目標(biāo)程序會(huì)沒(méi)反應(yīng)),切記切記!PostMessage函數(shù)的VB聲明如下:
- Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)
As Long
參數(shù)hwnd 是你要發(fā)送消息的目標(biāo)程序上某個(gè)控件的句柄,參數(shù)wMsg 是消息的類(lèi)型,表示你要發(fā)送什么樣的消息,最后wParam 和lParam 這兩個(gè)參數(shù)是隨消息附加的數(shù)據(jù),具體內(nèi)容要由消息決定。
再來(lái)看看wMsg 這個(gè)參數(shù),要模擬按鍵就靠這個(gè)了。鍵盤(pán)消息常用的有如下幾個(gè):
WM_KEYDOWN 表示一個(gè)普通鍵被按下
WM_KEYUP 表示一個(gè)普通鍵被釋放
WM_SYSKEYDOWN 表示一個(gè)系統(tǒng)鍵被按下,比如Alt鍵
WM_SYSKEYUP 表示一個(gè)系統(tǒng)鍵被釋放,比如Alt鍵