游戏中模拟键盘(200分)

  • 主题发起人 主题发起人 moroko
  • 开始时间 开始时间
M

moroko

Unregistered / Unconfirmed
GUEST, unregistred user!
按键精灵 在任何游戏里都管用,我想知道它的实现原理。<br>我用过以下方法,都不管用:<br>用keybd_event函数,没有反应。<br>用AttachThreadInput函数挂接一个输入线程,然后用PostMessage发送键盘消息,但只对有光标的输入框管用。<br>用GetKeyboardState读出虚拟键值表,然后把键值表改动一下,再用SetKeyboardState写入,这个方法在XP完全无效。<br>难道使用DirectInput就没办法模拟键盘了吗?<br>按键精灵到底是如何模拟键盘的啊,请各位高手帮帮忙。
 
看了好多文章 有人说用winio 来实现低层模拟<br>有人说使用过滤驱动<br>谁能给个例子啊!<br>还是 使用DirectInput的程序 就根本无法模拟键盘操作?<br><br>没人可以解答了吗?
 
可以是用模拟硬的办法来实现.我知道的有WinIo,包含三个文件 WinIo.dll WinIo.sys WINIO.VXD <br><br>DELPHI里面我们可以在implementation 后面这样静态连接DLL<br><br> &nbsp;function InitializeWinIo():Boolean;stdcall;external 'WinIo.dll' name 'InitializeWinIo';<br> &nbsp;function GetPortVal(PortAddr:integer;PortVal:PDWORD;bSize:BYTE):Boolean;stdcall;external 'WinIo.dll' name 'GetPortVal';<br> &nbsp;function SetPortVal(PortAddr:integer;PortVal:DWORD;bSize:BYTE):Boolean;stdcall;external 'WinIo.dll' name 'SetPortVal';<br> &nbsp;function ShutdownWinIo():Boolean;stdcall;external 'WinIo.dll' name 'ShutdownWinIo';<br><br> &nbsp; 注意 WinIo.dll WinIo.sys WINIO.VXD 要放在程序的同一目录下.
 
有没有例子啊,我已经开始使用winio.dll来模拟键盘了<br><br>我在time1里写如下代码<br>SetPortVal(H60, &H48, 1);<br>可并没有模拟键盘上的up键啊<br>能给个简单的例子吗?<br>谢谢!
 
先要调用 InitializeWinIo()<br><br>具体模拟一个按键的操作可以象下面这样来写.<br><br> &nbsp;Delay(); &nbsp;<br> &nbsp;SetPortVal($64,$D2,1);<br> &nbsp;Delay(); &nbsp;<br> &nbsp;SetPortVal($60,btScancode,1); &nbsp; //btScancode 是键盘键,笔记本和台试机可能不太一样<br> &nbsp;Delay(); &nbsp;<br> &nbsp;SetPortVal($64,$D2,1);<br> &nbsp;Delay(); &nbsp;<br> &nbsp;SetPortVal($60,btScancode or $80,1);//一次按键完成.<br><br>一定要按上面的顺序来做,否则可能造成键盘缩住了,只能硬关机了.哈..<br><br>这是我在我的电脑上测试的一些键值<br><br>IBM本本键盘键值对应的按键[可能有部分和实际不符]<br>硬键值 对应按键 &nbsp; &nbsp; &nbsp;keyCode<br>1 &nbsp; Esc键 27<br>2 1 49<br>3 2 50<br>4 3 51<br>5 4<br>6 5<br>7 6<br>8 7<br>9 8<br>A 9<br>B 0<br>D =<br>E Backspace<br>F Tab<br>10 Q<br>11 W<br>12 E<br>13 R<br>14 T<br>15 Y<br>16 U<br>17 I<br>18 O<br>19 P<br>1A [<br>1B ]
 
补充一 Delay(); &nbsp;是个几毫秒的延时过程.如果没有延时是不会成功模拟按键的.
 
Delay(); &nbsp;<br> &nbsp;SetPortVal($64,$D2,1);<br> &nbsp;Delay(); &nbsp;<br> &nbsp;SetPortVal($60,btScancode,1); &nbsp; //btScancode 是键盘键,笔记本和台试机可能不太一样<br> &nbsp;Delay(); &nbsp;<br> &nbsp;SetPortVal($64,$D2,1);<br> &nbsp;Delay(); &nbsp;<br> &nbsp;SetPortVal($60,btScancode or $80,1);//一次按键完成.<br><br>我知道解释的已经很详细了,可能在详细点吗 例如 $D2 是什么 $80 是什么 btScancode笔记本又应该是什么能? 上面的代码是一次按键吗?
 
答完结帖了!谢谢大哥的帮助!有相关的资料吗?能发一份吗谢谢了!<br>mrk@kb11.com
 
keybd_event,中间的延迟你设置为多少?我开始测试是不管用,原因只是因为延迟太短了。
 
keybd_event这个函数对DirectInpu 是不管用的 &nbsp; 问过好多人了,因为他是低层接管键盘的按键消息 (不应该是消息,因为根本不是消息机制,我不知道用什么词描述)<br>结帖了 感谢kefanmail,代码我还没有测试 这几天忙,不过还是非常感谢!
 
Sleep()代替Delay()可以吗?Delay()这个过程内容是什么能一起帖出来吗?
 

Similar threads

I
回复
0
查看
623
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部