首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Windows 編程[4]:消息機制與消息循環深度解析

     編輯:Delphi

系統消息架構

  • 進程擁有一或多線程,系統維護**線程隊列**
  • 每線程有一**消息隊列**
  • 事件(點擊、鍵盤、定時器等)產生 → 系統投遞到對應線程消息隊列
  • 線程必須主動從隊列取出消息並處理

消息循環標準寫法

while GetMessage(Msg, 0, 0, 0) do begin
  TranslateMessage(Msg);  { 鍵盤虛擬鍵碼 → 字符消息 }
  DispatchMessage(Msg);   { 分發到窗口回調 }
end;

關鍵函數解析

  • GetMessage(var Msg, hWnd, wMsgFilterMin, wMsgFilterMax):
    • 第 2 參數 0 = 獲取該線程所有窗口消息
    • 返回 非零 = 有消息,0 = 收到 WM_QUIT,-1 = 錯誤
  • TranslateMessage:將 WM_KEYDOWN/UP 轉為 WM_CHAR 等字符消息,編輯框等控件依賴此機制
  • DispatchMessage:調用窗口回調函數 WndProc

如何退出消息循環?

只有收到 WM_QUIT 時 GetMessage 返回 0。在回調中調用 PostQuitMessage(exitCode) 向**當前線程**隊列投遞 WM_QUIT,exitCode 成為 WM_QUIT 的 wParam,最終可作為程序退出碼。

回調中的標準退出處理

function WndProc(wnd: HWND; msg: UINT; wParam: Integer; lParam: Integer): Integer; stdcall;
begin
  Result := 0;
  if msg = WM_DESTROY then
    PostQuitMessage(0)
  else
    Result := DefWindowProc(wnd, msg, wParam, lParam);
end.

DefWindowProc 的角色

處理開發者不關心的消息,返回回調所需的返回值,**必須調用**,否則窗口行為異常(無法移動、繪製、關閉等)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved