重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
在工具箱上右擊-自定義工具箱-在com組件中找到vbnetwinsock控件。VB中使用方法是工程-部件-MicrosoftWinsockControl6.0然后把工具條中的MWC控件拖入窗體中也可以直接雙擊。
蔡甸ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為創新互聯的ssl證書銷售渠道,可以享受市場價格4-6折優惠!如果有意向歡迎電話聯系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
先用里面的InitializeWinIo函數安裝驅動程序,然后就可以用GetPortVal來讀取端口或者用SetPortVal來寫入端口了。好,讓我們來做一個驅動級的鍵盤模擬吧。先把winio的3個文件拷貝到你的程序的文件夾下,然后在VB中新建一個工程,添加一個模塊,在模塊中加入下面的winio函數聲明:
Declare Function MapPhysToLin Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysSize As Long, ByRef PhysMemHandle) As Long
Declare Function UnmapPhysicalMemory Lib "WinIo.dll" (ByVal PhysMemHandle, ByVal LinAddr) As Boolean
Declare Function GetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByRef PhysVal As Long) As Boolean
Declare Function SetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysVal As Long) As Boolean
Declare Function GetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByRef PortVal As Long, ByVal bSize As Byte) As Boolean
Declare Function SetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByVal PortVal As Long, ByVal bSize As Byte) As Boolean
Declare Function InitializeWinIo Lib "WinIo.dll" () As Boolean
Declare Function ShutdownWinIo Lib "WinIo.dll" () As Boolean
Declare Function InstallWinIoDriver Lib "WinIo.dll" (ByVal DriverPath As String, ByVal Mode As Integer) As Boolean
Declare Function RemoveWinIoDriver Lib "WinIo.dll" () As Boolean
' ------------------------------------以上是WINIO函數聲明-------------------------------------------
Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
'-----------------------------------以上是WIN32 API函數聲明-----------------------------------------
再添加下面這個過程:
Sub KBCWait4IBE() '等待鍵盤緩沖區為空
Dim dwVal As Long
Do
GetPortVal H64, dwVal, 1
'這句表示從H64端口讀取一個字節并把讀出的數據放到變量dwVal中
'GetPortVal函數的用法是GetPortVal 端口號,存放讀出數據的變量,讀入的長度
Loop While (dwVal And H2)
End Sub
上面的是一個根據KBC規范寫的過程,它的作用是在向鍵盤端口寫入數據前等待一段時間,后面將會用到。
然后再添加如下過程,這2個過程用來模擬按鍵:
Public Const KBC_KEY_CMD = H64 '鍵盤命令端口
Public Const KBC_KEY_DATA = H60 '鍵盤數據端口
Sub MyKeyDown(ByVal vKeyCoad As Long)
'這個用來模擬按下鍵,參數vKeyCoad傳入按鍵的虛擬碼
Dim btScancode As Long
btScancode = MapVirtualKey(vKeyCoad, 0)
KBCWait4IBE '發送數據前應該先等待鍵盤緩沖區為空
SetPortVal KBC_KEY_CMD, HD2, 1 '發送鍵盤寫入命令
'SetPortVal函數用于向端口寫入數據,它的用法是SetPortVal 端口號,欲寫入的數據,寫入數據的長度
KBCWait4IBE
SetPortVal KBC_KEY_DATA, btScancode, 1 '寫入按鍵信息,按下鍵
End Sub
Sub MyKeyUp(ByVal vKeyCoad As Long)
'這個用來模擬釋放鍵,參數vKeyCoad傳入按鍵的虛擬碼
Dim btScancode As Long
btScancode = MapVirtualKey(vKeyCoad, 0)
KBCWait4IBE '等待鍵盤緩沖區為空
SetPortVal KBC_KEY_CMD, HD2, 1 '發送鍵盤寫入命令
KBCWait4IBE
SetPortVal KBC_KEY_DATA, (btScancode Or H80), 1 '寫入按鍵信息,釋放鍵
End Sub
定義了上面的過程后,就可以用它來模擬鍵盤輸入了。在窗體模塊中添加一個定時器控件,然后加入以下代碼:
Private Sub Form_Load()
If InitializeWinIo = False Then
'用InitializeWinIo函數加載驅動程序,如果成功會返回true,否則返回false
MsgBox "驅動程序加載失敗!"
Unload Me
End If
Timer1.Interval = 3000
Timer1.Enabled = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
ShutdownWinIo '程序結束時記得用ShutdownWinIo函數卸載驅動程序
End Sub
Private Sub Timer1_Timer()
Dim VK_A As Long = H41
MyKeyDown VK_A
MyKeyUp VK_A '模擬按下并釋放A鍵
End Sub
運行上面的程序,就會每隔3秒鐘模擬按下一次A鍵,試試看,怎么樣,是不是對所有程序都有效果了?
需要注意的問題:
要在VB的調試模式下使用WINIO,需要把那3個文件拷貝到VB的安裝目錄中。
鍵盤上有些鍵屬于擴展鍵(比如鍵盤上的方向鍵就是擴展鍵),對于擴展鍵不應該用上面的MyKeyDown和MyKeyUp過程來模擬,可以使用下面的2個過程來準確模擬擴展鍵:
Sub MyKeyDownEx(ByVal vKeyCoad As Long) '模擬擴展鍵按下,參數vKeyCoad是擴展鍵的虛擬碼
Dim btScancode As Long
btScancode = MapVirtualKey(vKeyCoad, 0)
KBCWait4IBE '等待鍵盤緩沖區為空
SetPortVal KBC_KEY_CMD, HD2, 1 '發送鍵盤寫入命令
KBCWait4IBE
SetPortVal KBC_KEY_DATA, HE0, 1 '寫入擴展鍵標志信息
KBCWait4IBE '等待鍵盤緩沖區為空
SetPortVal KBC_KEY_CMD, HD2, 1 '發送鍵盤寫入命令
KBCWait4IBE
SetPortVal KBC_KEY_DATA, btScancode, 1 '寫入按鍵信息,按下鍵
End Sub
Sub MyKeyUpEx(ByVal vKeyCoad As Long) '模擬擴展鍵彈起
Dim btScancode As Long
btScancode = MapVirtualKey(vKeyCoad, 0)
KBCWait4IBE '等待鍵盤緩沖區為空
SetPortVal KBC_KEY_CMD, HD2, 1 '發送鍵盤寫入命令
KBCWait4IBE
SetPortVal KBC_KEY_DATA, HE0, 1 '寫入擴展鍵標志信息
KBCWait4IBE '等待鍵盤緩沖區為空
SetPortVal KBC_KEY_CMD, HD2, 1 '發送鍵盤寫入命令
KBCWait4IBE
SetPortVal KBC_KEY_DATA, (btScancode Or H80), 1 '寫入按鍵信息,釋放鍵
End Sub
還應該注意的是,如果要從擴展鍵轉換到普通鍵,那么普通鍵的KeyDown事件應該發送兩次。也就是說,如果我想模擬先按下一個擴展鍵,再按下一個普通鍵,那么就應該向端口發送兩次該普通鍵被按下的信息。比如,我想模擬先按下左方向鍵,再按下空格鍵這個事件,由于左方向鍵是擴展鍵,空格鍵是普通鍵,那么流程就應該是這樣的:
MyKeyDownEx VK_LEFT '按下左方向鍵
Sleep 200 '延時200毫秒
MyKeyUpEx VK_LEFT '釋放左方向鍵
Sleep 500
MyKeyDown VK_SPACE '按下空格鍵,注意要發送兩次
MyKeyDown VK_SPACE
Sleep 200
MyKeyUp VK_SPACE '釋放空格鍵
追問:
那怎么模擬打漢字?
回答:
這個只能調用輸入法,然后模擬鍵盤輸入了,要輸入什么都要在程序里定義好。這樣還不如別這么麻煩,設定好要輸入的中文后,發送到剪切板,然后復制出來更簡單。
追問:
對啊,你真聰明,那Ctrl+V的VK_**是多少?
回答:
虛擬按鍵的總結
符號常量 十六進制值 指定的鼠標或鍵盤按鍵
VK_LBUTTON 01 鼠標左鍵
VK_RBUTTON 02 鼠標右鍵
VK_CANCEL 03 Control-break 過程
VK_MBUTTON 04 鼠標中鍵
VK_BACK 08 BACKSPACE 鍵
VK_TAB 09 TAB 鍵
VK_CLEAR 0C CLEAR 鍵
VK_RETURN 0D ENTER 鍵
VK_SHIFT 10 SHIFT 鍵
VK_CONTROL 11 CTRL 鍵
VK_MENU 12 ALT 鍵
VK_PAUSE 13 PAUSE 鍵
VK_CAPITAL 14 CAPS LOCK 鍵
VK_ESCAPE 1B ESC 鍵
VK_SPACE 20 SPACEBAR
VK_PRIOR 21 PAGE UP 鍵
VK_NEXT 22 PAGE DOWN 鍵
VK_END 23 END 鍵
VK_HOME 24 HOME 鍵
VK_LEFT 25 LEFT ARROW 鍵
VK_UP 26 UP ARROW 鍵
VK_RIGHT 27 RIGHT ARROW 鍵
VK_DOWN 28 DOWN ARROW 鍵
VK_SELECT 29 SELECT 鍵
VK_EXECUTE 2B EXECUTE 鍵
VK_SNAPSHOT 2C PRINT SCREEN鍵(用于Windows 3.0及以后版本)
VK_INSERT 2D INS 鍵
VK_DELETE 2E DEL 鍵
VK_HELP 2F HELP鍵
/////////////////////
對于非小鍵盤上的數字鍵和字母鍵,直接在單引號中加入該鍵就行.
比如: a 鍵: 'A'
1 鍵: '1'
/////////////////////////////////
VK_LWIN 5B Left Windows 鍵 (Microsoft自然鍵盤)
VK_RWIN 5C Right Windows 鍵 (Microsoft自然鍵盤)
VK_APPS 5D Applications 鍵 (Microsoft自然鍵盤)
VK_NUMPAD0 60 數字小鍵盤上的 0 鍵
VK_NUMPAD1 61 數字小鍵盤上的 1 鍵
VK_NUMPAD2 62 數字小鍵盤上的 2 鍵
VK_NUMPAD3 63 數字小鍵盤上的 3 鍵
VK_NUMPAD4 64 數字小鍵盤上的 4 鍵
VK_NUMPAD5 65 數字小鍵盤上的 5 鍵
VK_NUMPAD6 66 數字小鍵盤上的 6 鍵
VK_NUMPAD7 67 數字小鍵盤上的 7 鍵
VK_NUMPAD8 68 數字小鍵盤上的 8 鍵
VK_NUMPAD9 69 數字小鍵盤上的 9 鍵
VK_MULTIPLY 6A Multiply 鍵
VK_ADD 6B Add鍵
VK_SEPARATOR 6C Separator 鍵
VK_SUBTRACT 6D Subtract 鍵
VK_DECIMAL 6E Decimal 鍵
VK_DIVIDE 6F Divide 鍵
VK_F1 70 F1 鍵
VK_F2 71 F2 鍵
VK_F3 72 F3 鍵
VK_F4 73 F4 鍵
VK_F5 74 F5 鍵
VK_F6 75 F6 鍵
VK_F7 76 F7 鍵
VK_F8 77 F8 鍵
VK_F9 78 F9 鍵
VK_F10 79 F10 鍵
VK_F11 7A F11 鍵
VK_F12 7B F12 鍵
VK_F13 7C F13 鍵
VK_F14 7D F14 鍵
VK_F15 7E F15 鍵
VK_F16 7F F16 鍵
VK_F17 80H F17 鍵
VK_F18 81H F18 鍵
VK_F19 82H F19 鍵
VK_F20 83H F20 鍵
VK_F21 84H F21 鍵
VK_F22 85H F22 鍵
VK_F23 86H F23 鍵
VK_F24 87H F24 鍵
VK_NUMLOCK 90 NUM LOCK 鍵
VK_SCROLL 91 SCROLL LOCK 鍵
VK_ATTN F6 Attn 鍵
VK_CRSEL F7 CrSel 鍵
VK_EXSEL F8 ExSel 鍵
VK_EREOF F9 Erase EOF 鍵
VK_PLAY FA Play 鍵
VK_ZOOM FB Zoom 鍵
VK_OEM_CLEAR FE Clear 鍵
MyKeyDown(31)// 31是鍵盤上方的數字鍵 1
Sleep(100)
MyKeyUp(31) //上面的down 就是按下 up就是彈起
Sleep(100)
這是不可能完成的任務,.NET平臺不存在開發驅動的能力,你要想在驅動層對鍵盤操作,最好使用C,C++來實現,比較方便。 像現在一些比較出名的網絡游戲,都是在驅動層進行保護的。
1.Windows的API有兩個版本的,比如ANSI的FindWindowA(),Unicode的FindWindowW()
2.兩種聲明的方式
DllImport("user32.dll", CharSet:=CharSet.Auto, EntryPoint:="FindWindow") _
Shared Function FindWindow(ByVal className As String, ByVal windowName As String) As IntPtr
End Function
Declare Auto Function FindWindow Lib "user32.dll" Alias "FindWindow" (ByVal className As String, ByVal windowName As String) As IntPtr