我想实现
先按键盘上的Z 在连续2次空格 最后Enter
用在劲舞团游戏里面
我做了 在游戏里面没得作用
在桌面上 其它地方都ok
请高手解决啊
我想实现
先按键盘上的Z 在连续2次空格 最后Enter
用在劲舞团游戏里面
我做了 在游戏里面没得作用
在桌面上 其它地方都ok
请高手解决啊
这是编程问题??
Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Public Const KEYEVENTF_KEYUP = &H2
'------------------按空格键的示例
keybd_event 32, 0, 0, 0
'-----------需延时50毫秒
keybd_event 32, 0, KEYEVENTF_KEYUP, 0
如果不行就是被hook了,就基本没戏了。当然不是完全没戏。还有一招驱动模拟,当然这招也不是一定能行,不过能对付大部分Hook了的键盘的游戏(比如QQ的零用钱大作战就是上面的办法不行,下面将要介绍这个办法成功了的),所以用到的这个Dll经常被杀毒软件干掉,因为这算是准硬件级的键盘模拟了(下面的代码你在互联网上基本找不到了,因为很少有人会发出这个来了,这个属于做挂的范畴了,现在做挂基本属于违法的不晓得这里给不给发):
首先你需要有这么几个文件(我这里不便提供,你只能自己去找了):
CRC232 MD5
WinIO.sys 56EEB5F3 1ce499b54e1deed84c1a62dff2105a9a
WinIO.vxd 68C7A0AA 7a5af5dd62c4bc97c1654790e8d2f307
WinIO.dll EFF33C04 c6b4bb7661fb5e0fc1efaa9f604a5da3
为了防止带毒,请确认以上校验信息,除非是新版本且你能确定已经是新版本!
找到这几个文件就基本完成了,剩下的事情就是简单的运用了。这几个文件的使用例子有一个标准的模块WinIO.bas
'-----------------------------------------------------------------------------------
Option Explicit
Public Declare Function MapPhysToLin Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysSize As Long, ByRef PhysMemHandle) As Long Public Declare Function UnmapPhysicalMemory Lib "WinIo.dll" (ByVal PhysMemHandle, ByVal LinAddr) As Boolean Public Declare Function GetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByRef PhysVal As Long) As Boolean Public Declare Function SetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysVal As Long) As Boolean Public Declare Function GetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByRef PortVal As Long, ByVal bSize As Byte) As Boolean Public Declare Function SetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByVal PortVal As Long, ByVal bSize As Byte) As Boolean Public Declare Function InitializeWinIo Lib "WinIo.dll" () As Boolean Public Declare Function ShutdownWinIo Lib "WinIo.dll" () As Boolean Public Declare Function InstallWinIoDriver Lib "WinIo.dll" (ByVal DriverPath As String, ByVal Mode As Integer) As Boolean Public Declare Function RemoveWinIoDriver Lib "WinIo.dll" () As Boolean
Public Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
Public Sub KeyPress(VKEY As Integer, fc As Integer) Dim Sp As Boolean, byScancode As Long, i As Integer byScancode = MapVirtualKey(VKEY, 0) '{ For i = 1 To fc ' Call KbcWait4IBE ';//Wait for KBC input buffer empty Sp = SetPortVal(&H64, &HD2, 1) ')';//Send data back to the system command ' Label2.Caption = "SetPortVal1=" + Str(Sp) Delay 20 '延时20毫秒 ' 'Call KbcWait4IBE ';//Wait for KBC input buffer empty Sp = SetPortVal(&H60, byScancode, 1) ');//Send the key down scancode ' Label3.Caption = "SetPortVal2=" + Str(Sp) Delay 20 ' 'Call KbcWait4IBE ';//Wait for KBC input buffer empty Sp = SetPortVal(&H64, &HD2, 1) ');//Send data back to the system command ' Label4.Caption = "SetPortVal3=" + Str(Sp) Delay 20 ' 'Call KbcWait4IBE ';//Wait for KBC input buffer empty Sp = SetPortVal(&H60, byScancode Or &H80, 1) 'Or &H80));//Send the key up scancode ' Label5.Caption = "SetPortVal4=" + Str(Sp) 'Label6.Caption = "Key=" + Str(CLng(byScancode)) Delay 20 Next i '} Delay 20 End Sub
原例子只有API定义,KeyPress 是我从哪里找来的还是自己改装的忘记了,3年多以前写的了,fc应该是按键次数。MapVirtualKey也是后来补充进去的。
使用时:
Private Sub Form_Load() If InitializeWinIo = False Then'需预先装载WinIO
'-------装载WinIO失败!!!也就是模拟不成了。 MsgBox "Whoops ! There is a problem with InitializeWinIo.", vbOKOnly + vbCritical, "VBDumpPort32" End If End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) Call ShutdownWinIo'程序结束时需要卸载WinIO End Sub
具体的按键模拟:
KeyPress 65, 1 '按键盘键“A”一次
注意这里需要使用键盘按键的物理键码,字符键即为对应字符的大写ASCII码,其他的键自己去查查了吧。