什麼是TApplication.Handle
?德爾福:什麼是Application.Handle?
- 它從何而來?
- 它爲什麼存在?
- 而最重要的是:爲什麼所有表單都將它作爲父窗口處理?
Delphi幫助說:
TApplication.Handle
提供對窗口辦理 應用的主要形式(窗口)的 。調用Windows API的需要父窗口句柄 功能 時
property Handle: HWND;
說明
用途把手。例如, 顯示其自己的頂層彈出窗口 一個DLL需要一個父窗口 在 應用顯示其窗口。使用手柄財產 使得 應用程序的窗口等部分,讓他們 最小化,恢復,啓用和 與應用程序禁用。
如果我專注於詞「應用的主要形式的窗口句柄」,我認爲這意味着應用的主要形式的窗口句柄,然後我可以比較:
- 「應用程序的主要形式的窗口句柄」,用
- 的
Application
MainForm
的窗口句柄
,但他們是不一樣的:
Application.MainForm.Handle: 11473728
Application.Handle: 11079574
那麼,什麼是Application.Handle
?
- 它從何而來?
- 什麼窗口®窗口句柄是它?
- 如果它是的Windows ®窗口句柄的
Application
的MainForm
,那他們爲什麼不匹配? - 如果是不是
Application
的窗口句柄MainForm
,那麼它是什麼? - 更重要的是:爲什麼它是每種形式的最終父母?
- 而且最重要的是:如果我試圖讓一個窗體沒有顯示(所以我可以顯示在任務欄上),或者嘗試使用類似IProgressDialog的東西,爲什麼一切都會失控?
真的,我問的是:什麼是使Application.Handle存在的設計原理?如果我能理解爲什麼,那該如何變得明顯。
更新通過的二十個問題遊戲的認識:
此:
在談論如何讓一個窗口的解決方案通過使它的主人
null
,Peter Below in 2000 said出現在任務欄上可能會導致一些問題與 輔助形式顯示的模態形式。如果用戶在模態 表單啓動時切換離開應用程序,然後回到顯示它的表單,模式表單可能會隱藏在表單下方 。這是可能通過確保 模式窗體父到顯示了它的形式( `params.WndParent``如上使用)
應對這種但這是不可能的從標準 對話
Dialogs
單元和例外,這就需要更多的努力 讓他們的工作權利(基本處理Application.OnActivate
, 通過GetLastActivePopup
尋找父對象應用模式表單,並通過SetWindowPos
將他們的Z順序的頂部) 。
- 爲什麼模式表單最終會被卡在其他表單之後?
- 什麼機制通常將模態形式帶到前面,爲什麼它在這裏不起作用?
- Windows ®負責顯示窗口堆疊。 Windows ®沒有顯示正確的窗口出了什麼問題?
他還談到使用新的Windows擴展樣式,迫使一個窗口出現在任務欄上(當使它無主的一般規則是不夠的,不切實際的,或不希望),通過添加WS_EX_APPWINDOW
擴展風格:
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(params);
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;
但他警告:
如果您在輔助形式單擊任務欄按鈕,而另一個應用是 活躍,這將仍然把所有的應用程序˚F orms前面。如果您 不希望有選擇
誰把所有形式的前面,當窗體的所有者仍然是Application.Handle
。是應用程序這樣做?它爲什麼這樣做?而不是這樣做,不應該不是要做到這一點嗎? 不是這樣做的缺點是什麼;我看到的的缺點做它(系統菜單的不propertly工作,任務欄按鈕的縮略圖是不準確時,Windows ®外殼無法最小化窗口
在另一篇文章中涉及的Application
,Mike Edenfield says that the parent window sends other window's their minimize, maximize and restore messages:
這將增加任務欄按鈕的形式,但也有其他一些小的細節 手柄。最明顯的是,你的表格仍收到最小化/最大化獲取發送到父 形式(理論上的主要形式e應用程序)。
procedure WMSysCommand(var Msg: TMessage); WM_SYSCOMMAND; procedure TParentForm.WMSysCommand(var Msg: TMessage); begin if Msg.wParam = SC_MINIMIZE then begin // Send child windows message, don't // send to windows with a taskbar button. end; end;
注意,此處理雲在家長形式要表現的一個independantly的>:爲了避免這種情況,你可以通過添加一條線,如安裝WM_SYSCOMMAND消息 處理器應用程序的其餘部分,以避免傳遞最小化消息。您可以添加類似>代碼SC_MAXIMIZE,SC_RESTORE等
它是如何最小化/最大化/還原我的Windows ® Windows消息都不會到我的窗口?這是否是因爲發往窗口的消息是由Windows ®發送給窗口的所有者?在這種情況下,Delphi應用程序中的所有表單均由Application
「擁有」?這是否並不意味着讓車主空:
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.WndParent := 0; //NULL
end;
將刪除Application
,並從我的形式,干擾它的窗口句柄,和Windows應該再次發出我我mimimize /最大化/還原郵件?
或許,如果我們比較和對照現在「正常」的Windows應用程序做的事情,與Borland如何最初設計Delphi應用程序做的事情 - 對於此Application
對象和它的主循環。
- 什麼解決方案是
Application
對象解決? - Delphi的後續版本做了哪些修改,以便這些相同的問題不存在?
- Delphi的後續版本中的更改是否引入了其他問題,即初始應用程序設計如何努力解決?
- 這些較新的應用程序如何在沒有Application干擾的情況下仍能正常工作?
很明顯,Borland意識到了他們最初設計中的缺陷。他們最初的設計是什麼?它解決了什麼問題?缺陷是什麼?重新設計了什麼?它是如何解決問題的?
我想你會有興趣瞭解這兩個技巧:http://yoy.be/item.asp?i89 http://yoy.be/item.asp?i87 – 2010-02-05 07:12:30
@Stinh桑德斯:我'已經看到了這些,他們不解決問題。此外,絕對不要將GetDesktopWindow作爲窗口的所有者傳遞,因爲這些主題和其他帖子都暗示了這一點。這樣做會導致Windows凍結。這是微軟修補CreateWindow的一個問題,因此任何傳遞GetDesktopWindow作爲所有者的人都改爲使用NULL。如果我可以在** yoy.com **上編輯該帖子,我會的。 – 2010-02-05 14:52:39