線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2850
推到 Plurk!
推到 Facebook!

請問如何呼叫外部程式且不重複開啟

尚未結案
tommyli0913
一般會員


發表:9
回覆:19
積分:5
註冊:2004-02-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-17 13:17:04 IP:211.76.xxx.xxx 未訂閱
各位先進大大,小弟想用"ShellExecute" 或 "WinExec" 打開"小畫家"的程式,若小畫家程式未打開就將它打開(這兩個函數均可達到),若小畫家程式已打開,只是在下層,則將它顯示在最上層,非再開啟一個新的小畫家程式。 我目前是用API寫了一堆搜尋程式是否已開啟小畫家的程式,但覺得很沒效率,應該有函數可以做出"開啟新的小畫家程式"或"呼叫出已開啟的小畫家程式"的功能吧??? 如何做呢???
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-17 14:49:35 IP:220.135.xxx.xxx 未訂閱
Hi TommyLi0913 你好:
procedure TForm1.Button1Click(Sender: TObject);
var MyHandle : THandle;
begin
   MyHandle := FindWindow(nil,'未命名 - 小畫家');
   if MyHandle <> 0 then begin
      //BringWindowToTop(MyHandle);
      ShowWindow(MyHandle, SW_SHOW);
   end
   else begin
      WinExec(PChar('mspaint.exe'), SW_SHOW);
   end;
end;
我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-17 14:51:19 IP:220.130.xxx.xxx 未訂閱
tommyli0913 您好 : 如果是你自己寫的程式內要控制只開啟一次只執行某一個程式 ... 那可以紀錄 ShellExecute 或 WinExec 產生的 Window handle ,然後透過 handle 可以判別是否結束,若結束了才啟動新的程式,若沒有結束,就 Send Message .. ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ----
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-17 23:32:35 IP:218.32.xxx.xxx 未訂閱
引言: 那可以紀錄 ShellExecute 或 WinExec 產生的 Window handle ,然後透過 handle 可以判別是否結束,若結束了才啟動新的程式,若沒有結束,就 Send Message ..
對不起, 純討論. 據我所知,
tommyli0913
一般會員


發表:9
回覆:19
積分:5
註冊:2004-02-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-18 18:31:44 IP:211.76.xxx.xxx 未訂閱
各位先進大大,您們好: 其實目前我也是用Window handle 去判斷程式是否存在,跟Miles大大是雷同的,而我是用"SetWindowPos" 函數去呼叫的,一開始想說就將就這用,但卻發現一個bug,即當小畫家程式顯示在最上層再給他最小化後,從此就無法將小畫家程式呼叫出來了,必須將我的程式重新執行,才能將小畫家程式再次呼叫出。(這裡若小畫家程式是沒執行的,是都可以working的),所以才想看看有何種簡單又可正常執行的函數來使用。 我的程式如下: procedure TForm1.Button1Click(Sender: TObject); var Hw : THandle; begin Hw:= FindWindow(nil,'未命名 - 小畫家'); if Hw <> 0 then SetWindowPos(MyHandle, HWND_TOP, 0, 0, 0, 0, 3) else ShellExecute(Application.Handle, 'open','mspaint.exe',nil, nil, SW_ShowNormal ); end;
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-18 22:46:34 IP:219.129.xxx.xxx 未訂閱
引言: 各位先進大大,您們好: 其實目前我也是用Window handle 去判斷程式是否存在,跟Miles大大是雷同的,而我是用"SetWindowPos" 函數去呼叫的,一開始想說就將就這用,但卻發現一個bug,即當小畫家程式顯示在最上層再給他最小化後,從此就無法將小畫家程式呼叫出來了,必須將我的程式重新執行,才能將小畫家程式再次呼叫出。(這裡若小畫家程式是沒執行的,是都可以working的),所以才想看看有何種簡單又可正常執行的函數來使用。 我的程式如下:
procedure TForm1.Button1Click(Sender: TObject);
var Hw : THandle;
begin
  Hw:= FindWindow(nil,'未命名 - 小畫家');
  if Hw <> 0 then
     begin
       SetWindowPos(Hw, HWND_TOP, 0, 0, 0, 0, 3);
       if IsIconic(hW) then//如果最小化,將它打開
          ShowWindow(hW, SW_RESTORE)
     end
  else
    ShellExecute(Application.Handle, 'open','mspaint.exe',nil, nil, SW_ShowNormal );
end;
tommyli0913您好:试试看 ——行径窄处,留一步与人行—— ——
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-19 08:25:18 IP:61.155.xxx.xxx 未訂閱
这个对您的问题有效哦< >< > 如何获取自己在程序中运行的外部EXE的Handle? http://delphi.ktop.com.tw/topic.php?TOPIC_ID=35055 风花雪月 e梦情缘 网络代号:wnhoo or sos_admin 网名:e梦缘 Mail:wnhoo@163.com
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-08-19 09:58:55 IP:220.130.xxx.xxx 未訂閱
引言:
引言: 那可以紀錄 ShellExecute 或 WinExec 產生的 Window handle ,然後透過 handle 可以判別是否結束,若結束了才啟動新的程式,若沒有結束,就 Send Message ..
對不起, 純討論. 據我所知, >< face="Verdana, Arial, Helvetica"> 汗顏,仔細查了一下
tommyli0913
一般會員


發表:9
回覆:19
積分:5
註冊:2004-02-02

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-08-21 10:23:03 IP:211.76.xxx.xxx 未訂閱
看來好像沒有比較簡便的方式了,不過deity先進大大有解決我目前程式的Bug。謝謝各位先進大大的指導,thank you!!
系統時間:2024-11-22 9:37:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!