我定義了一個WndProc類似于下面的代碼(代碼是用 C Builder 撰寫的,但它也以類似的形式適用于 Delphi):
#define WM_SETTINGS_UPDATE WM_APP 1234
#define WM_GUI_UPDATE WM_APP 1235
void __fastcall TForm1::WndProc(TMessage &fMessage)
{
switch (fMessage.Msg)
{
default: break;
case WM_SETTINGS_UPDATE: ProcessMySettingsUpdate();
fMessage.Result = 1;
return;
break; // I know this is not needed, I do this purely for aesthetics
case WM_GUI_UPDATE: ProcessMyGUIUpdate();
fMessage.Result = 1;
return;
break; // I know this is not needed, I do this purely for aesthetics
}
TForm::WndProc(fMessage);
}
所以本質上是這樣的:
在這種情況下檢查我的自定義
WM_APP范圍訊息(WM_SETTINGS_UPDATE和)。WM_GUI_UPDATE處理這些訊息,然后設定
fMessage.Result為1指示訊息已處理并回傳(避免TForm:WndProc(fMessage),我理解這與 Delphi 中的相同inherited,如果處理訊息則不需要)。如果我的訊息沒有被處理,它只是呼叫
TForm:WndProc(fMessage)(或inherited)進行默認處理。
我擔心的是——如果出現應用程式關閉的情況,但仍有一些訊息未處理(留在訊息佇列中PostMessage())怎么辦?
在這種情況下,我想做的是避免呼叫我自己的處理,因為它可能會導致一些未初始化的記憶體訪問沖突或類似情況。這基本上就夠了,還是我需要應用一些特殊的處理來避免這種情況,或者處理一些“應用程式關閉”的代碼?
而且 - 我是否需要在完成處理后呼叫inherited/ TForm:WndProc(fMessage),或者像上面那樣做它是否安全(設定Result為 1 并回傳)?
注意 - 這不一定適用于MainForm(正在創建的第一個表單)。
uj5u.com熱心網友回復:
如果出現應用程式關閉的情況,但仍有一些訊息未處理(保留在訊息佇列中
PostMessage())怎么辦?
這完全沒問題。一旦表單HWND被銷毀,為該視窗發布的任何剩余訊息將在由主訊息回圈調度時被簡單地丟棄。你WndProc不會被要求為他們。
在這種情況下,我想做的是避免呼叫我自己的處理,因為它可能會導致一些未初始化的記憶體訪問沖突或類似情況。
這不應該是一個問題。一,因為訊息在銷毀后不會被發送到您的 Form HWND,二,當關閉時,主訊息回圈會在任何活動的 Form 被銷毀MainForm之前發出停止運行的信號。HWND因此,無論如何都不會有任何進一步的訊息發送。
這樣基本夠了嗎,還是需要做一些特殊的處理來避免那種情況
應該夠了。您通常不需要處理這種特殊情況(除非您的自定義訊息攜帶指向必須釋放的物件的指標)。
或處理一些“應用程式關閉”代碼?
如果您真的想檢測應用程式何時關閉,請嘗試讓您WndProc處理WM_CLOSE訊息(或者您可以使用表單的OnClose/Query事件)。
完成處理后是否需要呼叫
inherited/TForm:WndProc(fMessage),還是像上面那樣安全地進行操作(設定Result為 1 并回傳)?
這對于自定義訊息來說是完全可以的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/460739.html
