黃易群俠傳M脫機外掛應用程式黃易神行
11393
9

[分享] VB模擬按鍵終極教程,有了它,什麼遊戲都不怕!第三集

呆信 發表於 2009-3-20 14:58:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |
DOS時代,當用戶按下或者放開一個鍵時,就會產生一個鍵盤中斷(如果鍵盤中斷是允許的),這樣程式會跳轉到BIOS中的鍵盤中斷處理程式去執行。
打開windows的設備管理器,可以查看到鍵盤控制器由兩個埠控制。其中&H60是資料埠,可以讀出鍵盤資料,而&H64是控制埠,用來發出控制信號。
也就是,從&H60號埠可以讀此鍵盤的按鍵資訊,當從這個埠讀取一個位元組,該位元組的低7位元就是按鍵的掃描碼,而高1位則表示是按下鍵還是釋放鍵。
當按下鍵時,最高位為0,稱為通碼,當釋放鍵時,最高位為1,稱為斷碼。既然從這個埠讀數據可以獲得按鍵資訊,那麼向這個埠寫入資料就可以類比按鍵了!
用過QbASIC4.5的朋友可能知道,QB中有個OUT命令可以向指定埠寫入資料,而INP函數可以讀取指定埠的資料。


那我們先看看如果用QB該怎麼寫代碼:
假如你想模擬按下一個鍵,這個鍵的掃描碼為&H50,那就這樣
OUT &H64,&HD2
'
把資料&HD2發送到&H64埠。這是一個KBC指令,表示將要向鍵盤寫入資料

OUT &H60,&H50
'
把掃描碼&H50發送到&H60埠,表示類比按下掃描碼為&H50的這個鍵

那麼要釋放這個鍵呢?像這樣,發送該鍵的斷碼:
OUT &H64,&HD2
'
把資料&HD2發送到&H64埠。這是一個KBC指令,表示將要向鍵盤寫入資料

OUT &H60,(&H50 OR &H80)
'
把掃描碼&H50與資料&H80進行或運算,可以把它的高位置1,得到斷碼,表示釋放這個鍵

    好了,現在的問題就是在VB中如何向埠寫入資料了。因為在windows中,普通應用程式是無權操作埠的,於是我們就需要一個驅動程式來幫助我們實現。
在這塈畯怚i以使用一個元件WINIO來完成讀寫埠操作。什麼是WINIO

WINIO是一個全免費的、無需註冊的、含根源程式的WINDOWS2000埠操作驅動程式元件

它不僅可以操作埠,還可以操作記憶體;不僅能在VB下用,還可以在DELPHIVC等其他環境下使用,性能特別優異。
下載該元件,解壓縮後可以看到幾個檔夾,其中Release檔夾下的3個檔就是我們需要的,這3個檔是WinIo.sys(用於win xp下的驅動程式)

WINIO.VXD(用於win 98下的驅動程式)WinIo.dll(封裝函數的動態連結程式庫),我們只需要調用WinIo.dll中的函數,

然後WinIo.dll就會安裝並調用驅動程式來完成相應的功能。值得一提的是這個元件完全是綠色的,無需安裝,你只需要把這3個檔複製到與你的程式相同的檔夾下就可以使用了。
用法很簡單,先用堶悸InitializeWinIo函數安裝驅動程式,然後就可以用GetPortVal來讀取埠或者用SetPortVal來寫入埠了。


好,讓我們來做一個驅動級的鍵盤類比吧。
先把winio3個檔拷貝到你的程式的檔夾下,然後在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
'
鍵盤命令埠

Publi●CSOL木馬網站●ATA = &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
[/quote]
運行上面的程式,就會每隔3秒鐘模擬按下一次A鍵,試試看,怎麼樣,是不是對所有程式都有效果了?
需要注意的問題:
要在VB的調試模式下使用WINIO,需要把那3個檔拷貝到VB的安裝目錄中。
鍵盤上有些鍵屬於擴展鍵(比如鍵盤上的方向鍵就是擴展鍵),對於擴展鍵不應該用上面的MyKeyDownMyKeyUp過程來模擬,可以使用下面的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事件應該發送兩次。
也就是說,如果我想模擬先按下一個擴展鍵,再按下一個普通鍵,那麼就應該向埠發送兩次該普通鍵被按下的資訊。
比如,我想模擬先按下左方向鍵,再按下空白鍵這個事件,由於左方向鍵是擴展鍵,空白鍵是普通鍵,那麼流程就應該是這樣的:
[quote]MyKeyDownEx VK_LEFT
'
按下左方向鍵

Sleep 200
'
延時200毫秒

MyKeyUpEx VK_LEFT
'
釋放左方向鍵

Sleep 500
MyKeyDown VK_SPACE
'
按下空白鍵,注意要發送兩次

MyKeyDown VK_SPACE
Sleep 200
MyKeyUp VK_SPACE
'
釋放空白鍵

好了,相信到這堙A你的類比按鍵程式也就差不多了,
4.骨灰級模擬
    方法3算是很底層的類比了,我現在還沒有發現有它類比無效的程式。
