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

如何隱藏本身在工作列的圖示?

尚未結案
chtai
高階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-02 10:49:49 IP:203.67.xxx.xxx 未訂閱
請問各位: 我想在程式啟動時,就不要出現在工作列, 所以我寫了以下的程式碼,可是無效。
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    ShowWindow(Application->Handle, SW_HIDE);    
}
請問要怎麼做,才能在啟動時就隱藏呢 ? 另外,我發現在隱藏的時候,它還是會先出現在工作列, 然後再馬上消失不見。 有沒有辦法連出現都不要讓它出現呢 ? -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-02 12:08:46 IP:211.76.xxx.xxx 未訂閱
把這段寫再OnShow裡面就可以了,只是他會有你說的先出現在工具列然後立刻消失
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-02 12:21:33 IP:219.68.xxx.xxx 未訂閱
您好: 以下您參考看看。 void __fastcall TForm1::FormCreate(TObject *Sender) { SetWindowLong(Application->Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW); } 發表人 - supman 於 2005/07/02 12:23:42
chtai
高階會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-03 08:36:55 IP:211.74.xxx.xxx 未訂閱
引言: 您好: 以下您參考看看。 void __fastcall TForm1::FormCreate(TObject *Sender) { SetWindowLong(Application->Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW); }
supman 大哥,Delphi 我雖然不會寫,不過多少看得懂一些 這似乎是直接就修改了視窗顯示的方式了, 可是若我除了原本的要求之外(一開始就隱藏), 我還想加上一個
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-03 13:31:24 IP:219.68.xxx.xxx 未訂閱
您好: 要符合同時能夠在一開始就隱藏於工作列上,又要能自行讓使用者決定是否顯示於工作列,除非您的程式一開始就不秀出畫面,不然我看了2~30篇討論串似乎無法達到。 1.使用 SetWindowLong(Application->Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW); 但執行時期永遠也不會再出現於工作列。 2.使用 ShowWindow(Application->Handle, SW_HIDE); ShowWindow(Application->Handle, SW_RESTORE); 但會在工作列閃一下 3.使用常駐工作列的方式 Application->ShowMainForm:=False; 但那會使畫面完全不會顯示出來,而如果設立一個Timer去馬上Show Form出來 procedure TForm1.Timer1Timer(Sender: TObject); begin Form1.Show; ShowWindow(Application.Handle, SW_HIDE); end; 一樣他還是會閃一下。 如果可以讓一開始不要秀出畫面的話,第三點可以辦到,您參考參考。 發表人 - supman 於 2005/07/03 13:36:01
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-04 02:51:10 IP:221.169.xxx.xxx 未訂閱
chtai:
void __fastcall TForm1::FormShow(TObject *Sender)
{
  CheckBox1->Checked=true;
  ::ShowWindow(Application->Handle, SW_HIDE);
}
//---------------------------------------------------------------------------    void __fastcall TForm1::CheckBox1Click(TObject *Sender)
{
  if (CheckBox1->Checked)
    ::ShowWindow(Application->Handle, SW_HIDE);
  else
    ::ShowWindow(Application->Handle, SW_SHOW);
}
附上相關請自我測試
請指定sw_type==0..11    int show;//宣告變數
//由多選一選項,選取顯現狀態
switch(sw_type)
   {
   case 0: show = SW_MAXIMIZE; break;
   case 1: show = SW_MINIMIZE; break;
   case 2: show = SW_RESTORE; break;
   case 3: show = SW_SHOW; break;
   case 4: show = SW_SHOWDEFAULT; break;
   case 5: show = SW_SHOWMAXIMIZED; break;
   case 6: show = SW_SHOWMINIMIZED; break;
   case 7: show = SW_SHOWMINNOACTIVE; break;
   case 8: show = SW_SHOWNA; break;
   case 9: show = SW_SHOWNOACTIVATE; break;
   case 10: show = SW_SHOWNORMAL; break;
   case 11: show = SW_HIDE; break;
   }
//改變Project1母視窗顯現狀態
::ShowWindow(Application->Handle, show);
請參考!
Andy Chang
------
Andy Chang
chtai
高階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-06 21:50:44 IP:203.70.xxx.xxx 未訂閱
Hi 各位,最後我找到解答了, 它完全達到我的需求,分享出來給大家參考。    以下是在啟動時決定是否要出現在下方的工作列:
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    // 在這之前先做一些初始化的動作,
    // 像我就去讀取 ini 檔, 決定是否要顯示在 Taskbar,
    // 然後把結果存在一個 bool 變數 IsInTaskbar
    ShowWindow(Application->Handle, SW_HIDE);
    if (IsInTaskbar)  
    {
        SetWindowLong(Application->Handle, GWL_EXSTYLE,
            GetWindowLong(Application->Handle, GWL_EXSTYLE) &
            (~WS_EX_TOOLWINDOW | WS_EX_APPWINDOW));
    }
    else
    {
        SetWindowLong(Application->Handle, GWL_EXSTYLE,
            GetWindowLong(Application->Handle, GWL_EXSTYLE) |
            WS_EX_TOOLWINDOW & ~WS_EX_APPWINDOW);
    }
    ShowWindow(Application->Handle, SW_SHOW);
}
以下是用一個 CheckBox 在 runtime 決定是否要出現在工作列:
 
