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