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

請問當按下桌面的捷徑後,要如何讓Tray Icon顯示畫面

尚未結案
Rexchiang
一般會員


發表:8
回覆:8
積分:3
註冊:2003-05-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-19 18:29:45 IP:220.139.xxx.xxx 未訂閱
請問各位大大,當程式縮小在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-19 22:02:56 IP:61.59.xxx.xxx 未訂閱
不太董你要什麼樣的功能... 不過照你的程式看來..若重複執行2次程式 第二次執行的程式會關掉 第一次執行的程式會被秀出來帶到畫面前面.. 所以你所說的功能已經達到... 如果你的程式開不了 那你把MainForm的Caption改一下看看
Rexchiang
一般會員


發表:8
回覆:8
積分:3
註冊:2003-05-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-20 09:58:20 IP:220.139.xxx.xxx 未訂閱
謝謝base15大大的回答,我先將問題再詳述一次,以MSN為例,當執行MSN時會彈跳出主畫面,當將MSN關閉後,MSN會縮小至工具列,如此時去按桌面上MSN的捷徑,MSN會再次彈跳出主畫面,我所要的功能就是此種動作。 因為要避免程式有重覆執行的狀況,所以才會加上上述的Code,但我發現,當程式在工具列時,FindWindow所找到的視窗會為第二次執行的視窗,所以會將第二次執行的視窗帶到前景,然後就結束掉,因此程式畫面會閃動一下,但卻沒有將第一次執行的視窗帶到前景,我也確定MainForm的Caption是正確的,但是就是不知道要如何在第二次執行時去取得第一次的Handle,這就是問題所在,不知大大有無解決方法,謝謝!!
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-20 11:01:54 IP:219.80.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-20 12:13:16 IP:220.139.xxx.xxx 未訂閱
謝謝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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-20 12:33:53 IP:219.80.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-20 13:47:07 IP:219.84.xxx.xxx 未訂閱
 
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-08-20 13:47:40 IP:220.139.xxx.xxx 未訂閱
謝謝nlj859大大的回答,照你所說的方法已解決我的困擾....謝謝!!!
系統時間:2024-04-29 7:46:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!