如何隱藏本身在工作列的圖示? |
尚未結案
|
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
請問各位:
我想在程式啟動時,就不要出現在工作列,
所以我寫了以下的程式碼,可是無效。
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 發送簡訊給我 |
|
supman
尊榮會員 發表:29 回覆:770 積分:924 註冊:2002-04-22 發送簡訊給我 |
|
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
引言: 您好: 以下您參考看看。 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 發送簡訊給我 |
您好:
要符合同時能夠在一開始就隱藏於工作列上,又要能自行讓使用者決定是否顯示於工作列,除非您的程式一開始就不秀出畫面,不然我看了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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
|
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
引言:我想您誤會我的意思了 :) 我搞不懂的是,為什麼那些參數一陣 bitwise AND, OR, NOT 之後, 就可以達到我要的功能阿? 也就是說,它們一陣 AND, OR, NOT 之後所代表的意義是什麼呢? 就算我完全知道有哪些參數可用, 我也絕對想不到把它們 AND, OR, NOT 之後會變成這樣 --chtai:最簡單的翻譯是 //將修改的型態資料,重設Application->Handle型態 //改變指定視窗的型態與狀態! 完整說明: Help->Windows SDK->SetWindowLong 請參考!
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |