程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言中PostMessage And SendMessage

C語言中PostMessage And SendMessage

編輯:關於C語言

 

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);

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved