學習 Message(9): 訊息結構縱覽

來源:互聯網
上載者:User
傳遞訊息就是傳遞訊息資料, 資料是一組資料, 所以訊息是一個結構;
系統標準的訊息結構在 Delphi 中被定義為 TMsg
PMsg = ^TMsg;tagMSG = packed record  hwnd: HWND;  message: UINT;  wParam: WPARAM;  lParam: LPARAM;  time: DWORD;  pt: TPoint;end;TMsg = tagMSG;MSG = tagMSG;

但 TMsg 和 VCL 中的更多訊息結構如: TWMMouse、TWMKey 並不相容;
但 TWMMouse、TWMKey 等都可以相容: TMessage;
TMessage 是 VCL 重新定義的訊息結構:

PMessage = ^TMessage;TMessage = packed record  Msg: Cardinal;  case Integer of    0: (      WParam: WPARAM;      LParam: LPARAM;      Result: LRESULT);    1: (      WParamLo: Word;      WParamHi: Word;      LParamLo: Word;      LParamHi: Word;      ResultLo: Word;      ResultHi: Word);end;

有多少必要讓 Delphi 不直接使用 TMsg 而非要有個 TMessage 呢?
我現在所能知道的: 1、簡化; 2、增加傳回值; 肯定還有其他理由, 望先者告訴我.
但我想不管怎樣, VCL 最終肯定要迴歸 TMsg 的結構格式, 才能與系統打交道.

因為面對不同的訊息, 訊息參數的意義會完全不同;
在不同的訊息裡面, 有些參數也毫無意義, 可以省略;
另外, 有些訊息參數非常抽象, 需要反覆換算才得到我們容易理解的資料, 為什麼不直接使用容易理解的資料呢?
所以 Delphi 定義了更多的訊息結構:

