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