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

用ShellExecuted開啟任何文件檔,如何取得HWND

尚未結案
a123473119
一般會員


發表:19
回覆:46
積分:18
註冊:2002-08-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-20 07:36:37 IP:211.76.xxx.xxx 未訂閱
目的: 將選到之檔案(doc,xls,txt,exe..),開啟在一個form之panel內. 利用ShellExecuted開啟任何文件檔後,如何取得其window之handle 雖拜讀了前幾編有關ShellExecuted之大作,還是難解. 原因是不知所用來開啟之程式名,所以不會用findwindow 不知前輩們是否對此問題已有定論. thanks.
a123473119
一般會員


發表:19
回覆:46
積分:18
註冊:2002-08-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-22 21:05:40 IP:211.76.xxx.xxx 未訂閱
各位前輩呢? 皆放暑假了. 我知道這個問題曾討論過,最後是 已brant 之作法結案如下.  用 ShellExecuteEx 得到的不是 window handle 而是 process handle 以下的 code 可以控制被開啟的外部程式:            SHELLEXECUTEINFO ExecInfo;         DWORD exit_code;         int i=0;            memset(&ExecInfo,0,sizeof(SHELLEXECUTEINFO));         ExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);         ExecInfo.fMask=SEE_MASK_NOCLOSEPROCESS;         ExecInfo.hwnd = NULL;         ExecInfo.lpFile = "c:\\test.txt";         ExecInfo.nShow = SW_SHOWNORMAL;         MessageBox(NULL,"三十秒後自動關閉","開啟外部檔案",MB_OK);         ShellExecuteEx(&ExecInfo);                  GetExitCodeProcess(ExecInfo.hProcess,&exit_code);         while (exit_code==STILL_ACTIVE) {                 i++;                 Sleep(1000);                 if (i==30) {                         TerminateProcess(ExecInfo.hProcess,0);                         break;                 }                 GetExitCodeProcess(ExecInfo.hProcess,&exit_code);         }         if (i!=30) {                 MessageBox(NULL,"程式已被使用者關閉","開啟外部檔案",MB_OK);         }  但小弟實在不會應用在 如何將任意文件(引用程式不知,由os決定)開啟在  form之某panel內,所以才有此問題.    
Mickey
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-24 22:41:39 IP:218.32.xxx.xxx 未訂閱
引言: 如何將任意文件(引用程式不知,由os決定)開啟在 form之某panel內,所以才有此問題.
兩個 Application ,而且其中一個不在掌控之中... 要做到這樣的功能...呵呵...滿難的. 如果您只要找出
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-25 00:47:06 IP:211.76.xxx.xxx 未訂閱
a123473119你好:     要達到你的目的,可能是需要用到OLE吧(OLE我不熟,不過站上已經有不少高手的文章和教學)。 如果用你現在的方向進行,會遇到兩個大問題。一個是目標文件的視窗要放到panel中時要設定其parent window,但我記得win api有限制不能在不同的行程間做這個動作。另一個是不同的程式是不同的執行序,在訊息的發配處理上會有不同步的問題。所以取到了Handle,下一步...
a123473119
一般會員


發表:19
回覆:46
積分:18
註冊:2002-08-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-26 07:10:20 IP:211.76.xxx.xxx 未訂閱
感謝Mickey,Pwipwi二位前輩: 現在我先用 getexecutable 取得 ExeName,(已知FileName), 利用ShellExecuted "open" 此 FileName檔,用 HIDE MODE, 但用 FINDWINDOW(nil,PCHAR(ExeName)) 或 FINDWINDOW(nil,PCHAR(FileName)) 皆找不到此window之HWND ?? (SETPARENT(Hson,Hparent) MOveWindow 是可動作的)
Mickey
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-26 13:31:48 IP:218.170.xxx.xxx 未訂閱
引言: 現在我先用 getexecutable 取得 ExeName,(已知FileName), 利用ShellExecuted "open" 此 FileName檔,用 HIDE MODE, 但用 FINDWINDOW(nil,PCHAR(ExeName)) 或 FINDWINDOW(nil,PCHAR(FileName)) 皆找不到此window之HWND ??
FINDWINDOW 必須傳入 ClassName 或 WindowText, 不過看你的需求, 這兩個參數都不固定... FindWindow 的使用, 參考看看:
procedure TForm1.Button2Click(Sender: TObject);
begin
  ShellExecute(Handle,'Open','E:\dum.txt','','',SW_NORMAL);
end;    procedure TForm1.Button1Click(Sender: TObject);
var H:HWND;
begin
  H:=FindWindow(nil,'未命名 - 記事本'); // Find via WindowText
  H:=FindWindow('NotePad',nil); // Find via ClassName
  if H<>0 then Windows.SetParent(H,Panel1.Handle)
  else Showmessage('Window Handle not found');
end;
引言: (SETPARENT(Hson,Hparent) MOveWindow 是可動作的)
感謝您.
a123473119
一般會員


發表:19
回覆:46
積分:18
註冊:2002-08-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-07-26 17:35:29 IP:211.76.xxx.xxx 未訂閱
getclassname  ---> win98+off2000    記事本 為 Notepad    msword 為 OpusApp    excel  為 XLMAIN   若換os,或 office 版本,也無法確定 classname會不會有變化. 只好暫時用 1) ShellExecuted open,SW_NORMAL (讓其active)            2) sleep            3) getforgroundwindow (取得最後出現之window hwnd)            4) setparent  ( set parent to panel )            5) movewindow ( move in panel) 怕繼續浪費各位前輩時間,先結案. 再次感謝各位前輩鼎力相助,後進穫益良多.      
系統時間:2024-06-02 10:38:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!