TWMNoParamsTWMCancelMode       = TWMNoParams;TWMChildActivate    = TWMNoParams;TWMClear            = TWMNoParams;TWMClose            = TWMNoParams;TWMCopy             = TWMNoParams;TWMCut              = TWMNoParams;TWMDestroy          = TWMNoParams;TWMDestroyClipboard = TWMNoParams;TWMDrawClipboard    = TWMNoParams;TWMFontChange       = TWMNoParams;TWMGetDlgCode       = TWMNoParams;TWMGetFont          = TWMNoParams;TWMGetHotKey        = TWMNoParams;TWMGetTextLength    = TWMNoParams;TWMMDIGetActive     = TWMNoParams;TWMMDIIconArrange   = TWMNoParams;TWMMDIRefreshMenu   = TWMNoParams;TWMNCDestroy        = TWMNoParams;TWMPaintIcon        = TWMNoParams;TWMPaste            = TWMNoParams;TWMQueryDragIcon    = TWMNoParams;TWMQueryNewPalette  = TWMNoParams;TWMQueryOpen        = TWMNoParams;TWMQueueSync        = TWMNoParams;TWMRenderAllFormats = TWMNoParams;TWMSysColorChange   = TWMNoParams;TWMTimeChange       = TWMNoParams;TWMQueryUIState     = TWMNoParams;TWMUndo             = TWMNoParams;TWMKeyTWMChar       = TWMKey;TWMKeyDown    = TWMKey;TWMKeyUp      = TWMKey;TWMDeadChar   = TWMChar;TWMSysChar    = TWMKey;TWMSysKeyDown = TWMKey;TWMSysKeyUp   = TWMKey;TWMMouseTWMLButtonDblClk = TWMMouse;TWMLButtonDown   = TWMMouse;TWMLButtonUp     = TWMMouse;TWMMButtonDblClk = TWMMouse;TWMMButtonDown   = TWMMouse;TWMMButtonUp     = TWMMouse;TWMMouseMove     = TWMMouse;TWMRButtonDblClk = TWMMouse;TWMRButtonDown   = TWMMouse;TWMRButtonUp     = TWMMouse;TWMMouseWheelTMSHMouseWheelTWMWindowPosMsgTWMWindowPosChanged  = TWMWindowPosMsg;TWMWindowPosChanging = TWMWindowPosMsg;TWMScrollTWMHScroll = TWMScroll;TWMVScroll = TWMScroll;TWMActivateTWMActivateAppTWMAskCBFormatNameTWMChangeCBChainTWMCharToItemTWMVKeyToItem = TWMCharToItem;TWMChooseFont_GetLogFontTWMCommandTWMCompactingTWMCompareItemTWMCopyDataTWMCreateTWMCtlColorTWMCtlColorBtn       = TWMCtlColor;TWMCtlColorDlg       = TWMCtlColor;TWMCtlColorEdit      = TWMCtlColor;TWMCtlColorListbox   = TWMCtlColor;TWMCtlColorMsgbox    = TWMCtlColor;TWMCtlColorScrollbar = TWMCtlColor;TWMCtlColorStatic    = TWMCtlColor;TWMDDE_AckTWMDDE_AdviseTWMDDE_DataTWMDDE_ExecuteTWMDDE_InitiateTWMDDE_PokeTWMDDE_RequestTWMDDE_TerminateTWMDDE_UnadviseTWMDeleteItemTWMDevModeChangeTWMDrawItemTWMDropFilesTWMEnableTWMEndSessionTWMEnterIdleTWMEnterMenuLoopTWMExitMenuLoop = TWMEnterMenuLoop;TWMEraseBkgndTWMGetIconTWMGetMinMaxInfoTWMGetTextTWMHotKeyTWMHScrollClipboardTWMIconEraseBkgnd = TWMEraseBkgnd;TWMInitDialogTWMInitMenuTWMInitMenuPopupTWMKillFocusTWMMDIActivateTWMMDICascadeTWMMDICreateTWMMDIDestroyTWMMDIMaximizeTWMMDINextTWMMDIRestoreTWMMDISetMenuTWMMDITileTWMMeasureItemTWMMenuCharTWMMenuSelectTWMMouseActivateTWMMoveTWMMovingTWMNCActivateTWMNCCalcSizeTWMNCCreateTWMNCHitTestTWMNCHitMessageTWMNCLButtonDblClk = TWMNCHitMessage;TWMNCLButtonDown   = TWMNCHitMessage;TWMNCLButtonUp     = TWMNCHitMessage;TWMNCMButtonDblClk = TWMNCHitMessage;TWMNCMButtonDown   = TWMNCHitMessage;TWMNCMButtonUp     = TWMNCHitMessage;TWMNCMouseMove     = TWMNCHitMessage;TWMNCRButtonDblClk = TWMNCHitMessage;TWMNCRButtonDown   = TWMNCHitMessage;TWMNCRButtonUp     = TWMNCHitMessage;TWMNCPaintTWMNextDlgCtlTWMNotifyTWMNotifyFormatTWMPaintTWMPaintClipboardTWMPaletteChangedTWMPaletteIsChangingTWMParentNotifyTWMPowerTWMQueryEndSessionTWMQuitTWMRenderFormatTWMSetCursorTWMSetFocusTWMSetFontTWMSetHotKeyTWMSetIconTWMSetRedrawTWMSetTextTWMShowWindowTWMSizeTWMSizeClipboardTWMSpoolerStatusTWMStyleChangeTWMStyleChanged  = TWMStyleChange;TWMStyleChanging = TWMStyleChange;TWMSysCommandTWMSysDeadCharTWMSystemErrorTWMTimerTWMUIStateTWMChangeUIState = TWMUIState;TWMUpdateUIState = TWMUIState;TWMVScrollClipboardTWMWinIniChangeTWMSettingChangeTWMHelpTWMDisplayChangeTWMContextMenuTWMPrintTWMPrintClient = TWMPrint;

這樣做的目的, 無非就是為了理解與簡捷. 但為什麼會有那麼多重新命名(說明它們的參數結構相同)呢?
我想 Delphi 這樣做可能是為了和訊息一一對應吧, 譬如: WM_LButtonDown 訊息對應 TWMLButtonDown 結構.
這樣根據命名規則, 可以方便地通過訊息名稱方便地找到對應的訊息結構.

TMessage 在 VCL 中是通用的, 它可以代替其中任何一個.

另外, 這會是 Windows 訊息的全部嗎?
我想肯定不是, 就像 API 函數一樣, 它們在不斷地增加, 況且還有那麼多的自訂訊息, 這應該只是一些常用的, 也夠多了.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.