請問當按下桌面的捷徑後,要如何讓Tray Icon顯示畫面 |
尚未結案
|
Rexchiang
一般會員 發表:8 回覆:8 積分:3 註冊:2003-05-22 發送簡訊給我 |
請問各位大大,當程式縮小在System Tray後(使用TrayIcon元件),如要讓使用者按桌面上的捷徑,而Show程式的主畫面,但因我的程式在FormCreate時會去判斷程式有無重覆執行,所以會將程式給結束掉而無法顯示主畫面,不知各位有無解決方法呢,謝謝!!
以下為判斷程式有無重覆執行的Code
Application->Title = MainForm->Caption; HANDLE PrevInstHandle; HANDLE Mutex = OpenMutex(SYNCHRONIZE, false, Application->Title.c_str()); if(Mutex != NULL){ String AppTitle = Application->Title; SetWindowText(Application->Handle, NULL); PrevInstHandle = FindWindow("TApplication", AppTitle.c_str()); if(PrevInstHandle != 0){ if(IsIconic(PrevInstHandle) != 0){ ShowWindow(PrevInstHandle, SW_RESTORE); }else{ BringWindowToTop(PrevInstHandle); } SetForegroundWindow(PrevInstHandle); } Application->ShowMainForm = false; Application->Terminate(); }else CreateMutex(NULL, false, Application->Title.c_str()); |
bass15
高階會員 發表:24 回覆:171 積分:119 註冊:2003-10-27 發送簡訊給我 |
|
Rexchiang
一般會員 發表:8 回覆:8 積分:3 註冊:2003-05-22 發送簡訊給我 |
謝謝base15大大的回答,我先將問題再詳述一次,以MSN為例,當執行MSN時會彈跳出主畫面,當將MSN關閉後,MSN會縮小至工具列,如此時去按桌面上MSN的捷徑,MSN會再次彈跳出主畫面,我所要的功能就是此種動作。
因為要避免程式有重覆執行的狀況,所以才會加上上述的Code,但我發現,當程式在工具列時,FindWindow所找到的視窗會為第二次執行的視窗,所以會將第二次執行的視窗帶到前景,然後就結束掉,因此程式畫面會閃動一下,但卻沒有將第一次執行的視窗帶到前景,我也確定MainForm的Caption是正確的,但是就是不知道要如何在第二次執行時去取得第一次的Handle,這就是問題所在,不知大大有無解決方法,謝謝!!
|
nlj859
資深會員 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
Hello Rexchiang, 我試過那段"不重覆執行程式",發現沒有問題.
就如同你說的:"把MSN縮小在右下角,執行MSN時會彈跳出主畫面,當將MSN關閉後,MSN會縮小至工具列,如此時去按桌面上MSN的捷徑(或是該執行檔),MSN會再次彈跳出主畫面".
但是我不太清楚:"但我發現,當程式在工具列時,FindWindow所找到的視窗會為第二次執行的視窗,所以會將第二次執行的視窗帶到前景,然後就結束掉,因此程式畫面會閃動一下,但卻沒有將第一次執行的視窗帶到前景,我也確定MainForm的Caption是正確的,但是就是不知道要如何在第二次執行時去取得第一次的Handle,這就是問題所在"
什麼叫"FindWindow所找到的視窗會為第二次執行的視窗,所以會將第二次執行的視窗帶到前景,然後就結束掉",我想不管它是找哪一個,關掉哪一個,最後能夠出現的視窗是你要的就好了.
還是說,你的第一次視窗和第二次開的視窗會不一樣,而你要的是第一個的視窗?
能不能在附上照片或是程式碼上來呢? 請再試著開個新專案,拉進一個TrayIcon,Visible設為True,把code加進FormCreate.
void __fastcall TForm1::FormCreate(TObject *Sender) { Application->Title=Form1->Caption; HANDLE PrevInstHandle; HANDLE Mutex = OpenMutex(SYNCHRONIZE,false,Application->Title.c_str()); if (Mutex != NULL) { String AppTitle=Application->Title; SetWindowText(Application->Handle,NULL); PrevInstHandle = FindWindow("TApplication", AppTitle.c_str()); if (PrevInstHandle != 0) { if (IsIconic(PrevInstHandle)) ShowWindow(PrevInstHandle, SW_RESTORE); else BringWindowToTop(PrevInstHandle); SetForegroundWindow(PrevInstHandle); } Application->ShowMainForm = false; Application->Terminate(); } else CreateMutex(NULL, false, Application->Title.c_str()); }再試看看吧. 發表人 - nlj859 於 2004/08/20 11:09:51 |
Rexchiang
一般會員 發表:8 回覆:8 積分:3 註冊:2003-05-22 發送簡訊給我 |
謝謝nlj859大大的回覆,我今天測試的結果是如果是用System Menu的縮小,是能夠符合我的需求,但我的程式是將System Menu Disable,而另外建立二個Button取代,其中一個Button是叫出Help File,另一個為縮小,如按下此Button則第二次執行時,程式會無法顯示主畫面,程式如下
void __fastcall TForm1::FormCreate(TObject *Sender) { Application->Title=Form1->Caption; HANDLE PrevInstHandle; HANDLE Mutex = OpenMutex(SYNCHRONIZE,false,Application->Title.c_str()); if (Mutex != NULL) { String AppTitle=Application->Title; SetWindowText(Application->Handle,NULL); PrevInstHandle = FindWindow("TApplication", AppTitle.c_str()); if (PrevInstHandle != 0) { if (IsIconic(PrevInstHandle)) ShowWindow(PrevInstHandle, SW_RESTORE); else BringWindowToTop(PrevInstHandle); SetForegroundWindow(PrevInstHandle); } Application->ShowMainForm = false; Application->Terminate(); } else CreateMutex(NULL, false, Application->Title.c_str()); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Form1->Hide(); } //---------------------------------------------------------------------------我是那裏弄錯了呢???? |
nlj859
資深會員 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
Hello Rexchiang, 你使用Form1->Hide();只是把Form隱藏起來而已吧. 請試試TrayIcon的Visible先設為false. Button1Click改為如下:
void __fastcall TForm1::Button1Click(TObject *Sender) { if (TrayIcon1->Visible==false) { TrayIcon1->Visible=true; TrayIcon1->Minimize(); } }再試一次. |
bass15
高階會員 發表:24 回覆:171 積分:119 註冊:2003-10-27 發送簡訊給我 |
Application->Title = MainForm->Caption; HANDLE PrevInstHandle; HANDLE Mutex = OpenMutex(SYNCHRONIZE, false, Application->Title.c_str()); if(Mutex != NULL){ String AppTitle = Application->Title; Application->Title = "newApp"; SetWindowText(Application->Handle, NULL); PrevInstHandle = FindWindow("TApplication", AppTitle.c_str()); if(PrevInstHandle != 0){ if(IsIconic(PrevInstHandle) != 0){ ShowWindow(PrevInstHandle, SW_RESTORE); }else{ BringWindowToTop(PrevInstHandle); } SetForegroundWindow(PrevInstHandle); } Application->ShowMainForm = false; Application->Terminate(); }else CreateMutex(NULL, false, Application->Title.c_str());加上紅色這行試試 |
Rexchiang
一般會員 發表:8 回覆:8 積分:3 註冊:2003-05-22 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |