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

如何不讓程式重複執行?

尚未結案
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-10 02:00:02 IP:140.113.xxx.xxx 未訂閱
各位好,我知道這個問題已被問過很多次了, 我也有找過站上文章了,可是我還是有問題想請教。 我有用一個 TrayIcon,我寫的程式行為如下: 正常大小時,只會顯示在下方的工具列, 最小化時,只會顯示在右下方的系統列(或稱托盤)。 兩者不會同時發生。 而我程式 Form 的 Caption 會變,沒有固定的名稱。 我找了一下文章,似乎是針對固定的 Caption 來做判斷, 那像我現在這樣,要怎辦呢? -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁,歡迎大家跟我分享或一同推廣免費軟體。 若您覺得這網頁不錯,也歡迎您將它傳出去 :)
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-10 08:59:55 IP:61.63.xxx.xxx 未訂閱
引言: 各位好,我知道這個問題已被問過很多次了, 我也有找過站上文章了,可是我還是有問題想請教。 我有用一個 TrayIcon,我寫的程式行為如下: 正常大小時,只會顯示在下方的工具列, 最小化時,只會顯示在右下方的系統列(或稱托盤)。 兩者不會同時發生。 而我程式 Form 的 Caption 會變,沒有固定的名稱。 我找了一下文章,似乎是針對固定的 Caption 來做判斷, 那像我現在這樣,要怎辦呢? -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁,歡迎大家跟我分享或一同推廣免費軟體。 若您覺得這網頁不錯,也歡迎您將它傳出去 :)
chtai你好: 沒查之前的文章怎麼討論的,但我想解法應該是在程式啟動時先判斷系統中是否有某個已存在的 >! 另外列舉系統的 >!
GeorgeKu
中階會員


發表:1
回覆:120
積分:74
註冊:2004-10-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-10 11:24:55 IP:61.228.xxx.xxx 未訂閱
點選Project->View Source開啟下列程式碼加入紅色的部分就可以防止程式重複啟動 //--------------------------------------------------------------------------- #include #pragma hdrstop //--------------------------------------------------------------------------- USEFORM("Unit1.cpp", Form1); //--------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { HANDLE mutex; const char ProgramName[]="project1";//應用程式名稱 try { mutex=CreateMutex(NULL,true,ProgramName);//設定互斥旗標 if(GetLastError()==ERROR_ALREADY_EXISTS)//系統中已開啟過就不再啟動本程式 { ReleaseMutex(mutex); return 0; } Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } catch (...) { try { throw Exception(""); } catch (Exception &exception) { Application->ShowException(&exception); } } ReleaseMutex(mutex); return 0; } //---------------------------------------------------------------------------
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-10 16:24:09 IP:140.113.xxx.xxx 未訂閱
感謝 m8815010 大哥,我會再找找的。 感謝 GeorgeKu 大哥,你這招有用, 可是若我的程式已縮小到右下角,要如何把它叫出來呢? 也就是說,除了不讓程式重複執行,還要把縮小的程式叫出來。 -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁,歡迎大家跟我分享或一同推廣免費軟體。 若您覺得這網頁不錯,也歡迎您將它傳出去 :)
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
GeorgeKu
中階會員


發表:1
回覆:120
積分:74
註冊:2004-10-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-11 15:32:08 IP:61.228.xxx.xxx 未訂閱
我的功力尚淺所以無法想到用比較簡單的方式去達到你要的目的,本來想說用SHOWWINDOW API直接去呼叫FORM出來,由於TRAYICON是用物件的方式包裝,所以直接用SHOWWINDOW會產生一些問題,我目前想到的方法是用傳訊息的方式,當接收到訊息後再用TRAYICON的RESTORE()函數去叫出畫面來,以下紅色的部分是我加上去的程式碼    Project1.cpp //---------------------------------------------------------------------------    #include  #pragma hdrstop //--------------------------------------------------------------------------- USEFORM("Unit1.cpp", TestForm); //--------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { HANDLE mutex; try { mutex=CreateMutex(NULL,true,"test");//設定互斥旗標 if(GetLastError()==ERROR_ALREADY_EXISTS)//系統中已開啟過就不再啟動本程式 { SendMessage(FindWindow("TTestForm",NULL),WM_USER 100,119,119); return 0; } Application->Initialize(); Application->CreateForm(__classid(TTestForm), &TestForm); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } catch (...) { try { throw Exception(""); } catch (Exception &exception) { Application->ShowException(&exception); } } ReleaseMutex(mutex); return 0; } //--------------------------------------------------------------------------- Unit.cpp //--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "trayicon" #pragma resource "*.dfm" TTestForm *TestForm; //--------------------------------------------------------------------------- __fastcall TTestForm::TTestForm(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TTestForm::OwnMsg(TMessage &Msg) { if(Msg.LParam==119) TrayIcon1->Restore(); } //--------------------------------------------------------------------------- Unit.h //--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include #include #include #include <Forms.hpp> #include "trayicon.h" //--------------------------------------------------------------------------- class TTestForm : public TForm { __published: // IDE-managed Components TTrayIcon *TrayIcon1; private: // User declarations public: // User declarations void __fastcall OwnMsg(TMessage &Msg); BEGIN_MESSAGE_MAP VCL_MESSAGE_HANDLER(WM_USER 100, TMessage, OwnMsg); END_MESSAGE_MAP(TForm) __fastcall TTestForm(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TTestForm *TestForm; //--------------------------------------------------------------------------- #endif
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-13 00:28:09 IP:140.113.xxx.xxx 未訂閱
感謝 GeorgeKu 大哥的熱心, 可是你的程式碼裡頭用到了 FindWindow() 函式, 這是藉由完整的 Caption 來找。 但是我目前的問題就是,我的 Caption 是會變的! 所以這個函式就行不通啦~ 我想請問大家,是否有辦法藉由執行檔的名稱來找到 handle 呢? 若可以的話,那問題應該就會好辦多了。 -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁,歡迎大家跟我分享或一同推廣免費軟體。 若您覺得這網頁不錯,也歡迎您將它傳出去 :)
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
系統時間:2024-05-05 22:46:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!