要求中间不能间断。我搜索了一下,有人说其实物理键盘驱动也是通过短时间内多次发送消息来实现的,不知是否如此。
请这方面的高手给给出代码,实现按住空格的效果2秒钟。谢谢

解决方案 »

  1.   

    按下时启动timer,timer间隔2秒,可以设置一个变量,第一次时置为true,如果为true,就不用重复设置timer了
      

  2.   

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    timer1.Interval:=2000;
    Timer1.Enabled:=false;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    ShowMessage('按住空格键2秒');
    Timer1.Enabled:=False;
    end;procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
     if key = VK_space then
        begin
          timer1.Enabled:=True;
        end;
    end;procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
     if key = VK_space then
        begin
          timer1.Enabled:=False;
        end;
    end;
      

  3.   

    我要是原理都看不懂我还用的着混CSDN吗?按空格的时候没有任何反应,你测试了吗
      

  4.   

    意思是比如我按一下button1,软件就会代替我按住空格2秒钟,明白了吗?我想我表达的够清楚了。
      

  5.   

    procedure DownShift();
    var
      kbs : TKeyboardState;
    begin
      GetKeyboardState(kbs);
      kbs[VK_SHIFT] := $80;
      SetKeyboardState(kbs);
    end;
    procedure FreeShift();
    var
      kbs : TKeyboardState;
    begin
      GetKeyboardState(kbs);
      kbs[VK_SHIFT] := $10;
      SetKeyboardState(kbs);
    end;
    改成空格不知行不行.lz试下
      

  6.   


    这样子应该可以,你也试试procedure TForm1.Button1Click(Sender: TObject);
    begin
       keybd_event( 32, 0, 0, 0);
       timer1.Enabled:=true;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      keybd_event( 32,0, KEYEVENTF_KEYUP, 0);
       timer1.Enabled:=false;
       showmessage('2秒');
    end;
      

  7.   


    procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
            Memo1.Lines.Add('down');
    end;procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
            Memo1.Lines.Add('up')
    end;
    Memo1里持续按住键后,看下这段代码的结果
      

  8.   

    您的意思是可以通过keydown、sleep、keydown、sleep这种方法来实现?
      

  9.   

    不断的发送wm_keydown即可,到两秒,wm_keyup
    其实物理键盘驱动也是每隔一定时间扫描键盘状态的
      

  10.   

    就按16楼的代码即可。有些游戏可能不起作用,需要用winio直接写端口的方式。大多数的程序应该都能接收的。
      

  11.   

    发送wm_keydown
    sleep(2000)
    wm_keyup
      

  12.   

    还没有解决,继续求高人解答,举个例子。假如在记事本中,模拟按住空格键,要求和手动按住空格是一样的效果,回车符不断的跳跃。并不是按住一次空格然后sleep2000毫秒。这样是有本质区别的!
      

  13.   

    咦,我不是给你了个代码看效果吗?
    按住键不放,memo里不断地显示down,就说明实际上是收到了多次keydown的event。
    16楼的button1click代码先加上Memo1.SetFoucs;再执行,你也能看到down和up,但仅一次。
    所以,你把16楼的代码改一下了,timer1的interval设成50(即50ms一次),加个全局变量用于计数,发一次down的event,计数加1,加到40次(2秒后)再发个up,然后停了timer1即可啊。
      

  14.   

    大侠你好,我测试了一下,运行的时候换行符不会跳动,是一直停滞的状态,在游戏里测试的话,游戏也会假死。(用了webbrowser)。不知道您有没有碰到过类似的情况?
      

  15.   

    我不懂也是来混csdn,  既然是游戏,那么就是不是自身程序,这个问题本身就有问题。
    如果是注入dll event 事件触发当前焦点在你的dll 窗体,游戏是没反应的,可以用宿主exe,发送postmessage, 不是很理想;
    不注入dll,那么就只是直接发送postmessage,或者sendmessage. 最好的方法就是注入dll, 然后调用游戏的按键call, 没反应要看看实际手操作的时候还有什么附加条件没有,比如鼠标点选后按空格, 有些游戏为了防止软件模拟,是有技能状态的检测的,即没有鼠标移动, 按键都是无效的。 
      

  16.   

    用线程+SendMessage
    按下空格键后就启动线程,不停的发送空格键消息,2秒结束线程,游戏都是用多线程的,也不会假死