求实现以下功能
程序能识别粘贴板中的内容,比如粘贴板中的内容是A B C,则按下某一全局热键(假设是F2),则程序模拟按下A B C,A B C之间的空格代表时间间隔,假设为0.2秒。另外还有回车的情况,比如
A B C
D E F
这种情况回车代表间隔0.5秒(C和D之间)。请问如何实现?谢谢,200分

解决方案 »

  1.   


    uses
      Clipbrd;
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    var
      clp:Tclipboard;
      i:  integer;
      str: string;
    begin
      if key=vk_f2 then
      begin
        clp:=Tclipboard.Create;
        str:=clp.AsText;
        for i:=1 to length(str) do
        begin
          keybd_event(ord(str[i]), MapVirtualKey(ord(str[i]), 0 ), 0 , 0 );
        end;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      keybd_event(vk_f2, MapVirtualKey(vk_f2, 0 ), 0 , 0 );
    end;
      

  2.   

    需要将窗体的keypreview设为true,已经测试
      

  3.   

    修改一下if key=vk_f2 then
      begin
        clp:=Tclipboard.Create;
        str:=clp.AsText;
        for i:=1 to length(str) do
        begin
          keybd_event(ord(str[i]), MapVirtualKey(ord(str[i]), 0 ), 0 , 0 );
          sleep(500);//延时0.5
        end;
        clp.free;
      end;
      

  4.   

    哥们,他老说FormKeyDown是未声明标识符,怎么弄?keypreview已经设为true
      

  5.   


    uses
      Clipbrd;
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    var
      clp:Tclipboard;
      i:  integer;
      str: string;
    begin
      if key=vk_f2 then
      begin
        clp:=Tclipboard.Create;
        str:=clp.AsText;
        for i:=1 to length(str) do
        begin
          keybd_event(ord(str[i]), MapVirtualKey(ord(str[i]), 0 ), 0 , 0 );
          sleep(500);
        end;
        clp.Free;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      keybd_event(vk_f2, MapVirtualKey(vk_f2, 0 ), 0 , 0 );
    end;
      

  6.   

    FormKeyDown我知道了,抱歉,但F2需要是全局热键,即程序最小化的时候也能生效,能帮忙修改一下吗,谢谢。
      

  7.   

    你在窗体的 onkeydown属性选一下不就行了
      

  8.   

    哥们,你可能误会了我的意思,我测试了不成功,需要的是按下A,弹起A,间隔0.2秒,按下B,弹起B,这样的模拟,郁闷,好弄吗?按下和弹起的间隔最好可以设置,拜托了。
      

  9.   

    假设是粘贴板的内容是A B C
    则程序按下A,等X秒弹起A,等0.2秒按下B,等X秒弹起B,等0.2秒按下C,等X秒弹起C,这个意思,可以实现吗
      

  10.   

     keybd_event(ord(str[i]), MapVirtualKey(ord(str[i]), 0 ), 0 , 0 );       //按下
          sleep(500);
          keybd_event(ord(str[i]), MapVirtualKey(ord(str[i]), 0 ), KEYEVENTF_KEYUP , 0 );  //弹起
      

  11.   

    测试成功了,谢谢yuqianyi1974。
    再麻烦一下,能不能把空格过滤掉,就是指空格仅仅代表间隔的时间,程序模拟的时候并不输入空格,可以吗,谢谢。
      

  12.   

    是这个意思吧?    
    for i:=1 to length(str) do
        begin
          if str[i]<>' ' then
          begin
            keybd_event(ord(str[i]), MapVirtualKey(ord(str[i]), 0 ), 0 , 0 );       //按下
            sleep(500);
            keybd_event(ord(str[i]), MapVirtualKey(ord(str[i]), 0 ), KEYEVENTF_KEYUP , 0 );  //弹起
          end;
        end;
      
      

  13.   

    就是文本内容中的空格啊。比如A B C,用程序模拟输入的话,在记事本中应该表现为ABC,只不过字母之间有个时间间隔
      

  14.   


    for i:=1 to length(str) do 
        begin 
          if str[i] <>' ' then 
          begin 
            keybd_event(ord(str[i]), MapVirtualKey(ord(str[i]), 0 ), 0 , 0 );      //按下 
            sleep(500); 
            keybd_event(ord(str[i]), MapVirtualKey(ord(str[i]), 0 ), KEYEVENTF_KEYUP , 0 );  //弹起 
          end; 
        end; 
      

  15.   

    大侠,这样确实是不会输入空格了,但是时间间隔怎么办呢?比如A B C,要求一个空格代表间隔0.2秒,两个空格0.4秒,依此类推,这是最后一个小问题了,麻烦您了!
      

  16.   


     for i:=1 to length(str) do
        begin
          if str[i]<>' 'then
          begin
            keybd_event(ord(str[i]), MapVirtualKey(ord(str[i]), 0 ), 0 , 0 );
            sleep(x);// x可以设定 
            keybd_event(ord(str[i]), MapVirtualKey(ord(str[i]), 0 ), KEYEVENTF_KEYUP , 0 );  //弹起
          end
          else
            sleep(200);//0.2s
        end;
      

  17.   

    好了解决了,谢谢yuqianyi1974,我明天加分后再结贴。
      

  18.   

    对了,还有回车的情况,如果str[i]是回车,想暂停1秒,应该怎么弄呢?谢谢
      

  19.   

          if (str[i]<>' ') and (str[i]<>#13) then
          begin
            keybd_event(ord(str[i]), MapVirtualKey(ord(str[i]), 0 ), 0 , 0 );
            sleep(x);// x可以设定 
            keybd_event(ord(str[i]), MapVirtualKey(ord(str[i]), 0 ), KEYEVENTF_KEYUP , 0 );  //弹起
          end;
          if str[i]=' ' then 
            sleep(200);//0.2s
          if str[i]=#13 then 
            sleep(1000);//0.2s
          
          
      

  20.   


      keybd_event(ord('S'), MapVirtualKey(ord('S'), 0), KEYEVENTF_KEYUP, 0);