全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1470
推到 Plurk!
推到 Facebook!

如何得知所呼叫的外部程式載入完成?

尚未結案
TomGlavine
一般會員


發表:1
回覆:1
積分:0
註冊:2003-05-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-22 16:18:23 IP:140.112.xxx.xxx 未訂閱
請教高手們 現在我們的程式需要呼叫一個外部程式之後,然後利用sendmessage進行操作。可是要先確定該程式載入完成才能進行sendmessage的動作,不知道大家是怎麼處理這個部分呢?謝謝囉!
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-22 16:26:46 IP:140.135.xxx.xxx 未訂閱
TomGlavine您好:      
引言: 可是要先確定該程式載入完成才能進行sendmessage的動作,不知道大家是怎麼處理這個部分呢?
您指的是這樣嗎??
HWND hWnd=FindWindow(NULL, "未命名 - 記事本");
  if (hWnd!=NULL)
   {
    ShowMessage("有找到!!");
   }
  else
    ShowMessage("沒有找到!!");
 
順心 <>~我也是在學習的階段,所以請您多多見諒與指教~
turboted
版主


發表:95
回覆:754
積分:452
註冊:2002-07-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-22 16:39:55 IP:61.30.xxx.xxx 未訂閱
這裏有一個方法 雖然不是很好,但可行 他是使用,讓你執行外部時,就去LoadFile 但因為還沒完成,系統不會讓你讀取,所以,就用這樣判斷 http://netcity1.web.hinet.net/userdata/nep2314/Pages/Sys9.htm
TomGlavine
一般會員


發表:1
回覆:1
積分:0
註冊:2003-05-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-22 16:40:12 IP:140.112.xxx.xxx 未訂閱
先謝謝您的回答。 小弟以前的經驗是,如果有一個程式的載入時間比較長,而一般程式一執行就會出現一個logo畫面,但是還沒完全執行起來,像是acrobat等等。但是用findwindow可能就已經會回傳true。
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-22 16:57:37 IP:218.16.xxx.xxx 未訂閱
應該是用 createProcess 然後用 WaitForSingleObject 的, 你搜尋一下應可找到。
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-22 16:57:39 IP:140.135.xxx.xxx 未訂閱
TomGlavine您好:    
引言: 如果有一個程式的載入時間比較長,而一般程式一執行就會出現一個logo畫面,但是還沒完全執行起來
那是否能在sendmessage進行操作之前,先加上Sleep();讓SendMessage晚點動作... 可以再加上程式是否處於無回應狀態的機制(RaynorPao大哥提供)
 
  DWORD dwResult=0;
  LRESULT lr=0;
  HWND hWnd=NULL;
  hWnd=FindWindow(NULL, "未命名 - 記事本");
  if(hWnd!=NULL)
    {
     lr=SendMessageTimeout(hWnd, WM_SETFOCUS, NULL, NULL,SMTO_NORMAL, 5000, &dwResult);
     if(lr==0)
     {
       ShowMessage("Failed or Timeout");
     }
     else
       ShowMessage("正常");
    }
順心 <>~我也是在學習的階段,所以請您多多見諒與指教~ 發表人 -
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-22 17:00:47 IP:218.16.xxx.xxx 未訂閱
引言: 應該是用 createProcess 然後用 WaitForSingleObject 的, 你搜尋一下應可找到。
回太快回錯了,是 WaitForInputIdle 才對 >.<
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-22 17:14:08 IP:218.16.xxx.xxx 未訂閱
大約就是這樣了 :    
procedure TForm1.Button2Click(Sender: TObject);
var
  PI : TProcessInformation;
  SI : TStartupInfo;
begin
  FillChar(SI, SizeOf(SI), 0);
  SI.CB := SizeOf(SI);
  if CreateProcess(0,'notepad',NIL,NIL,False,NORMAL_PRIORITY_CLASS, NIL, NIL,SI,PI) then
  begin
    WaitForInputIdle(PI.hProcess, 10000); // Max wait 10 secs
//    SendMessage(....)
    ShowMessage('Opened');
  end
  else
    ShowMessage('Cannot Open NotePad');
end;
系統時間:2024-03-29 16:50:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!