求解:使用虚拟键时导致剪贴板错误(100分)

  • 主题发起人 主题发起人 叶不归
  • 开始时间 开始时间

叶不归

Unregistered / Unconfirmed
GUEST, unregistred user!
目标:选中记事本中的某几行文字, 按下F6键时,选中的文字每行前加上字符'Ok'。
实现:1.将F6注册为热键
2.虚拟按下Ctrl+c
3.取得剪贴板内容
4.修理取得的内容
5.将处理后的内容放入剪贴板
6.虚拟按下Ctrl+v
出错:第一次从1到6执行完全成功,第二次执行时,到第3步出错,提示无法打开剪贴板
如果取消第2和第6步,则无错误,可见问题出的模拟Ctrl+C上。
请高手赐教!以下原代码供参考:
第3至第6步:
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin
if ClipBoard.HasFormat(CF_TEXT) then
begin
{ 取得内容 }
KeyBoard_Event(VK_Control, 0, 0, 0);
KeyBoard_Event(Ord('C'), 0, 0, 0);
KeyBoard_Event(Ord('C'), 0, 2, 0);
KeyBoard_Event(VK_Control, 0, 2, 0);
Sleep(200); { 这个是必须的 }
Memo1.Clear;
Memo1.PaseFromClipBoard;

for I := 0 to Memo1.Lines.Count - 1 do
Memo1.Lines := 'Ok' + Memo1.Lines;

ClipBoard.AsText := Memo1.Text; { 第二次执行时这里出错 }

{ 放入内容 }
KeyBoard_Event(VK_Control, 0, 0, 0);
KeyBoard_Event(Ord('V'), 0, 0, 0);
KeyBoard_Event(Ord('V'), 0, 2, 0);
KeyBoard_Event(VK_Control, 0, 2, 0);
end;
end;
 
没有人会吗???还是分数太少了?
 
KeyBd_Event虚拟ctrl+c不大好用。
我都用 postmessage(memo1.handle,wm_paste{wm_copy},0,0);或者干脆直接用
delphi光盘上的sndkey32单元里面的sendkeys('^c'),
屡试不爽。
不是很明白你要完成什么功能,我想应该很简单。
 
将KeyBd_Event改为SendKeys后,问题仍然存在:
SendKeys('^C', True);
Memo1.Clear;
Memo1.PaseFromClipBoard;
Showmessage(Memo1.TExt);
Memo1的内容还是空的!!但是第二次执行以上语句时,正常!
只要改变SelText的内容,就出错(Memo1.Text为空)!
 
大哥,buttonclick里面首先要 Memo1.SetFocus;
不然windows怎么知道你要copy谁
或者用postmessage(memo1.handle...)肯定没问题,
还是不明白你到底要做什么,
挺简单的东西怎么说得那么复杂?
葵花宝典上面有N个类似的例程。
 
我当然不是要copy自己窗体内的东西。
比如记事本中,我“选择了一段内容”,注意这时的ActiveWindow是记事本!
这时按F6键,因为F6被我注册成了热键,所以,会执行我窗体里的Button1Click事件。
我在Button1Click里发送Ctrl+C的操作,把记事本里选中的内容copy到记事本,就是
这么简单,可是第一次按F6是成功的,当在记事本内选中的区域改变时,再按F6便出
错了……
 
PostMessage((FindWindowEx(FindWindow('NotePad',nil),0,'Edit',nil)),WM_Copy,0,0);
如果这样还出错那么可以肯定是
4.修理取得的内容
5.将处理后的内容放入剪贴板
出的错
 
对不起bubble,我没说清楚,我不单是要取得记事本内容,其他程序也要。
不能用指定窗体的方式。

 
:)
oh,还没有解决么。
GetForegroundWindow,SetForegroundWindow,
然后SendKeys('^V'),
你可能就是激活窗体的问题,
SendKeys和Keybd_Event只对当前ForeGroundWindow有效。
 
唉,见鬼了,我先GetFore..再SetFor...再SendKeys('^C', True),
再memo1.postfromclipboard, 取到是居然是上一次剪贴板的内容。
也就是说SendKeys('^c,true)似乎没有立即把内容放在板中,而像是
memo1.postfromclipboard后,才把内容放进去,取不到啊,bubble~~
 
no,no
SendKeys源代码还是使用了Keybd_Event函数,
所以从本质上应该是没有区别,或者你试试看稍作延时sleep.
放在SetForeGroundWindow后执行也没有问题,就好像你在这个窗体上按ctrl+c一样,
有个前提条件是,
你在这个ForeGroundWindow里面必须有已经选择好的
可以复制的东西,也就是说在这个窗体上按ctrl+c能够复制到东西,
否则的话,剪贴版里当然是上一次的内容了。
 
你说的我早就试了n次了,sleep也没用,看来这个问题没办法解决了。
你还有没有办法,没办法我就发分了……
 
问题没有解决。
 

Similar threads

I
回复
0
查看
759
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部