Delphi WinAPI 消息函數 PostMessage
描述:在與創建指定窗口的線程關聯的消息隊列中放置(發布)消息,並在不等待線程處理消息的情況下返回。要在與線程關聯的消息隊列中發布消息,請使用PostThreadMessage函數。
原型:
BOOL PostMessageA(
HWND hWnd, //窗口的句柄,其窗口過程是接收消息
UINT Msg, //要發布的消息。
WPARAM wParam, //附加消息特定信息。integer值
LPARAM lParam //附加消息特定信息。integer值
);
參數:
HWND 取值:
- HWND_BROADCAST //該消息將發布到系統中的所有頂層窗口,包括禁用或不可見的無主窗口、重疊窗口和彈出窗口。消息不會發布到子窗口
- NULL //該函數的行為類似於對PostThreadMessage的調用,dwThreadId參數設置為當前線程的標識符。
返回值:
- 如果函數成功,則返回值為非零。
- 如果函數失敗,返回值為零。若要獲取擴展的錯誤信息,請調用GetLastError。當達到限制時,GetLastError 返回錯誤 “ERROR_NOT_ENOUGH_QUOTA ”。
注意:
- 當UIPI阻止消息時,使用GetLastError檢索的最后一個錯誤設置為5(拒絕訪問)。
- 通過調用GetMessage或PeekMessage函數來檢索消息隊列中的消息。
- 需要使用HWND_BROADCAST進行通信的應用程序應使用RegisterWindowMessage函數獲取用於應用程序間通信的唯一消息。
- 系統只對系統消息(范圍在0到(WM_USER-1))進行編組。要將其他消息(那些>=WM_USER的消息)發送到另一個進程,必須執行自定義封送。
- 如果向異步消息函數(PostMessage、SendNotifyMessage和SendMessageCallback)發送低於WM_USER范圍的消息,則其消息參數不能包含指針。否則,操作將失敗。函數將在接收線程有機會處理消息之前返回,發送方將在使用之前釋放內存。
- 不要使用PostMessage發布WM_QUIT消息;請使用PostQuitMessage函數。
- 輔助功能應用程序可以使用PostMessage將WM_APPCOMMAND消息發布到shell以啟動應用程序。此功能不能保證適用於其他類型的應用程序。
一個消息隊列最多可以包含10000條消息。這個限制應該足夠大。如果應用程序超出了限制,則應重新設計,以避免消耗大量系統資源。要調整此限制,請修改以下注冊表項。
HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
Windows NT
CurrentVersion
Windows
USERPostMessageLimit
最小可接受值為4000。
Delphi 使用示例:
發送
var nMsg: UINT; procedure Form1.FormCreate(Sender: TObject); begin nMsg := RegisterWindowMessage('傳送數據'); end; PostMessage(HWND_BROADCAST, nMsg, data, 0);
接收
public procedure HandleMessage(var msg: TagMsg;var handled: Boolean); var mMsg: UINT; procedure Form1.FormCreate(Sender: TObject); begin mMsg := RegisterWindowMessage('傳送數據'); Application.OnMessage := HandleMessage; end; procedure Form1.HandleMessage(var msg: TagMsg; var handled: Boolean); begin if msg.message = mMsg then begin Edit1.Text := '接受數據:' + msg.wParam; end; end;
創建時間:2020.10.20 更新時間: