SendMessage:該函數將指定的消息發送到一個或多個窗口。此函數為指定的窗口調用窗口程序,直到窗口程序處理完消息再返回。該函數是應用程序和應用程序之間進行消息傳遞的主要手段之一
函數原型:IntPtr SendMessage(int hWnd, int msg, IntPtr wParam, IntPtr lParam);
參數
hWnd:其窗口程序將接收消息的窗口的句柄。如果此參數為HWND_BROADCAST,則消息將被發送到系統中所有頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口,但消息不被發送到子窗口
Msg:指定被發送的消息
wParam:指定附加的消息指定信息
IParam:指定附加的消息指定信息返回值:返回值指定消息處理的結果,依賴于所發送的消息
備注:需要用HWND_BROADCAST通信的應用程序應當使用函數RegisterWindowMessage來為應用程序間的通信取得一個唯一的消息。
示例:
const int BM_CLICK = 0xF5;
IntPtr maindHwnd = FindWindow(null, "QQ用戶登錄"); //獲得QQ登陸框的句柄 hovertree.com
if (maindHwnd != IntPtr.Zero)
{
IntPtr childHwnd = FindWindowEx(maindHwnd, IntPtr.Zero, null, "登錄"); //獲得按鈕的句柄
if (childHwnd != IntPtr.Zero)
{
SendMessage(childHwnd, BM_CLICK, 0, 0); //發送點擊按鈕的消息
}
else
{
MessageBox.Show("沒有找到子窗口");
}
}
else
{
MessageBox.Show("沒有找到窗口");
}
wMsg常量值:
//創建一個窗口
const int WM_CREATE = 0x01;
//當一個窗口被破壞時發送
const int WM_DESTROY = 0x02;
//移動一個窗口
const int WM_MOVE = 0x03;
//改變一個窗口的大小
const int WM_SIZE = 0x05;
//一個窗口被激活或失去激活狀態
const int WM_ACTIVATE = 0x06;
//一個窗口獲得焦點
const int WM_SETFOCUS = 0x07;
//一個窗口失去焦點
const int WM_KILLFOCUS = 0x08;
//一個窗口改變成Enable狀態
const int WM_ENABLE = 0x0A;
//設置窗口是否能重畫
const int WM_SETREDRAW = 0x0B;
//應用程序發送此消息來設置一個窗口的文本
const int WM_SETTEXT = 0x0C;
//應用程序發送此消息來復制對應窗口的文本到緩沖區
const int WM_GETTEXT = 0x0D;
//得到與一個窗口有關的文本的長度(不包含空字符)
const int WM_GETTEXTLENGTH = 0x0E;
//要求一個窗口重畫自己
const int WM_PAINT = 0x0F;
//當一個窗口或應用程序要關閉時發送一個信號
const int WM_CLOSE = 0x10;
//當用戶選擇結束對話框或程序自己調用ExitWindows函數
const int WM_QUERYENDSESSION = 0x11;
//用來結束程序運行
const int WM_QUIT = 0x12;
//當用戶窗口恢復以前的大小位置時,把此消息發送給某個圖標
const int WM_QUERYOPEN = 0x13;
//當窗口背景必須被擦除時(例在窗口改變大小時)
const int WM_ERASEBKGND = 0x14;
//當系統顏色改變時,發送此消息給所有頂級窗口
const int WM_SYSCOLORCHANGE = 0x15;
//當系統進程發出WM_QUERYENDSESSION消息后,此消息發送給應用程序,通知它對話是否結束
const int WM_ENDSESSION = 0x16;
//當隱藏或顯示窗口是發送此消息給這個窗口
const int WM_SHOWWINDOW = 0x18;
//發此消息給應用程序哪個窗口是激活的,哪個是非激活的
const int WM_ACTIVATEAPP = 0x1C;
//當系統的字體資源庫變化時發送此消息給所有頂級窗口
const int WM_FONTCHANGE = 0x1D;
//當系統的時間變化時發送此消息給所有頂級窗口
const int WM_TIMECHANGE = 0x1E;
//發送此消息來取消某種正在進行的摸態(操作)
const int WM_CANCELMODE = 0x1F;
//如果鼠標引起光標在某個窗口中移動且鼠標輸入沒有被捕獲時,就發消息給某個窗口
const int WM_SETCURSOR = 0x20;
//當光標在某個非激活的窗口中而用戶正按著鼠標的某個鍵發送此消息給//當前窗口
const int WM_MOUSEACTIVATE = 0x21;
//發送此消息給MDI子窗口//當用戶點擊此窗口的標題欄,或//當窗口被激活,移動,改變大小
const int WM_CHILDACTIVATE = 0x22;
//此消息由基于計算機的訓練程序發送,通過WH_JOURNALPALYBACK的hook程序分離出用戶輸入消息
const int WM_QUEUESYNC = 0x23;
//此消息發送給窗口當它將要改變大小或位置
const int WM_GETMINMAXINFO = 0x24;
//發送給最小化窗口當它圖標將要被重畫
const int WM_PAINTICON = 0x26;
//此消息發送給某個最小化窗口,僅//當它在畫圖標前它的背景必須被重畫
const int WM_ICONERASEBKGND = 0x27;
//發送此消息給一個對話框程序去更改焦點位置
const int WM_NEXTDLGCTL = 0x28;
//每當打印管理列隊增加或減少一條作業時發出此消息
const int WM_SPOOLERSTATUS = 0x2A;
//當button,combobox,listbox,menu的可視外觀改變時發送
const int WM_DRAWITEM = 0x2B;
//當button, combo box, list box, list view control, or menu item 被創建時
const int WM_MEASUREITEM = 0x2C;
//此消息有一個LBS_WANTKEYBOARDINPUT風格的發出給它的所有者來響應WM_KEYDOWN消息
const int WM_VKEYTOITEM = 0x2E;
//此消息由一個LBS_WANTKEYBOARDINPUT風格的列表框發送給他的所有者來響應WM_CHAR消息
const int WM_CHARTOITEM = 0x2F;
//當繪制文本時程序發送此消息得到控件要用的顏色
const int WM_SETFONT = 0x30;
//應用程序發送此消息得到當前控件繪制文本的字體
const int WM_GETFONT = 0x31;
//應用程序發送此消息讓一個窗口與一個熱鍵相關連
const int WM_SETHOTKEY = 0x32;
//應用程序發送此消息來判斷熱鍵與某個窗口是否有關聯
const int WM_GETHOTKEY = 0x33;
//此消息發送給最小化窗口,當此窗口將要被拖放而它的類中沒有定義圖標,應用程序能返回一個圖標或光標的句柄,當用戶拖放圖標時系統顯示這個圖標或光標
const int WM_QUERYDRAGICON = 0x37;
//發送此消息來判定combobox或listbox新增加的項的相對位置
const int WM_COMPAREITEM = 0x39;
//顯示內存已經很少了
const int WM_COMPACTING = 0x41;
//發送此消息給那個窗口的大小和位置將要被改變時,來調用setwindowpos函數或其它窗口管理函數
const int WM_WINDOWPOSCHANGING = 0x46;
//發送此消息給那個窗口的大小和位置已經被改變時,來調用setwindowpos函數或其它窗口管理函數
const int WM_WINDOWPOSCHANGED = 0x47;