用下面的代码实现在按下热键时把剪贴板里的内容换成“SSS”然后模拟按键Ctrl+V粘贴,最后再把剪贴板原来的内容还原,可是为什么每次按下热键时粘贴出来的都不是“SSS”而是剪贴板里原来的内容呢?而且经常出现“Cannot open clipboard”的错误提示。
procedure tform1.ONHotkey(var message:Tmessage);
begin
txt0:=Clipboard.AsText;
Clipboard.AsText:='sss';
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), 0, 0);
keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);
Clipboard.AsText:=txt0;
end;

解决方案 »

  1.   

    //
      Application.ProcessMessages; //<-=------------
      Clipboard.AsText:=txt0;
      

  2.   

    老大,用了你的方法后出现“Cannot open clipboard”的错误更容易出现了,基本上每按一次热键就出错一次,我在Clipboard.AsText:=txt0;前加了一句Sleep(50);就不再出错了,难道系统反应不过来?用Sleep(50);也只是没有办法的办法了,如果在一台配置N低的电脑上运新怎么办啊?
      

  3.   

    在我的机器上没有发现“Cannot open clipboard”错误,
    或者把Demo发到
      

  4.   

    几天没动这个程序今天再来运行竟然又出现了第一个问题,发现只要把Clipboard.AsText:=txt0;这一行注释掉就可以了,好像有了这一行Clipboard.AsText:='sss';就不起作用了一样,这到底是什么原因啊?
      

  5.   

    你的keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);
    后面要加上Application.ProcessMessages;和Clipboard.clear
    因为keybd_event只是把按键消息放到消息队列里,剪贴板还没来得及处理,后面的Clipboard.AsText:=txt0;就已经执行了,结果就是你看到的那样