游戏:冒险岛 Online代码:
procedure TForm1.Timer1Timer(Sender: TObject);
var Key:Variant;
begin
Timer1.Interval:=strtoint(suiEdit1.text);
Key:=Ord(suiEdit2.Text[1]);
keybd_event(key, 0, 0 , 0);
keybd_event(Key, 0, KEYEVENTF_KEYUP , 0); // key up
end;问题如下:
在记事本和游戏的聊天状态都可以不停的输出字母,为什么在游戏状态时只是偶尔的攻击一次呢
我试过把keybd_event(Key, 0, KEYEVENTF_KEYUP , 0); // key up 去掉之后,可以不停攻击了,
但是不能控制他的时间间隔,而且最重要的是攻击的时候按一下其它任意键,攻击就会停止,除非
再手动按一次攻击键才会继续,郁闷,求高手指教!程序下载地址:http://www.flyso.net/a.exe

解决方案 »

  1.   

    这么说吧,你使用Windows消息来获得键盘事件对于游戏来说是有问题的。
    因为Windows消息的工作机制是同步的,一个程序的消息队列接收到消息并不触发任何事件,必须程序主动取消息才行。而且连续的相同消息回被合并成一个。
    正确的作法是:
    在循环中定时调用GetAsyncKeyState,这可以获得键盘的所有键状态,然后根据键状态转入相应的处理过程。
    ID的Quake2、Quake3等都是这么处理的。优点是速度快,游戏可以支持任意的组合键,而且这种处理机制对于不同的操作系统都适用(DOS、Windiows、Linux)。
      

  2.   

    还是不行呀,我改了之后代码如下:
    procedure TForm1.Timer1Timer(Sender: TObject);
    var Key:Variant;
    begin
    Timer1.Interval:=strtoint(suiEdit1.text);
    Key:=Ord(suiEdit2.Text[1]);
    if GetAsyncKeyState(key) <> 0 then  //如果该键已经按下执行
    keybd_event(key, 0, KEYEVENTF_KEYUP , 0)  //松开该键
    else //否则
    keybd_event(key, 0, 0 , 0) //按下该键
    end;
      

  3.   

    keybd_event(key,0,KEYEVENTF_EXTENDEDKEY,0); //KEYDOWN,
    keybd_event(key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0); //KEYUP
      

  4.   

    不行哦, 问题依旧
    如果只用keybd_event(key, 0, 0 , 0) 可以实现不断攻击, 但按一下其它任意键就攻击停止了,好像被其它键中断似的,但切换到聊天栏发现还在按键,除非再手动按一次攻击键才会继续
      

  5.   

    keybd_event(key, 0, KEYEVENTF_KEYUP , 0) 用了之后,偶尔的攻击一次,有时也会偶尔连续攻击几次,他不会被其它键中断,就是没有规律性,郁闷。。.