如何讓自己寫的程式可以另外開啟"小算盤"? |
尚未結案
|
Titan_Lin
一般會員 ![]() ![]() 發表:10 回覆:6 積分:3 註冊:2004-08-18 發送簡訊給我 |
我現在知道有兩個function可以用:
ShellExecute(MainForm->Handle,"open","C:\\WINDOWS\\system32\\calc.exe",NULL,NULL,SW_SHOWNORMAL);
或
WinExec("C:\\WINDOWS\\system32\\calc.exe",SW_NORMAL); 兩個都可以開啟 但是請問用哪個會比較好? 還有 如果該台電腦沒有"calc.exe" 或者不在那個目錄
我如何去寫exceptoin呢? 對了 還有個問題
如果我要將我的程式關掉 會連由程式開啟的clac一併關掉
我要怎麼寫才好? 謝謝各位!
|
nlj859
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
引言: 我現在知道有兩個function可以用: ShellExecute(MainForm->Handle,"open","C:\\WINDOWS\\system32\\calc.exe",NULL,NULL,SW_SHOWNORMAL); 或 WinExec("C:\\WINDOWS\\system32\\calc.exe",SW_NORMAL); 兩個都可以開啟 但是請問用哪個會比較好? 還有 如果該台電腦沒有"calc.exe" 或者不在那個目錄 我如何去寫exceptoin呢? 對了 還有個問題 如果我要將我的程式關掉 會連由程式開啟的clac一併關掉 我要怎麼寫才好? 謝謝各位!Hello Titan_Lin, 判斷某個程式是否存在,存在即開啟.關閉程式則另外關閉小算盤 void __fastcall TForm1::FormCreate(TObject *Sender) { if (FileExists("C:\\WINNT\\system32\\calc.exe")) ShellExecute(NULL,NULL,"C:\\WINNT\\system32\\calc.exe",NULL,NULL,SW_SHOW); } void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { HWND HWndCalculator; //find calculator HWndCalculator=FindWindow(NULL,"小算盤"); //close Calculator if (HWndCalculator!=0) SendMessage(HWndCalculator, WM_CLOSE, 0, 0); } |
RaynorPao
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 我現在知道有兩個function可以用: ShellExecute(MainForm->Handle,"open","C:\\WINDOWS\\system32\\calc.exe",NULL,NULL,SW_SHOWNORMAL); 或 WinExec("C:\\WINDOWS\\system32\\calc.exe",SW_NORMAL); 兩個都可以開啟 但是請問用哪個會比較好? 還有 如果該台電腦沒有"calc.exe" 或者不在那個目錄 我如何去寫exceptoin呢? 對了 還有個問題 如果我要將我的程式關掉 會連由程式開啟的clac一併關掉 我要怎麼寫才好? 謝謝各位! Titan_Lin 你好: (1)以 calc.exe 來說,應該是不需要指定路徑的,因為 calc.exe 在 Windows 98/ME/NT/2000/XP/2003 裡面,不是放在 Windows 的目錄裡面,就是放在 System 的目錄底下,而這些路徑在一開機的時候,就已經記錄在作業系統的 全域變數「Path」裡面 (你可以自己開一個 DOS BOX,然後鍵入「path」, 就可以看到這個變數裡面記錄的內容) (2)也就是說,如果你想要呼叫 calc.exe 的話,就不需要再另外指定路徑,只 要這樣子寫,應該就可以了 ShellExecute(NULL, NULL, "calc.exe", NULL, NULL, SW_SHOWNORMAL); (3)但是你希望 calc.exe 被打開之後,能夠隨著自己的程式被關閉,而一起自 動關閉,那麼建議你利用 Win32 API CreateProcess 和 TerminateProcess 來達到目的 (4)以下的範例程式碼是在 Form 被建立的時候,就開啟 calc.exe (如果找不到 calc.exe,則會有錯誤訊息);在 Form 被關閉的時候,自動關閉 calc.exe ,因此要分別把控制的程式碼寫在 Form 的 constructor 以及 destructor 裡面,例如: // Unit1.h class TForm1 : public TForm { __published: // IDE-managed Components //...略... private: // User declarations //...略... public: // User declarations __fastcall TForm1(TComponent* Owner); __fastcall ~TForm1(); }; // Unit1.cpp STARTUPINFO gsi; PROCESS_INFORMATION gpi; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { if(!gpi.hProcess) { ZeroMemory(&gsi, sizeof(STARTUPINFO)); gsi.cb=sizeof(STARTUPINFO); ZeroMemory(&gpi, sizeof(PROCESS_INFORMATION)); if(!CreateProcess(NULL, "calc.exe", NULL, NULL, false, CREATE_NEW_PROCESS_GROUP+NORMAL_PRIORITY_CLASS, NULL, NULL, &gsi, &gpi)) { ShowMessage("Can't not find calc.exe"); } } } __fastcall TForm1::~TForm1() { if(gpi.hProcess) { TerminateProcess(gpi.hProcess, 0); } } (5)你可以再依照自己的需求,調整程式碼的位置,例如: 假設你要利用一個按 鈕來呼叫 calc.exe 的話,那就把上面 constructor 中的程式碼,移到 ButtonClick 裡面,應該就可以了 (6)MSDN 原始說明文件 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createprocess.asp http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/terminateprocess.asp
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |