模拟键盘的奇怪问题.急呀.分全在这了.(48分)

  • 主题发起人 主题发起人 huying
  • 开始时间 开始时间
H

huying

Unregistered / Unconfirmed
GUEST, unregistred user!
我模拟键盘的简单操作!就是把执行文件打开后,原来是需要手动的操作.(在打开的EXE外部程序上的EDIT填写路径之类).但是我现在想模拟键盘自动操作它,当然步骤是固定的.现在我能实现向EXE外部程序发送TAB,RETURN等键.但是发送字符串给外部EXE的EDIT(路径)上的时候出现问题了.值是填上去了.整个过程模拟看起来没有问题.但是最后整个外部EXE无法执行.而直接用键盘对外部EXE的EDIT输入同样的值(路径),又可以执行.所以肯定是自动给EDIT赋值的时候有什么问题.因为我用同样的方法给WORD,记事本发送都能收到!是不是我对焦点,句柄获取有问题.请各位高手请教.
 
procedure TForm1.Button1Click(Sender: TObject); //----用SendKeys方法-----
var
aHandle:THandle;
i:integer;
s1:string;
begin
shellexecute(aHandle,'open','c:/MSU.exe',nil,'',sw_shownormal);
timedelay(1000);
Wnd := FindWindow(nil,'MXIC Speech Utility');
if Wnd <> 0 then
begin
SetForegroundWindow(Wnd);
for i:=1 to 16 do //--16个下箭头--
begin
keybd_event(VK_down, MapVirtualKey(VK_down, 0), 0, 0);
keybd_event(VK_down, MapVirtualKey(VK_down, 0), KEYEVENTF_KEYUP, 0);
timedelay(100);
end;
timedelay(1000);
keybd_event(VK_Tab, MapVirtualKey(VK_Tab, 0), 0, 0); //--1个tab
keybd_event(VK_Tab, MapVirtualKey(VK_Tab, 0), KEYEVENTF_KEYUP, 0);
timedelay(1000);

SendKeys('c:/14.bin',false,1);

timedelay(1000);
for i:=1 to 2 do //--2个tab
begin
keybd_event(VK_Tab, MapVirtualKey(VK_Tab, 0), 0, 0);
keybd_event(VK_Tab, MapVirtualKey(VK_Tab, 0), KEYEVENTF_KEYUP, 0);
timedelay(500);
end;

SendKeys('c:/14.wav',false,1);

timedelay(1000);
for i:=1 to 4 do //--4个tab
begin
keybd_event(VK_Tab, MapVirtualKey(VK_Tab, 0), 0, 0);
keybd_event(VK_Tab, MapVirtualKey(VK_Tab, 0), KEYEVENTF_KEYUP, 0);
timedelay(500);
end;
timedelay(1000);
keybd_event(VK_Return, MapVirtualKey(VK_Return, 0), 0, 0);
keybd_event(VK_Return, MapVirtualKey(VK_Return, 0), KEYEVENTF_KEYUP, 0);
end;
end;
 
我还用了剪贴板的方法.
clipboard.Clear;
clipboard.Open;
clipboard.AsText := 'c:/14.bin';
clipboard.Close;
keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event(ord('V'), 0, 0, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
 
效果一样.值是给上了.外部EXE上的EDIT也正确显示了.可是最后EXE执行的时候就是不认!
 
这个写一个很麻烦的 有专门的工具能干这个 叫模拟精灵 还是键盘精灵 很好用的
 
我是要在自己的程序里自由的控制个专用的外部EXE来干别的的.
 
你在EXE执行之前 SHOWMESSAGE一下,看看到底是什么东东
 
SHOWMESSAGE 什么呀?我全部都是模拟的TAB键什么的.字符串也传递出去了,外部的EDIT也收到了.不然它对应的位置也不会有显示呀.是吧.
 
show edit.text 啊
 
EDIT 是外部EXE上的.我是用我的程序模拟键盘给它上面赋值(类似自动).
 
那也可以SHOW的,用GETWINDOWTEXT取文本

我觉得你好象不是缺了点啥就是多了点啥
所以叫你SHOW一下看看
 
大哥能帮忙写写吗?怎么SHOW呀?
 
问题是不是在,应该我当焦点到外部EXE的EDIT上,我先要得到它的句柄,再用SENDMESSAGE的方法来做呢.可是我用SENDKEY方法应该是不用句柄,只要焦点在上面.我直接给值就可以的.那如果想用SENDMESSAGE方法.怎么样得到当前外部控件的句柄,并发送出去呀?各位高手教教小弟!
 
兄弟,這樣寫試試:
[red]var
H, HCheck: HWND;
clipboard: TClipboard;
begin
shellexecute(0,'open','c:/MSU.exe',nil,'',sw_shownormal);
//timedelay(1000);
sleep(1000);
H := FindWindow(nil, 'MXIC Speech Utility');
if H <> 0 then begin
HCheck := ChildWindowFromPointEx(H, Point(193, 219), CWP_ALL);
if HCheck <> 0 then begin
SendMessage(HCheck,BM_CLICK,0,0);
HCheck := ChildWindowFromPointEx(H, Point(420, 35), CWP_ALL);
if HCheck <> 0 then begin
clipboard := TClipBoard.Create;
clipboard.Clear;
clipboard.Open;
clipboard.AsText := 'c:/14.bin';
clipboard.Close;
SendMessage(HCheck, WM_PASTE, 0, 0);
HCheck := ChildWindowFromPointEx(H, Point(420, 70), CWP_ALL);
if HCheck <> 0 then begin
clipboard.Clear;
clipboard.Open;
clipboard.AsText := 'c:/14.wav';
clipboard.Close;
SendMessage(HCheck, WM_PASTE, 0, 0);
HCheck := ChildWindowFromPointEx(H, Point(480, 180), CWP_ALL);
if HCheck <> 0 then
SendMessage(HCheck, BM_CLICK, 0, 0);
end;
end;
end;
SendMessage(H, WM_CLOSE, 0, 0);
end;[/red]
 
多人接受答案了。
 
后退
顶部