用ShellExecuted開啟任何文件檔,如何取得HWND |
尚未結案
|
a123473119
一般會員 發表:19 回覆:46 積分:18 註冊:2002-08-08 發送簡訊給我 |
|
a123473119
一般會員 發表:19 回覆:46 積分:18 註冊:2002-08-08 發送簡訊給我 |
各位前輩呢? 皆放暑假了.
我知道這個問題曾討論過,最後是 已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 發送簡訊給我 |
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
a123473119
一般會員 發表:19 回覆:46 積分:18 註冊:2002-08-08 發送簡訊給我 |
感謝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 發送簡訊給我 |
引言: 現在我先用 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 發送簡訊給我 |
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)
怕繼續浪費各位前輩時間,先結案.
再次感謝各位前輩鼎力相助,後進穫益良多.
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |