Delphi WinAPI 消息函數 PostMessage


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  更新時間:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM