模拟按键的问题,代码简单,原理不明,UP有分.
有朋友让做一个自动在记事本后面加文本内容的一个小程序,我用DELPHI实现代码如下:
shellexecute(handle,'open', PChar('c:\winnt\system32\notepad.exe'), nil, nil,SW_SHOWNORMAL);
for i:=0 to Length(SendEdt.Text)-1 do begin
keybd_event(Ord(SendEdt.Text[i]),MapVirtualKey(Ord(SendEdt.Text[i]),0),0,0);
keybd_event(Ord(SendEdt.Text[i]),MapVirtualKey(Ord(SendEdt.Text[i]),0),KEYEVENTF_KEYUP,0);
end;
经过测试发现,可以打开记事本,但是却往里面加不了内容,想想,估计是没有获得焦点吧,便改成这样:
var aHWND:THandle;
i:Integer;
s:Char;
begin
shellexecute(handle,'open', PChar('c:\winnt\system32\notepad.exe'), nil, nil,SW_SHOWNORMAL);
aHWND:= FindWindow('Notepad',nil);
if aHWND<>0 then begin
SetForegroundWindow(aHWND);
for i:=0 to Length(SendEdt.Text)-1 do begin
PostMessage(aHWND, WM_KEYDOWN, Ord(SendEdt.Text[i]), 0);
end;
end;
发现还是不行,郁闷至极,太打击人了,这点事也搞不定...没得办法后,改用VB来写...代码如下:
Private Sub Command1_Click()
Dim i As Integer
Shell "c:\winnt\system32\notepad.exe", vbNormalFocus
DoEvents
SendKeys SendEdt.Text
DoEvents
SendKeys "{enter}" '发送回车
End Sub
轻松搞定.
至此有一些不明白,是不是我DELPHI代码有写错致使目标窗体收不到消息呢?还是我理解上有问题?其实从想法上VB和DELPHI的代码基本上实现相同功能,为什么一个可以一个却不可以呢?怎么样DELPHI才可以呢?能不能详细解释一下?
嘿嘿,问了这么多,请各位多多解答,谢谢!