天天看點

SendMessage

将指定的消息發送到視窗或視窗。該SendMessage函數的函數調用指定的視窗的視窗過程,并不會傳回,直到視窗過程已經處理了該消息。

要發送消息并立即傳回,請使用SendMessageCallback或SendNotifyMessage函數。要将消息釋出到線程的消息隊列并立即傳回,請使用PostMessage或PostThreadMessage函數。

LRESULT WINAPI SendMessage(
  _In_ HWND hWnd,
  _In_ UINT Msg,
  _In_ WPARAM wParam,
  _In_ LPARAM lParam
);
           

參數

hWnd [in]

類型:HWND

視窗程式将接收消息的視窗的句柄。如果此參數為HWND_BROADCAST((HWND)0xffff),則會将消息發送到系統中的所有頂級視窗,包括禁用或不可見的未知視窗,重疊視窗和彈出視窗; 但消息不發送到子視窗。

郵件發送受UIPI限制。程序的線程可以将消息發送到較小或相同完整性級别的程序中的線程的消息隊列。

msg [中]

類型:UINT

要發送的消息。

wParam [in]

類型:WPARAM

附加消息特定資訊。

lParam [in]

類型:LPARAM

附加消息特定資訊。

傳回值

類型:LRESULT

傳回值指定消息處理的結果; 這取決于發送的消息。

備注

當UIPI阻止消息時,使用GetLastError檢索的最後一個錯誤設定為5(通路被拒絕)。

需要使用HWND_BROADCAST進行通信的應用程式應使用RegisterWindowMessage函數來擷取應用程式間通信的唯一消息。

系統隻對系統消息進行編組(範圍為0到(WM_USER -1))。要發送其他消息(那些> = WM_USER)到另一個程序,你必須做自定義編組。

如果指定的視窗是由調用線程建立的,則視窗過程将立即作為子例程調用。如果指定的視窗是由不同的線程建立的,則系統切換到該線程并調用相應的視窗過程。線程之間發送的消息隻有在接收線程執行消息檢索代碼時才被處理。發送線程被阻塞,直到接收線程處理消息。然而,發送線程将在等待其消息被處理的同時處理傳入的非排隊消息。為了防止這種情況,請使用設定了SMTO_BLOCK的SendMessageTimeout。

可通路性應用程式可以使用SendMessage将WM_APPCOMMAND消息發送到shell以啟動應用程式。此功能不能保證适用于其他類型的應用程式。