但是如果你用盡上面所有的方法,仍然無效的話,那麼還有最後一個方法,絕對對任何程式都會有效,那就是:把鍵盤拿出來,老老實實地按下去吧。~~~~





收藏收藏 分享分享 讚 幹 分享分享 FB分享
回覆

使用道具 舉報


dduoduo 當前離線
UID
1151669
熱心
207 值
嘉獎
0 次
違規
0 次
在線時間
97 小時
經驗
200 點
積分
200
精華
0
最後登錄
2013-3-18
閱讀權限
25
註冊時間
2009-3-11
論壇幣
55 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 3
dduoduo 2009-3-23 23:15:21
大大寫的很詳細.又偷學了一樣.改天來去試試.感恩唷YCT51B
回覆

使用道具 舉報

Goldenwolf 當前離線
UID
1166302
熱心
75 值
嘉獎
0 次
違規
0 次
在線時間
17 小時
經驗
75 點
積分
426
精華
0
最後登錄
2009-10-8
閱讀權限
25
註冊時間
2009-3-28
論壇幣
259 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 3
Goldenwolf 2009-3-31 11:55:23
為什麼程式碼內會出現木馬? 不過還是感謝大大的分享!!
回覆

使用道具 舉報

HIhi~all 當前離線
UID
544441
熱心
111 值
嘉獎
0 次
違規
0 次
在線時間
59 小時
經驗
112 點
積分
282
精華
0
最後登錄
2015-8-18
閱讀權限
25
註冊時間
2007-9-12
論壇幣
22 幣
聯合幣
3 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 3
HIhi~all 2009-4-1 18:57:43
感謝你無私的心得分享
本文章轉自外掛聯合國http://www.wgun.net
回覆

使用道具 舉報

110000 該用戶已被刪除
5
110000 2009-4-10 02:44:35
提示: 作者被禁止或刪除 內容自動屏蔽
回覆

使用道具 舉報

28512 當前離線
UID
250792
熱心
12 值
嘉獎
0 次
違規
0 次
在線時間
5 小時
經驗
6 點
積分
39
精華
0
最後登錄
2018-8-6
閱讀權限
20
註冊時間
2007-2-27
論壇幣
9 幣
聯合幣
6 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
6
28512 2009-4-12 19:57:50
這個好像已經在網路上流傳很久了....好像是從對岸那邊過來的,測試的系統好像都是win2K

PS:用別人的程式or檔案總是會怕有問題,還是自己寫的比較安全~"~

[ 本帖最後由 28512 於 2009-4-12 21:09 編輯 ]
回覆

使用道具 舉報

ade 當前離線
UID
62855
熱心
10 值
嘉獎
0 次
違規
0 次
在線時間
3 小時
經驗
10 點
積分
10
精華
0
最後登錄
2009-8-7
閱讀權限
10
註冊時間
2006-10-20
論壇幣
28 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 1
7
ade 2009-8-7 08:20:37

回覆 1樓 的文章

YCT18B YCT18B
多謝這位大大  毫不保留的分享
回覆

使用道具 舉報

隨火 當前離線
UID
1294953
熱心
214 值
嘉獎
0 次
違規
0 次
在線時間
6 小時
經驗
14 點
積分
14
精華
0
最後登錄
2011-4-5
閱讀權限
10
註冊時間
2009-8-20
論壇幣
78 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 1
8
隨火 2009-9-1 09:50:22
真是深入淺出
太強了吧
謝謝你熱情的教學無私的分享
回覆

使用道具 舉報

ooxx21036 當前離線
UID
1317756
熱心
20 值
嘉獎
0 次
違規
0 次
在線時間
0 小時
經驗
20 點
積分
20
精華
0
最後登錄
2009-9-25
閱讀權限
20
註冊時間
2009-9-25
論壇幣
41 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
9
ooxx21036 2009-9-25 17:36:59
感謝大大的分享
很少看到這麼詳盡的教學文章
回覆

使用道具 舉報

~帥氣冰~ 當前離線
UID
1311163
熱心
357 值
嘉獎
0 次
違規
0 次
在線時間
169 小時
經驗
554 點
積分
554
精華
0
最後登錄
2012-9-2
閱讀權限
30
註冊時間
2009-9-13
論壇幣
237 幣
聯合幣
11 枚
幸運鑽
0 顆
招待卷
0 點
查看個人網站 查看詳細資料
Rank: 4Rank: 4
10
~帥氣冰~ 2009-10-17 10:20:29
來看第三集嚕
YA
大大辛苦囉....
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊


手機版 | Archiver | 外掛聯合國

GMT+8, 2024-9-20 23:38 , Processed in 0.073779 second(s), 16 queries , Memcache On.

版權說明:
  本站不會製作、經銷、代理外掛程式。僅免費提供外掛程式下載前之掃毒及掃木馬等安全檢測驗證,協助會員遠離盜號危險程式。本站所有資料均來自網際網路收集整理,說明文字暨下載連結轉載自原程 式開發站。站上出現之公司名稱、遊戲名稱、程式等,商標及著作權,均歸各公司及程式原創所有,本站程式所有權歸外掛聯合國所有。本程式所有權歸外掛聯合國所有.......

回頂部
第二步?
第三步?