void __fastcall TForm1::chkIsInTaskBarClick(TObject *Sender)
{
    ShowWindow(Application->Handle, SW_HIDE);
    if (chkIsInTaskBar->Checked)
    {
        SetWindowLong(Application->Handle, GWL_EXSTYLE,
            GetWindowLong(Application->Handle, GWL_EXSTYLE) &
            (~WS_EX_TOOLWINDOW | WS_EX_APPWINDOW));
    }
    else
    {
        SetWindowLong(Application->Handle, GWL_EXSTYLE,
            GetWindowLong(Application->Handle, GWL_EXSTYLE) |
            WS_EX_TOOLWINDOW & ~WS_EX_APPWINDOW);
    }
    ShowWindow(Application->Handle, SW_SHOW);
}
兩者加起來,就可以在程式一啟動就決定是否要顯示在工作列, 又可以在執行期間,透過 CheckBox 動態決定是否要顯示出來。 不過,有沒有人可以為我解釋一下, SetWindowLong 裡頭那一大串是怎麼一回事阿? 這是我找到的程式碼,可是我不懂為什麼要那樣設定。 -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-06 23:15:42 IP:221.169.xxx.xxx 未訂閱
chtai:最簡單的翻譯是
//將修改的型態資料,重設Application->Handle型態
//改變指定視窗的型態與狀態!
完整說明:
Help->Windows SDK->SetWindowLong
請參考!
Andy Chang 發表人 - andychang1690 於 2005/07/06 23:18:26
------
Andy Chang
chtai
高階會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-07-07 00:00:17 IP:203.70.xxx.xxx 未訂閱
引言:
chtai:最簡單的翻譯是
//將修改的型態資料,重設Application->Handle型態
//改變指定視窗的型態與狀態!
完整說明:
Help->Windows SDK->SetWindowLong
請參考!
我想您誤會我的意思了 :) 我搞不懂的是,為什麼那些參數一陣 bitwise AND, OR, NOT 之後, 就可以達到我要的功能阿? 也就是說,它們一陣 AND, OR, NOT 之後所代表的意義是什麼呢? 就算我完全知道有哪些參數可用, 我也絕對想不到把它們 AND, OR, NOT 之後會變成這樣 --
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-07-07 13:59:58 IP:221.169.xxx.xxx 未訂閱
chtai:我試試看解釋:
GetWindowLong:取得物件的原有型態資料,傳回為DWORD
所以GetWindowLong(Application->Handle, GWL_EXSTYLE)
可以為 
DWORD dwStyle = GetWindowLong(Application->Handle, GWL_STYLE);
接下來:
WS_EX_APPWINDOW:
設置擴展風格為WS_EX_APPWINDOW,強制使窗口可見於最前面
WS_EX_TOOLWINDOW 可以創建一個工具窗口,被作為浮動工具欄使用。工具窗口的標題欄比常規標題欄短,並且使用的視窗字體更小。工具窗口不會出現在任務欄裏;當用戶按下 ALT TAB 健後,也不會出現在工作列中......
所以重點是:
這個不可見窗口的擴展式樣必須設置 WS_EX_TOOLWINDOW
保證擴展式樣沒有設置 WS_EX_APPWINDOW    & (WS_EX_TOOLWINDOW | ~WS_EX_APPWINDOW)
等於
dwStyle |= WS_EX_TOOLWINDOW ;  // 新增
dwStyle &= ~WS_EX_APPWINDOW;   // 解除
所以你原
SetWindowLong(Application->Handle, GWL_EXSTYLE,
            GetWindowLong(Application->Handle, GWL_EXSTYLE) &
            (WS_EX_TOOLWINDOW | ~WS_EX_APPWINDOW));
可以為
//取得Application的原有型態資料
DWORD dwStyle = GetWindowLong(Application->Handle, GWL_STYLE);
dwStyle |= WS_EX_TOOLWINDOW ;  // 新增
dwStyle &= ~WS_EX_APPWINDOW;   // 解除
//將修改的型態資料,重設Application型態
SetWindowLong(Application->Handle, GWL_EXSTYLE,dwStyle);
這方面的資料你可以去查詢VC(MFC)的相關資料。
Andy Chang 發表人 - andychang1690 於 2005/07/07 14:03:35
------
Andy Chang
chtai
高階會員


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-07-07 15:33:13 IP:61.222.xxx.xxx 未訂閱
感謝您的解說 :) 我明白了~ -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
系統時間:2024-11-22 4:45:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!