分類  >  編程>Delphi >

窗體不在任務欄顯示,該如何處理

tags:    時間:2014-05-04 19:34:13
窗體不在任務欄顯示
我有幾個窗體創建自 DLL。
DLL 中窗體會顯示在任務欄上。
我查了網上最靠譜的做法是
SetWindowLong(hForm,GWL_EXSTYLE,WS_EX_TOOLWINDOW);

但是,我這個窗體本身不是Dialog,是有最大化,最小化按鈕的 bsSizeable
有沒有什麼做法,即可以不顯示在任務欄,又保持原本的風格?

------解決方案--------------------
設置你DLL種Application的Handle為主程序的某個窗口句柄,例如Application.Handle
------解決方案--------------------
Application.ShowMainForm := False;
Application.MainFormOnTaskBar := False;
------解決方案--------------------
引用:
Quote: 引用:

設置你DLL種Application的Handle為主程序的某個窗口句柄,例如Application.Handle


武稀鬆?
拜讀過您的部分博文。
受益匪淺,非常感謝。

對於您說的方法,我開始就是這麼做的。
1. 保存 Dll App.Handle
2. 用 exe App.Handle 賦值 Dll App.Handle
3. 使用。。。
4. 歸還 Dll App.Handle。(釋放 Dll 前)

原本用的好好的。
不過,也不清楚是哪裡出的問題。
當調用 MessageBox (第一個參數,就是 Dll Form. Handle)之後,
有一半的幾率,會出現一個沒有文字的框,在任務欄里。多出來的,與主程序並存。
特別是 exception 的時候,出現率高。
關閉它,也會跟主程序的那個框,一樣。會關閉程序。

只有當任務欄里,存在一個 Dll Form 的標題框時,同樣的代碼,不會增加這個無文字的框。

Win7 64 位 + Delphi 2007


從描述的狀況看,dll彈出窗口會提交退出程序消息(WM_QUIT)。窗口應該是調用了application.Terminate,提交了該消息。
VCL窗體內部處理,除非是主窗口,否則不會調用方法。可以先確認一下以下兩個問題:
1、在Application.Terminate設置斷點,出現問題時,分析棧:看誰調用?
2、dll中的窗口是如何創建?application.CreateForm?注意其中FMainForm及MainFormOnTaskBar的處理。
------解決方案--------------------
dll中不能用application創建窗體,要用窗口類構造函數創建

推薦閱讀文章

Bookmark the permalink ,來源:互聯網