试了这个:
  keybd_event(VK_SPACE,0,0,0);
  sleep(5000);
  keybd_event(VK_SPACE,0, KEYEVENTF_KEYUP,0);发现无论sleep多久, 都只能输入一个空格,  不能实现像物理键盘那样,按住空格键不放输入多个空格的效果,请问如何实现按住键盘不放输入多个字符的效果说明:1、需要输出到其它窗口;
      2、一定要通过按住不放实现输出多个重复字符。

解决方案 »

  1.   

    for(循环)
    {
    keybd_event(VK_SPACE,0,0,0); 
      sleep(10); 
      keybd_event(VK_SPACE,0, KEYEVENTF_KEYUP,0); 
    }
      

  2.   

    SendMessage(handle,WM_CHAR,32,0);
    以下可以实现向记事本发送空格
    var
      h1,h2: THandle;
    begin
      h1 := FindWindow('Notepad',nil);
      h2 := FindWindowEx(h1,0,'Edit',nil);
      SendMessage(h2,WM_CHAR,32,0);
    end;
      

  3.   

    不过winIO没法发送消息到其他窗口……
    只能先获得这个窗口的焦点然后激活,也不是什么特别好的办法
    如果要达到这种效果还是通过int9中断做比较好……很多模拟器都是这么做的
      

  4.   

    intP:=100;
    Repeat 
        PostMessage(CBHwnd,WM_CHAR, VK_SPACE,  0)
        intP:=intP+1;
    Until intP>=100;
      

  5.   


    winIO也不行吗?    请问用int9中断怎么实现呢? USB键盘也可以吗?
      

  6.   

    按下空格键启动一个计时器,在计时器中
      keybd_event(VK_SPACE,0,0,0); 
      sleep(5000);
      keybd_event(VK_SPACE,0, KEYEVENTF_KEYUP,0); 
    释放空格键停止计时。
      

  7.   

    PostMessage(Hwnd,WM_CHAR, VK_SPACE,  0);
    先在自己窗体上试试
      

  8.   

    你可以考虑用TIMER控件
    ontimer里面调用键盘事件
    可以自己控制频率
      

  9.   

    其实键盘驱动产生按键消息的原理是:在有按键按下时产生一个WM_KEYDOWN消息,然后已系统规定的频率检查按键是否弹起,若弹起则产生WM_KEYUP消息,若未弹起则继续产生一个WM_CHAR消息,而当系统繁忙时,系统就会合并多个WM_CHAR消息,并在参数中指定消息重复次数。
    所以你只运行一次keybd_event(VK_SPACE,0,0,0);当然只能产生一个空格,若想产生多少个空格必须调用多少次keybd_event(VK_SPACE,0,0,0);
    其实如果能获取目标程序句柄,则可以发送WM_CHAR消息,其lKeyData参数中就可以指定按键重复次数