函數功能:該函數將指定的消息發送到一個或多個視窗。此函數為指定的視窗調用視窗程式,直到視窗程式處理完消息再返回。該函數是應用程式和應用程式之間進行消息傳遞的主要手段之一。 函數原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM
函數功能:該函數將指定的消息發送到一個或多個視窗。此函數為指定的視窗調用視窗程式,直到視窗程式處理完消息再返回。該函數是應用程式和應用程式之間進行消息傳遞的主要手段之一。
函數原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
參數:
hWnd:其視窗程式將接收消息的視窗的句柄。如果此參數為HWND_BROADCAST,則消息將被髮送到系統中所有頂層視窗,包括無效或不可見的非自身擁有的視窗、被覆蓋的視窗和彈出式視窗,但消息不被髮送到子視窗。
Msg:指定被髮送的消息。
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。
返回值:返回值指定消息處理的結果,依賴於所發送的消息。
備註:需要用HWND_BROADCAST通信的應用程式應當使用函數RegisterWindowMessage來為應用程式間的通信取得一個唯一的消息。
如果指定的視窗是由調用線程創建的,則視窗程式立即作為子程式調用。如果指定的視窗是由不同線程創建的,則系統切換到該線程並調用恰當的視窗程式。線程間的消息只有線上程執行消息檢索代碼時才被處理。發送線程被阻塞直到接收線程處理完消息為止。
C#中使用該函數首先導入命名空間:
using System.Runtime.InteropServices;
然後寫API引用部分的代碼,放入 class 內部
[DllImport("user32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
這個函數有四個參數,第一個是視窗句柄,視窗可以是任何類型的屏幕對象;第二個是用於區別其他消息的常量值;第三個通常是一個與消息有關的常量值,也可能是視窗或控制項的句柄,第三個參數是可選參數,有的消息要,有的不需要,比如單擊就不需要這個參數,
別的消息,比如滑鼠移動的可能需要在這裡加上一些滑鼠的參數;第四個通常是一個指向記憶體中數據的指針。在C#中消息需要定義成windows系統中的原始的16進位數字,比如 const int WM_Lbutton = 0x201; //定義了滑鼠的左鍵點擊消息。詳細值在最後。
例如:
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;
//當系統將要進入暫停狀態時發送此消息
const int WM_POWER = 0x48;
//當一個應用程式傳遞數據給另一個應用程式時發送此消息
const int WM_COPYDATA = 0x4A;
//當某個用戶取消程式日誌激活狀態,提交此消息給程式
const int WM_CANCELJOURNA = 0x4B;
//當某個控制項的某個事件已經發生或這個控制項需要得到一些信息時,發送此消息給它的父視窗
const int WM_NOTIFY = 0x4E;
//當用戶選擇某種輸入語言,或輸入語言的熱鍵改變
const int WM_INPUTLANGCHANGEREQUEST = 0x50;
//當平臺現場已經被改變後發送此消息給受影響的最頂級視窗
const int WM_INPUTLANGCHANGE = 0x51;
//當程式已經初始化windows幫助常式時發送此消息給應用程式
const int WM_TCARD = 0x52;
//此消息顯示用戶按下了F1,如果某個菜單是激活的,就發送此消息個此視窗關聯的菜單,否則就發送給有焦點的視窗,如果//當前都沒有焦點,就把此消息發送給//當前激活的視窗
const int WM_HELP = 0x53;
//當用戶已經登入或退出後發送此消息給所有的視窗,//當用戶登入或退出時系統更新用戶的具體設置信息,在用戶更新設置時系統馬上發送此消息
const int WM_USERCHANGED = 0x54;
//公用控制項,自定義控制項和他們的父視窗通過此消息來判斷控制項是使用ANSI還是UNICODE結構
const int WM_NOTIFYFORMAT = 0x55;
//當用戶某個視窗中點擊了一下右鍵就發送此消息給這個視窗
//const int WM_CONTEXTMENU = ??;
//當調用SETWINDOWLONG函數將要改變一個或多個 視窗的風格時發送此消息給那個視窗
const int WM_STYLECHANGING = 0x7C;
//當調用SETWINDOWLONG函數一個或多個 視窗的風格後發送此消息給那個視窗
const int WM_STYLECHANGED = 0x7D;
//當顯示器的解析度改變後發送此消息給所有的視窗
const int WM_DISPLAYCHANGE = 0x7E;
//此消息發送給某個視窗來返回與某個視窗有關連的大圖標或小圖標的句柄
const int WM_GETICON = 0x7F;
//程式發送此消息讓一個新的大圖標或小圖標與某個視窗關聯
const int WM_SETICON = 0x80;
//當某個視窗第一次被創建時,此消息在WM_CREATE消息發送前發送
const int WM_NCCREATE = 0x81;
//此消息通知某個視窗,非客戶區正在銷毀
const int WM_NCDESTROY = 0x82;
//當某個視窗的客戶區域必須被核算時發送此消息
const int WM_NCCALCSIZE = 0x83;
//移動滑鼠,按住或釋放滑鼠時發生
const int WM_NCHITTEST = 0x84;
//程式發送此消息給某個視窗當它(視窗)的框架必須被繪製時
const int WM_NCPAINT = 0x85;
//此消息發送給某個視窗僅當它的非客戶區需要被改變來顯示是激活還是非激活狀態
const int WM_NCACTIVATE = 0x86;
//發送此消息給某個與對話框程式關聯的控制項,widdows控制方位鍵和TAB鍵使輸入進入此控制項通過應
const int WM_GETDLGCODE = 0x87;
//當游標在一個視窗的非客戶區內移動時發送此消息給這個視窗 非客戶區為:窗體的標題欄及窗 的邊框體
const int WM_NCMOUSEMOVE = 0xA0;
//當游標在一個視窗的非客戶區同時按下滑鼠左鍵時提交此消息
const int WM_NCLBUTTONDOWN = 0xA1;
//當用戶釋放滑鼠左鍵同時游標某個視窗在非客戶區十發送此消息
const int WM_NCLBUTTONUP = 0xA2;
//當用戶雙擊滑鼠左鍵同時游標某個視窗在非客戶區十發送此消息
const int WM_NCLBUTTONDBLCLK = 0xA3;
//當用戶按下滑鼠右鍵同時游標又在視窗的非客戶區時發送此消息
const int WM_NCRBUTTONDOWN = 0xA4;
//當用戶釋放滑鼠右鍵同時游標又在視窗的非客戶區時發送此消息
const int WM_NCRBUTTONUP = 0xA5;
//當用戶雙擊滑鼠右鍵同時游標某個視窗在非客戶區十發送此消息
const int WM_NCRBUTTONDBLCLK = 0xA6;
//當用戶按下滑鼠中鍵同時游標又在視窗的非客戶區時發送此消息
const int WM_NCMBUTTONDOWN = 0xA7;
//當用戶釋放滑鼠中鍵同時游標又在視窗的非客戶區時發送此消息
const int WM_NCMBUTTONUP = 0xA8;
//當用戶雙擊滑鼠中鍵同時游標又在視窗的非客戶區時發送此消息
const int WM_NCMBUTTONDBLCLK = 0xA9;
//WM_KEYDOWN 按下一個鍵
const int WM_KEYDOWN = 0x0100;
//釋放一個鍵
const int WM_KEYUP = 0x0101;
//按下某鍵,並已發出WM_KEYDOWN, WM_KEYUP消息
const int WM_CHAR = 0x102;
//當用translatemessage函數翻譯WM_KEYUP消息時發送此消息給擁有焦點的視窗
const int WM_DEADCHAR = 0x103;
//當用戶按住ALT鍵同時按下其它鍵時提交此消息給擁有焦點的視窗
const int WM_SYSKEYDOWN = 0x104;
//當用戶釋放一個鍵同時ALT 鍵還按著時提交此消息給擁有焦點的視窗
const int WM_SYSKEYUP = 0x105;
//當WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函數翻譯後提交此消息給擁有焦點的視窗
const int WM_SYSCHAR = 0x106;
//當WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函數翻譯後發送此消息給擁有焦點的視窗
const int WM_SYSDEADCHAR = 0x107;
//在一個對話框程式被顯示前發送此消息給它,通常用此消息初始化控制項和執行其它任務
const int WM_INITDIALOG = 0x110;
//當用戶選擇一條菜單命令項或當某個控制項發送一條消息給它的父視窗,一個快捷鍵被翻譯
const int WM_COMMAND = 0x111;
//當用戶選擇視窗菜單的一條命令或//當用戶選擇最大化或最小化時那個視窗會收到此消息
const int WM_SYSCOMMAND = 0x112;
//發生了定時器事件
const int WM_TIMER = 0x113;
//當一個視窗標準水平滾動條產生一個滾動事件時發送此消息給那個視窗,也發送給擁有它的控制項
const int WM_HSCROLL = 0x114;
//當一個視窗標準垂直滾動條產生一個滾動事件時發送此消息給那個視窗也,發送給擁有它的控制項
const int WM_VSCROLL = 0x115;
//當一個菜單將要被激活時發送此消息,它發生在用戶菜單條中的某項或按下某個菜單鍵,它允許程式在顯示前更改菜單
const int WM_INITMENU = 0x116;
//當一個下拉菜單或子菜單將要被激活時發送此消息,它允許程式在它顯示前更改菜單,而不要改變全部
const int WM_INITMENUPOPUP = 0x117;
//當用戶選擇一條菜單項時發送此消息給菜單的所有者(一般是視窗)
const int WM_MENUSELECT = 0x11F;
//當菜單已被激活用戶按下了某個鍵(不同於加速鍵),發送此消息給菜單的所有者
const int WM_MENUCHAR = 0x120;
//當一個模態對話框或菜單進入空載狀態時發送此消息給它的所有者,一個模態對話框或菜單進入空載狀態就是在處理完一條或幾條先前的消息後沒有消息它的列隊中等待
const int WM_ENTERIDLE = 0x121;
//在windows繪製消息框前發送此消息給消息框的所有者視窗,通過響應這條消息,所有者視窗可以通過使用給定的相關顯示設備的句柄來設置消息框的文本和背景顏色
const int WM_CTLCOLORMSGBOX = 0x132;
//當一個編輯型控制項將要被繪製時發送此消息給它的父視窗通過響應這條消息,所有者視窗可以通過使用給定的相關顯示設備的句柄來設置編輯框的文本和背景顏色
const int WM_CTLCOLOREDIT = 0x133;
//當一個列表框控制項將要被繪製前發送此消息給它的父視窗通過響應這條消息,所有者視窗可以通過使用給定的相關顯示設備的句柄來設置列表框的文本和背景顏色
const int WM_CTLCOLORLISTBOX = 0x134;
//當一個按鈕控制項將要被繪製時發送此消息給它的父視窗通過響應這條消息,所有者視窗可以通過使用給定的相關顯示設備的句柄來設置按紐的文本和背景顏色
const int WM_CTLCOLORBTN = 0x135;
//當一個對話框控制項將要被繪製前發送此消息給它的父視窗通過響應這條消息,所有者視窗可以通過使用給定的相關顯示設備的句柄來設置對話框的文本背景顏色
const int WM_CTLCOLORDLG = 0x136;
//當一個滾動條控制項將要被繪製時發送此消息給它的父視窗通過響應這條消息,所有者視窗可以通過使用給定的相關顯示設備的句柄來設置滾動條的背景顏色
const int WM_CTLCOLORSCROLLBAR = 0x137;
//當一個靜態控制項將要被繪製時發送此消息給它的父視窗通過響應這條消息,所有者視窗可以 通過使用給定的相關顯示設備的句柄來設置靜態控制項的文本和背景顏色
const int WM_CTLCOLORSTATIC = 0x138;
//當滑鼠輪子轉動時發送此消息個當前有焦點的控制項
const int WM_MOUSEWHEEL = 0x20A;
//雙擊滑鼠中鍵
const int WM_MBUTTONDBLCLK = 0x209;
//釋放滑鼠中鍵
const int WM_MBUTTONUP = 0x208;
//移動滑鼠時發生,同WM_MOUSEFIRST
const int WM_MOUSEMOVE = 0x200;
//按下滑鼠左鍵
const int WM_LBUTTONDOWN = 0x201;
//釋放滑鼠左鍵
const int WM_LBUTTONUP = 0x202;
//雙擊滑鼠左鍵
const int WM_LBUTTONDBLCLK = 0x203;
//按下滑鼠右鍵
const int WM_RBUTTONDOWN = 0x204;
//釋放滑鼠右鍵
const int WM_RBUTTONUP = 0x205;
//雙擊滑鼠右鍵
const int WM_RBUTTONDBLCLK = 0x206;
//按下滑鼠中鍵
const int WM_MBUTTONDOWN = 0x207;
const int WM_USER = 0x0400;
const int MK_LBUTTON = 0x0001;
const int MK_RBUTTON = 0x0002;
const int MK_SHIFT = 0x0004;
const int MK_CONTROL = 0x0008;
const int MK_MBUTTON = 0x0010;
const int MK_XBUTTON1 = 0x0020;
const int MK_XBUTTON2 = 0x0040;
http://www.cnblogs.com/sosoft/