VB模拟按键终极教程.doc_第1页
VB模拟按键终极教程.doc_第2页
VB模拟按键终极教程.doc_第3页
VB模拟按键终极教程.doc_第4页
VB模拟按键终极教程.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VB模擬按鍵終極教程有了它啥游戏都不怕全局級模擬 你會發現,用上面的方法類比按鍵並不是對所有程式都有效的,有的程式啊,你向它發了一大堆消息,可是它卻一點反應也沒有。這是怎麼回事呢?這就要看具體的情況了,有些程式(特別是一些遊戲)出於某些原因,會禁止用戶對它使用類比按鍵程式,這個怎麼實現呢?比如可以在程式中檢查一下,如果發現自己不是活動視窗,就不接受鍵盤消息。或者仔細檢查一下收到的鍵盤消息,你會發現真實的按鍵和類比的按鍵消息總是有一些小差別,從這些小差別上,目的程式就能判斷出:這是假的!是偽造的!因此,如果用PostMessage發送局部消息類比按鍵不成功的話,你可以試一試全局級的鍵盤消息,看看能不能騙過目的程式。類比全局鍵盤消息常見的可以有以下一些方法:(1) 用API函數keybd_event,這個函數可以用來類比一個鍵盤事件,它的VB聲明為:Declare Sub keybd_event Lib user32 (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)參數bVk表示要類比的按鍵的虛擬碼,bScan表示該按鍵的掃描碼(一般可以傳0),dwFlags表示是按下鍵還是釋放鍵(按下鍵為0,釋放鍵為2),dwExtraInfo是擴展標誌,一般沒有用。比如要模擬按下A鍵,可以這樣:Const KEYEVENTF_KEYUP = &H2keybd_event VK_A, 0, 0, 0按下A鍵keybd_event VK_A, 0, KEYEVENTF_KEYUP, 0釋放A鍵注意有時候按鍵的速度不要太快,否則會出問題,可以用API函數Sleep來進行延時,聲明如下:Declare Sub Sleep Lib kernel32 (ByVal dwMilliseconds As Long)參數dwMilliseconds表示延時的時間,以毫秒為單位。那麼如果要模擬按下功能鍵怎麼做呢?比如要按下Ctrl+C實現拷貝這個功能,可以這樣:keybd_event VK_Ctrl, 0, 0, 0按下Ctrl鍵keybd_event VK_C, 0, 0, 0按下C鍵Sleep 500延時500毫秒keybd_event VK_C, 0, KEYEVENTF_KEYUP, 0釋放C鍵keybd_event VK_Ctrl, 0, KEYEVENTF_KEYUP, 0釋放Ctrl鍵好了,現在你可以試試是不是可以騙過目的程式了,這個函數對大部分的視窗程式都有效,可是仍然有一部分遊戲對它產生的鍵盤事件熟視無睹,這時候,你就要用上bScan這個參數了。一般的,bScan都傳0,但是如果目的程式是一些DirectX遊戲,那麼你就需要正確使用這個參數傳入掃描碼,用了它可以產生正確的硬體事件消息,以被遊戲識別。這樣的話,就可以寫成這樣:keybd_event VK_A, MapVirtualKey(VK_A, 0), 0, 0按下A鍵keybd_event VK_A, MapVirtualKey(VK_A, 0), KEYEVENTF_KEYUP, 0釋放A鍵以上就是用keybd_event函數來類比鍵盤事件。除了這個函數,SendInput函數也可以類比全局鍵盤事件。SendInput可以直接把一條消息插入到消息佇列中,算是比較底層的了。它的VB聲明如下:Declare Function SendInput Lib user32.dll (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As Long參數: nlnprts:定義plnputs指向的結構的數目。plnputs:指向INPUT結構陣列的指標。每個結構代表插人到鍵盤或滑鼠輸入流中的一個事件。cbSize:定義INPUT結構的大小。若cbSize不是INPUT結構的大小,則函數調用失敗。返回值:函數返回被成功地插人鍵盤或滑鼠輸入流中的事件的數目。若要獲得更多的錯誤資訊,可以調用GetlastError函數。備註:Sendlnput函數將INPUT結構中的事件順序地插入鍵盤或滑鼠的輸入流中。這些事件與用戶插入的(用滑鼠或鍵盤)或調用keybd_event,mouse_event,或另外的Sendlnput插人的鍵盤或滑鼠的輸入流不相容。嗯,這個函數用起來蠻複雜的,因為它的參數都是指標一類的東西。要用它來類比鍵盤輸入,先要構造一組資料結構,把你要類比的鍵盤消息裝進去,然後傳給它。為了方便起見,把它做在一個過程裏面,要用的時候直接調用好了,代碼如下:Declare Function SendInput Lib user32.dll (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As LongDeclare Sub CopyMemory Lib kernel32 Alias RtlMoveMemory (pDst As Any, pSrc As Any, ByVal ByteLen As Long)Type GENERALINPUTdwType As Longxi(0 To 23) As ByteEnd TypeType KEYBDINPUTwVk As IntegerwScan As IntegerdwFlags As Longtime As LongdwExtraInfo As LongEnd TypeConst INPUT_KEYBOARD = 1Sub MySendKey(bkey As Long)參數bkey傳入要類比按鍵的虛擬碼即可類比按下指定鍵Dim GInput(0 To 1) As GENERALINPUTDim KInput As KEYBDINPUTKInput.wVk = bkey你要類比的按鍵KInput.dwFlags = 0 按下鍵標誌GInput(0).dwType = INPUT_KEYBOARDCopyMemory GInput(0).xi(0), KInput, Len(KInput) 這個函數用來把記憶體中KInput的資料複製到GInputKInput.wVk = bkeyKInput.dwFlags = KEYEVENTF_KEYUP 釋放按鍵GInput(1).dwType = INPUT_KEYBOARD 表示該消息為鍵盤消息CopyMemory GInput(1).xi(0), KInput, Len(KInput)以上工作把按下鍵和釋放鍵共2條鍵盤消息加入到GInput資料結構中SendInput 2, GInput(0), Len(GInput(0)把GInput中存放的消息插入到消息列隊End Sub 除了以上這些,用全局鉤子也可以類比鍵盤消息。如果你對windows中消息鉤子的用法已經有所瞭解,那麼你可以通過設置一個全局HOOK來類比鍵盤消息,比如,你可以用WH_JOURNALPLAYBACK這個鉤子來類比按鍵。WH_JOURNALPLAYBACK是一個系統級的全局鉤子,它和WH_JOURNALRECORD的功能是相對的,常用它們來記錄並重播鍵盤滑鼠操作。WH_JOURNALRECORD鉤子用來將鍵盤滑鼠的操作忠實地記錄下來,記錄下來的資訊可以保存到檔中,而WH_JOURNALPLAYBACK則可以重現這些操作。當然亦可以單獨使用WH_JOURNALPLAYBACK來類比鍵盤操作。你需要首先聲明SetWindowsHookEx函數,它可以用來安裝消息鉤子:Declare Function SetWindowsHookEx Lib user32 Alias SetWindowsHookExA (ByVal idHook As Long,ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long先安裝WH_JOURNALPLAYBACK這個鉤子,然後你需要自己寫一個鉤子函數,在系統調用它時,把你要模擬的事件傳遞給鉤子參數lParam所指向的EVENTMSG區域,就可以達到類比按鍵的效果。不過用這個鉤子類比鍵盤事件有一個副作用,就是它會鎖定真實的滑鼠鍵盤,不過如果你就是想在模擬的時候不會受真實鍵盤操作的干擾,那麼用用它倒是個不錯的主意。3.驅動級模擬 如果上面的方法你都試過了,可是你發現目的程式卻仍然頑固的不接受你類比的消息,寒還好,我還剩下最後一招,這就是驅動級模擬:直接讀寫鍵盤的硬體埠! 有一些使用DirectX介面的遊戲程式,它們在讀取鍵盤操作時繞過了windows的消息機制,而使用DirectInput.這是因為有些遊戲對即時性控制的要求比較高,比如賽車遊戲,要求以最快速度回應鍵盤輸入。而windows消息由於是佇列形式的,消息在傳遞時會有不

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论