PostMessage :
函數功能:該函數將一個消息放入(寄送)到與指定窗口創建的線程相聯系消息隊列裡,不等待線程處理消息就返回,是異步消息模式。消息隊列裡的消息通過調用GetMessage和PeekMessage取得。
函數原型:B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
參數
hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含義的兩個值:
HWND_BROADCAST:消息被寄送到系統的所有頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口。消息不被寄送到子窗口。
NULL:此函數的操作和調用參數dwThread設置為當前線程的標識符PostThreadMessage函數一樣。
Msg:指定被寄送的消息。
wParam:指定附加的消息特定的信息。
IParam:指定附加的消息特定的信息。
返回值:如果函數調用成功,返回非零值:如果函數調用失敗,返回值是零。若想獲得更多的錯誤信息,請調用GetLastError函數。
備注:需要以HWND_BROADCAST方式通信的應用程序應當用函數RegisterwindwosMessage來獲得應用程序間通信的獨特的消息。
如果發送一個低於WM_USER范圍的消息給異步消息函數(PostMessage.SendNotifyMessage,SendMesssgeCallback),消息參數不能包含指針。否則,操作將會失敗。函數將再接收線程處理消息之前返回,發送者將在內存被使用之前釋放。
速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;頭文件:winuser.h;輸入庫:user32.lib;Unicode:在Windows NT環境下以Unicode和ANSI方式實現。
P.S. 為什麼 “如果發送一個低於WM_USER范圍的消息給異步消息函數(PostMessage.SendNotifyMessage,SendMesssgeCallback),消息參數不能包含指針。否則,操作將會失敗。
HTML5標准下的postMessage
在HTML5中新增了postMessage方法,postMessage可以實現跨文檔消息傳輸(Cross Document Messaging),Internet Explorer 8, Firefox 3, Opera 9, Chrome 3和Safari 4都支持postMessage。
可以通過綁定window的message事件來監聽發送跨文檔消息傳輸內容
SendMessage :
函數功能 該函數將指定的消息發送到一個或多個窗口。此函數為指定的窗口調用窗口程序,直到窗口程序處理完消息再返回。而函數PostMessage不同,將一個消息寄送到一個線程的消息隊列後立即返回。
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
參數:
hWnd:其窗口程序將接收消息的窗口的句柄。如果此參數為HWND_BROADCAST,則消息將被發送到系統中所有頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口,但消息不被發送到子窗口。
Msg:指定被發送的消息。
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。
返回值:返回值指定消息處理的結果,依賴於所發送的消息。
備注:需要用HWND_BROADCAST通信的應用程序應當使用函數RegisterWindowMessage來為應用程序間的通信取得一個唯一的消息。
如果指定的窗口是由正在調用的線程創建的,則窗口程序立即作為子程序調用。如果指定的窗口是由不同線程創建的,則系統切換到該線程並調用恰當的窗口程序。線程間的消息只有在線程執行消息檢索代碼時才被處理。發送線程被阻塞直到接收線程處理完消息為止。
Windows CE:Windows CE不支持Windows桌面平台支持的所有消息。使用SendMesssge之前,要檢查發送的消息是否被支持。
速查:Windows NT:3.1及以上版本:Windows:95及以上版本;Windows CE:1.0及以上版本;頭文件:winuser.h;輸入庫:user32.lib;Unicode:在Windows NT環境下以Unicode和ANSI方式實現。
SendMessage函數使用實例
程序控制拉下或收起組合框的下拉列來
一般情況下,為了拉下或收起組合框的下拉列表,需要用鍵盤或鼠標進行操作,而有時我們希望程序運行的某個時刻自動拉出下拉列表(比如在一些演示程序中),為了實現這個目的,我們也只有借助於SendMessage函數,方法是發一個CB_SHOWDROPDOWN(&H14F)消息給組合框。
在發CB_SHOWDROPDOWN消息時,wParam參數決定了是拉下列表(=True時)還是收起列表(=False時),lParam無用(設為0)。
------------- C++ -----------------
#include "windows.h"
int main(int argc, char* argv[])
{
HWND hWnd = ::FindWindow(NULL,"QQ2010");
if( hWnd != NULL)
{
::SendMessage(hWnd,WM_CLOSE,0,0);
}
return 0;
}
SendMessage函數功能描述:將指定的消息發送到一個或多個窗口。此函數為指定的窗口調用窗口過程,直到窗口過程處理完消息後才返回。
.函數原型:
LRESULT SendMessage(
HWND hWnd, // 目標窗口句柄
UINT Msg, // 被發送的消息
WPARAM wParam, // 第一個消息參數
LPARAM lParam // 第二個消息參數
);
.參數:
hWnd
窗口過程接收消息的窗口句柄。如果此參數為HWND_BROADCAST,則消息被送到系統的所有頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口。消息不被送到子窗口。
Msg
指定被發送的消息;
wParam
指定附加消息的特定信息;
lParam
指定附加消息的特定信息。
.返回值:
返回值返回消息處理的結果,其依賴於所發送的消息。
.備注:
需要以HWND_BROADCAST 方式通信的應用程序應該使用RegisterWindowMessage 函數來獲得應用程序間通信的獨特消息。
如果指定的窗口通過調用線程被創建,則窗口過程作為子程序被立即調用。如果指定的窗口通過調用不同線程被創建,則系統切換到該線程並調用適當的窗口過程。線程間的消息只有在接收線程執行消息檢索代碼時才被處理。發送線程將被阻塞到接收線程處理完消息為止。
Windows CE:Windows CE不支持Windows桌面平台所支持的所有消息。在使用SendMessage函數之前,應檢查發送的消息是否被Windows CE所支持。
.使用環境:
Windows NT:3.1及以上版本;
Windows:95及以上版本;
Windows CE:1.0及以上版本;
頭文件:winuser.h;
輸入庫:user32.lib;
Unicode:在WindowsNT(Windows2000)環境下以Unicode和ANSI方式實現。
.示例代碼:
case WM_KEYDOWN:
switch (wParam)
{
case VK_HOME:
SendMessage (hwnd, WM_VSCROLL, SB_TOP, 0) ;
break ;
case VK_END:
SendMessage (hwnd, WM_VSCROLL, SB_BOTTOM, 0) ;
break ;
case VK_PRIOR:
SendMessage (hwnd, WM_VSCROLL, SB_PAGEUP, 0) ;
break ;
...
}
return 0 ;
...
.常見問題
1)使用SendMessage來實現剪切、復制和粘貼
SendMessage(hwnd, WM_COPY, 0, 0);
SendMessage(hwnd, WM_CUT, 0, 0);
SendMessage(hwnd, WM_PASTE, 0, 0);
2)SendMessage與PostMessage的區別
PostMessage將消息放入消息隊列後馬上返回,而SendMessage直到窗口過程處理完消息後才返回
3)SendMessage發送WM_COPYDATA消息在進程間傳送數據
WM_COPYDATA消息主要目的是允許在進程間傳遞少量只讀數據。SDK文檔推薦用戶使用SendMessage()函數,接收方在數據復制完成前不返回,這樣發送方就不可能刪除和修改數據。
例如:
std:string strData = "VC知識庫VCKBASE.COM";
COPYDATASTRUCT cds;
cds.dwData = 0;
cds.cbData = strData.Length();
cds.lpData = strData.c_str();
::SendMessage(hwnd, WM_COPYDATA, NULL, (LPARAM)&cds);