複製鏈接
請複製以下鏈接發送給好友

SendMessage

鎖定
Windows API宏,在WinUser.h中根據是否已定義Unicode被定義為SendMessageW或SendMessageA,這兩個函數將指定的消息發送到一個或多個窗口。此函數為指定的窗口調用窗口程序,直到窗口程序處理完消息再返回。而和函數PostMessage不同,PostMessage是將一個消息寄送到一個線程的消息隊列後就立即返回。
外文名
SendMessage
聲明位置
WinUser.h
定    義
消息發送到一個或多個窗口
應    用
WinUser.h

SendMessage函數功能

該函數將指定的消息發送到一個或多個窗口。此函數為指定的窗口調用窗口程序,直到窗口程序處理完消息再返回。而和函數PostMessage不同,PostMessage是將一個消息寄送到一個線程的消息隊列後就立即返回。

SendMessage函數原型

LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam)

SendMessage參數

hWnd:指定要接收消息的窗口的句柄。如果此參數為HWND_BROADCAST,則消息將被髮送到系統中所有頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口,但消息不被髮送到子窗口。
Msg:指定被髮送的消息。
wParam:指定附加的消息特定信息。
IParam:指定附加的消息特定信息。

SendMessage返回值

返回值指定消息處理的結果,依賴於所發送的消息。
備註:需要用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)。

SendMessage舉例説明

------------- C# -------------
一、API
using System.Runtime.InteropServices;
函數原型
[DllImport("user32.dll ", EntryPoint = "SendMessage ")]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
二、CLT
命名空間
Microsoft.WindowsCE.Forms
函數語法
public static void SendMessage( ref Message m )
用法示例
Message msg = Message.Create(MsgWin.Hwnd,
MsgWindow.WM_CUSTOMMSG,
(IntPtr)e.X,
(IntPtr)e.Y);
MessageWindow.SendMessage(ref msg);
------------- VB -------------
Private Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal _
wParam As Long, lParam As Any) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String _
) As Long
Private Const WM_close = 16
Private Sub Command1_Click()
Dim winHwnd As Long
Dim lngRetVal As Long
winHwnd = FindWindow("IEFrame", vbNullString)
Debug.Print winHwnd
If winHwnd <> 0 Then
RetVal = SendMessage(winHwnd, WM_close, 0&, 0&)
Else
MsgBox "IE沒有運行。"
End If
End Sub
------------- C++ -----------------
#include "windows.h"
int main(int argc, char* argv[])
{
HWND hWnd = ::FindWindow("QQ2010", NULL);
if( hWnd != NULL)
{
::SendMessage(hWnd,WM_CLOSE,0,0);
}
return 0;
}

SendMessage程序片段

為説明具體的使用方法,下面提供簡單的程序片段。
首先在代碼模塊中做如下聲明:
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long,ByVal wMsg As Long,ByVal wParam As Long,lParam As Any) As Long
Const CB_SHOWDROPDOWN=&H14F
當程序中某處需要拉下組合框Combol的列表時,寫如下調用語句:
SendMessage Combol.hwnd,CB_SHOWDROPDOWN,True,0
當需要收起組合框Combol的列表時,寫如下語句:
SendMessage Combol.hwnd,CB_SHOWDROPDOWNN,False,0
The following are the ranges of message numbers.
Range Meaning
0 through WM_USER&Acirc;–1 Messages reserved for use by the system.
WM_USER through 0x7FFF Integer messages for use by private window classes.
WM_APP through 0xBFFF Messages available for use by applications.
0xC000 through 0xFFFF String messages for use by applications.
Greater than 0xFFFF Reserved by the system.
Message numbers in the first range (0 through WM_USER&Acirc;–1) are defined by the system. Values in this range that are not explicitly defined are reserved by the system.
Message numbers in the second range (WM_USER through 0x7FFF) can be defined and used by an application to send messages within a private window class. These values cannot be used to define messages that are meaningful throughout an application, because some predefined window classes already define values in this range. For example, predefined control classes such as BUTTON, EDIT, LISTBOX, and COMBOBOX may use these values. Messages in this range should not be sent to other applications unless the applications have been designed to exchange messages and to attach the same meaning to the message numbers.
Message numbers in the third range (0x8000 through 0xBFFF) are available for application to use as private messages. Message in this range do not conflict with system messages.
Message numbers in the fourth range (0xC000 through 0xFFFF) are defined at run time when an application calls the RegisterWindowMessage function to retrieve a message number for a string. All applications that register the same string can use the associated message number for exchanging messages. The actual message number, however, is not a constant and cannot be assumed to be the same between different sessions.
Message numbers in the fifth range (greater than 0xFFFF) are reserved by the system.
#define WM_NULL 0x0000
#defineWM_CREATE 0x0001 //創建一個窗口
#define WM_DESTROY 0x0002 //當一個窗口被破壞時發送
#define WM_MOVE 0x0003 //移動一個窗口
#define WM_SIZE 0x0005 //改變一個窗口的大小
#define WM_ACTIVATE 0x0006 //一個窗口被激活或失去激活狀態
/*
* WM_ACTIVATE state values
*/
#define WA_INACTIVE 0
#define WA_ACTIVE 1
#define WA_CLICKACTIVE 2
#define WM_SETFOCUS 0x0007 //一個窗口獲得焦點
#define WM_KILLFOCUS 0x0008 //一個窗口失去焦點
#define WM_ENABLE 0x000A //一個窗口改變成Enable狀態
#define WM_SETREDRAW 0x000B //設置窗口是否能重畫
#define WM_SETTEXT 0x000C //應用程序發送此消息來設置一個窗口的文本
#define WM_GETTEXT 0x000D //應用程序發送此消息來複制對應窗口的文本到緩衝區
#define WM_GETTEXTLENGTH 0x000E //得到與一個窗口有關的文本的長度(不包含空字符)
#define WM_PAINT 0x000F //要求一個窗口重畫自己
#define WM_CLOSE 0x0010 //當一個窗口或應用程序要關閉時發送一個信號
#ifndef _WIN32_WCE
#define WM_QUERYENDSESSION 0x0011 //當用户選擇結束對話框或程序自己調用ExitWindows函數
#define WM_QUERYOPEN 0x0013 //當用户窗口恢復以前的大小位置時,把此消息發送給某個圖標
#define WM_ENDSESSION 0x0016 //當系統進程發出WM_QUERYENDSESSION消息後,此消息發送給應用程序,通知它對話是否結束
#define WM_QUIT 0x0012 //用來結束程序運行
#define WM_ERASEBKGND 0x0014 //當窗口背景必須被擦除時(例在窗口改變大小時)
#define WM_SYSCOLORCHANGE 0x0015 //當系統顏色改變時,發送此消息給所有頂級窗口
#define WM_SHOWWINDOW 0x0018 //當隱藏或顯示窗口是發送此消息給這個窗口
#define WM_WININICHANGE 0x001A
#if(WINVER >= 0x0400)
#define WM_SETTINGCHANGE WM_WININICHANGE
#endif /* WINVER >= 0x0400 */
#define WM_DEVMODECHANGE 0x001B
#define WM_ACTIVATEAPP 0x001C //發此消息給應用程序哪個窗口是激活的,哪個是非激活的
#define WM_FONTCHANGE 0x001D //當系統的字體資源庫變化時發送此消息給所有頂級窗口
#define WM_TIMECHANGE 0x001E //當系統的時間變化時發送此消息給所有頂級窗口
#define WM_CANCELMODE 0x001F //發送此消息來取消某種正在進行的摸態(操作)
#define WM_SETCURSOR 0x0020 //如果鼠標引起光標在某個窗口中移動且鼠標輸入沒有被捕獲時,就發消息給某個窗口
#define WM_MOUSEACTIVATE 0x0021 //當光標在某個非激活的窗口中而用户正按着鼠標的某個鍵發送此消息給當前窗口
#define WM_CHILDACTIVATE 0x0022 //發送此消息給MDI子窗口當用户點擊此窗口的標題欄,或當窗口被激活,移動,改變大小
#define WM_QUEUESYNC 0x0023 //此消息由基於計算機的訓練程序發送,通過WH_JOURNALPALYBACK的hook程序分離出用户輸入消息
#define WM_GETMINMAXINFO 0x0024 //此消息發送給窗口當它將要改變大小或位置
/*
* Struct pointed to by WM_GETMINMAXINFO lParam
*/
typedef struct tagMINMAXINFO {
POINT ptReserved;
POINT ptMaxSize;
POINT ptMaxPosition;
POINT ptMinTrackSize;
POINT ptMaxTrackSize;
} MINMAXINFO, *PMINMAXINFO, *LPMINMAXINFO;
#define WM_PAINTICON 0x0026 //發送給最小化窗口當它圖標將要被重畫
#define WM_ICONERASEBKGND 0x0027 //此消息發送給某個最小化窗口,僅當它在畫圖標前它的背景必須被重畫
#define WM_NEXTDLGCTL 0x0028 //發送此消息給一個對話框程序去更改焦點位置
#define WM_SPOOLERSTATUS 0x002A //每當打印管理列隊增加或減少一條作業時發出此消息
#define WM_DRAWITEM 0x002B //當button,combobox,listbox,menu的可視外觀改變時發送
#define WM_MEASUREITEM 0x002C //當button, combo box, list box, list view control, or menu item 被創建時
#define WM_DELETEITEM 0x002D
#define WM_VKEYTOITEM 0x002E //此消息有一個LBS_WANTKEYBOARDINPUT風格的發出給它的所有者來響應WM_KEYDOWN消息
#define WM_CHARTOITEM 0x002F //此消息由一個LBS_WANTKEYBOARDINPUT風格的列表框發送給他的所有者來響應WM_CHAR消息
#define WM_SETFONT 0x0030 //當繪製文本時程序發送此消息得到控件要用的顏色
#define WM_GETFONT 0x0031 //應用程序發送此消息得到當前控件繪製文本的字體
#define WM_SETHOTKEY 0x0032 //應用程序發送此消息讓一個窗口與一個熱鍵相關連
#define WM_GETHOTKEY 0x0033 //應用程序發送此消息來判斷熱鍵與某個窗口是否有關聯
#define WM_QUERYDRAGICON 0x0037 //此消息發送給最小化窗口,當此窗口將要被拖放而它的類中沒有定義圖標,應用程序能返回一個圖標或光標的句柄,當用户拖放圖標時系統顯示這個圖標或光標
#define WM_COMPAREITEM 0x0039 //發送此消息來判定combobox或listbox新增加的項的相對位置
#if(WINVER >= 0x0500)
#ifndef _WIN32_WCE
#define WM_GETOBJECT 0x003D
#endif
#endif /* WINVER >= 0x0500 */
#define WM_COMPACTING 0x0041 //顯示內存已經很少了
#define WM_COMMNOTIFY 0x0044 /* no longer suported */
#define WM_WINDOWPOSCHANGING 0x0046 //發送此消息給那個窗口的大小和位置將要被改變時,來調用setwindowpos函數或其它窗口管理函數
#define WM_WINDOWPOSCHANGED 0x0047 //發送此消息給那個窗口的大小和位置已經被改變時,來調用setwindowpos函數或其它窗口管理函數
#define WM_POWER 0x0048 //當系統將要進入暫停狀態時發送此消息
/*
* wParam for WM_POWER window message and DRV_POWER driver notification
*/
#define PWR_OK 1
#define PWR_FAIL (-1)
#define PWR_SUSPENDREQUEST 1
#define PWR_SUSPENDRESUME 2
#define PWR_CRITICALRESUME 3
#define WM_COPYDATA 0x004A //當一個應用程序傳遞數據給另一個應用程序時發送此消息
#define WM_CANCELJOURNAL 0x004B //當某個用户取消程序日誌激活狀態,提交此消息給程序
/*
* lParam of WM_COPYDATA message points to...
*/
typedef struct tagCOPYDATASTRUCT {
ULONG_PTR dwData;
DWORD cbData;
PVOID lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT;
#if(WINVER >= 0x0400)
typedef struct tagMDINEXTMENU
{
HMENU hmenuIn;
HMENU hmenuNext;
HWND hwndNext;
} MDINEXTMENU, * PMDINEXTMENU, FAR * LPMDINEXTMENU;
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0400)
#define WM_NOTIFY 0x004E //當某個控件的某個事件已經發生或這個控件需要得到一些信息時,發送此消息給它的父窗口
#define WM_INPUTLANGCHANGEREQUEST 0x0050 //當用户選擇某種輸入語言,或輸入語言的熱鍵改變
#define WM_INPUTLANGCHANGE 0x0051 //當平台現場已經被改變後發送此消息給受影響的最頂級窗口
#define WM_TCARD 0x0052 //當程序已經初始化windows幫助例程時發送此消息給應用程序
#define WM_HELP 0x0053 //此消息顯示用户按下了F1,如果某個菜單是激活的,就發送此消息個此窗口關聯的菜單,否則就發送給有焦點的窗口,如果當前都沒有焦點,就把此消息發送給當前激活的窗口
#define WM_USERCHANGED 0x0054 //當用户已經登入或退出後發送此消息給所有的窗口,當用户登入或退出時系統更新用户的具體設置信息,在用户更新設置時系統馬上發送此消息
#define WM_NOTIFYFORMAT 0x0055 //公用控件,自定義控件和他們的父窗口通過此消息來判斷控件是使用ANSI還是UNICODE結構
#define NFR_ANSI 1
#define NFR_UNICODE 2
#define NF_QUERY 3
#define NF_REQUERY 4
#define WM_CONTEXTMENU 0x007B //當用户某個窗口中點擊了一下右鍵就發送此消息給這個窗口
#define WM_STYLECHANGING 0x007C //當調用SETWINDOWLONG函數將要改變一個或多個 窗口的風格時發送此消息給那個窗口
#define WM_STYLECHANGED 0x007D //當調用SETWINDOWLONG函數一個或多個 窗口的風格後發送此消息給那個窗口
#define WM_DISPLAYCHANGE 0x007E //當顯示器的分辨率改變後發送此消息給所有的窗口
#define WM_GETICON 0x007F //此消息發送給某個窗口來返回與某個窗口有關連的大圖標或小圖標的句柄
#define WM_SETICON 0x0080 //程序發送此消息讓一個新的大圖標或小圖標與某個窗口關聯
#endif /* WINVER >= 0x0400 */
#define WM_NCCREATE 0x0081 //當某個窗口第一次被創建時,此消息在WM_CREATE消息發送前發送
#define WM_NCDESTROY 0x0082 //此消息通知某個窗口,非客户區正在銷燬
#define WM_NCCALCSIZE 0x0083 //當某個窗口的客户區域必須被核算時發送此消息
#define WM_NCHITTEST 0x0084 //移動鼠標,按住或釋放鼠標時發生
#define WM_NCPAINT 0x0085 //程序發送此消息給某個窗口當它(窗口)的框架必須被繪製時
#define WM_NCACTIVATE 0x0086 //此消息發送給某個窗口僅當它的非客户區需要被改變來顯示是激活還是非激活狀態
#define WM_GETDLGCODE 0x0087 //發送此消息給某個與對話框程序關聯的控件,widdows控制方位鍵和TAB鍵使輸入進入此控件通過應
#ifndef _WIN32_WCE
#define WM_SYNCPAINT 0x0088
#endif
#define WM_NCMOUSEMOVE 0x00A0 //當光標在一個窗口的非客户區內移動時發送此消息給這個窗口 非客户區為:窗體的標題欄及窗 的邊框體
#define WM_NCLBUTTONDOWN 0x00A1 //當光標在一個窗口的非客户區同時按下鼠標左鍵時提交此消息
#define WM_NCLBUTTONUP 0x00A2 //當用户釋放鼠標左鍵同時光標某個窗口在非客户區時發送此消息
#define WM_NCLBUTTONDBLCLK 0x00A3 //當用户雙擊鼠標左鍵同時光標某個窗口在非客户區時發送此消息
#define WM_NCRBUTTONDOWN 0x00A4 //當用户按下鼠標右鍵同時光標又在窗口的非客户區時發送此消息
#define WM_NCRBUTTONUP 0x00A5 //當用户釋放鼠標右鍵同時光標又在窗口的非客户區時發送此消息
#define WM_NCRBUTTONDBLCLK 0x00A6 //當用户雙擊鼠標右鍵同時光標某個窗口在非客户區時發送此消息
#define WM_NCMBUTTONDOWN 0x00A7 //當用户按下鼠標中鍵同時光標又在窗口的非客户區時發送此消息
#define WM_NCMBUTTONUP 0x00A8 //當用户釋放鼠標中鍵同時光標又在窗口的非客户區時發送此消息
#define WM_NCMBUTTONDBLCLK 0x00A9 //當用户雙擊鼠標中鍵同時光標又在窗口的非客户區時發送此消息#DeFine WM_KEYFIRST 0x100
#if(_WIN32_WINNT >= 0x0500)
#define WM_NCXBUTTONDOWN 0x00AB
#define WM_NCXBUTTONUP 0x00AC
#define WM_NCXBUTTONDBLCLK 0x00AD
#endif /* _WIN32_WINNT >= 0x0500 */
#if(_WIN32_WINNT >= 0x0501)
#define WM_INPUT 0x00FF
#endif /* _WIN32_WINNT >= 0x0501 */
#define WM_KEYFIRST 0x0100
#define WM_KEYDOWN 0x0100 //按下一個鍵
#define WM_KEYUP 0x0101 //釋放一個鍵
#define WM_CHAR 0x0102 //按下某鍵,並已發出WM_KEYDOWN, WM_KEYUP消息
#define WM_DEADCHAR 0x0103 //當用translatemessage函數翻譯WM_KEYUP消息時發送此消息給擁有焦點的窗口
#define WM_SYSKEYDOWN 0x0104 //當用户按住ALT鍵同時按下其它鍵時提交此消息給擁有焦點的窗口
#define WM_SYSKEYUP 0x0105 //當用户釋放一個鍵同時ALT 鍵還按着時提交此消息給擁有焦點的窗口
#define WM_SYSCHAR 0x0106 //當WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函數翻譯後提交此消息給擁有焦點的窗口
#define WM_SYSDEADCHAR 0x0107 //當WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函數翻譯後發送此消息給擁有焦點的窗口
#if(_WIN32_WINNT >= 0x0501)
#define WM_UNICHAR 0x0109
#define WM_KEYLAST 0x0109
#define UNICODE_NOCHAR 0xFFFF
#else
#define WM_KEYLAST 0x0108
#endif /* _WIN32_WINNT >= 0x0501 */
#if(WINVER >= 0x0400)
#define WM_IME_STARTCOMPOSITION 0x010D
#define WM_IME_ENDCOMPOSITION 0x010E
#define WM_IME_COMPOSITION 0x010F
#define WM_IME_KEYLAST 0x010F
#endif /* WINVER >= 0x0400 */
#define WM_INITDIALOG 0x0110 //在一個對話框程序被顯示前發送此消息給它,通常用此消息初始化控件和執行其它任務
#define WM_COMMAND 0x0111 //當用户選擇一條菜單命令項或當某個控件發送一條消息給它的父窗口,一個快捷鍵被翻譯
#define WM_SYSCOMMAND 0x0112 //當用户選擇窗口菜單的一條命令或當用户選擇最大化或最小化時那個窗口會收到此消息
#define WM_TIMER 0x0113 //發生了定時器事件
#define WM_HSCROLL 0x0114 //當一個窗口標準水平滾動條產生一個滾動事件時發送此消息給那個窗口,也發送給擁有它的控件
#define WM_VSCROLL 0x0115 //當一個窗口標準垂直滾動條產生一個滾動事件時發送此消息給那個窗口也,發送給擁有它的控件
#define WM_INITMENU 0x0116 //當一個菜單將要被激活時發送此消息,它發生在用户菜單條中的某項或按下某個菜單鍵,它允許程序在顯示前更改菜單
#define WM_INITMENUPOPUP 0x0117 //當一個下拉菜單子菜單將要被激活時發送此消息,它允許程序在它顯示前更改菜單,而不要改變全部
#define WM_MENUSELECT 0x011F //當用户選擇一條菜單項時發送此消息給菜單的所有者(一般是窗口)
#define WM_MENUCHAR 0x0120 //當菜單已被激活用户按下了某個鍵(不同於加速鍵),發送此消息給菜單的所有者
#define WM_ENTERIDLE 0x0121 //當一個模態對話框或菜單進入空載狀態時發送此消息給它的所有者,一個模態對話框或菜單進入空載狀態就是在處理完一條或幾條先前的消息後沒有消息它的列隊中等待
#if(WINVER >= 0x0500)
#ifndef _WIN32_WCE
#define WM_MENURBUTTONUP 0x0122
#define WM_MENUDRAG 0x0123
#define WM_MENUGETOBJECT 0x0124
#define WM_UNINITMENUPOPUP 0x0125
#define WM_MENUCOMMAND 0x0126
#ifndef _WIN32_WCE
#if(_WIN32_WINNT >= 0x0500)
#define WM_CHANGEUISTATE 0x0127
#define WM_UPDATEUISTATE 0x0128
#define WM_QUERYUISTATE 0x0129
/*
* LOWORD(wParam) values in WM_*UISTATE*
*/
#define UIS_SET 1
#define UIS_CLEAR 2
#define UIS_INITIALIZE 3
/*
* HIWORD(wParam) values in WM_*UISTATE*
*/
#define UISF_HIDEFOCUS 0x1
#define UISF_HIDEACCEL 0x2
#if(_WIN32_WINNT >= 0x0501)
#define UISF_ACTIVE 0x4
#endif /* _WIN32_WINNT >= 0x0501 */
#endif /* _WIN32_WINNT >= 0x0500 */
#endif
#endif
#endif /* WINVER >= 0x0500 */
#define WM_CTLCOLORMSGBOX 0x0132 //在windows繪製消息框前發送此消息給消息框的所有者窗口,通過響應這條消息,所有者窗口可以通過使用給定的相關顯示設備的句柄來設置消息框的文本和背景顏色
#define WM_CTLCOLOREDIT 0x0133 //當一個編輯型控件將要被繪製時發送此消息給它的父窗口 通過響應這條消息,所有者窗口可以通過使用給定的相關顯示設備的句柄來設置編輯框的文本和背景顏色
#define WM_CTLCOLORLISTBOX 0x0134 //當一個列表框控件將要被繪製前發送此消息給它的父窗口 通過響應這條消息,所有者窗口可以通過使用給定的相關顯示設備的句柄來設置列表框的文本和背景顏色
#define WM_CTLCOLORBTN 0x0135 //當一個按鈕控件將要被繪製時發送此消息給它的父窗口 通過響應這條消息,所有者窗口可以通過使用給定的相關顯示設備的句柄來設置按紐的文本和背景顏色
#define WM_CTLCOLORDLG 0x0136 //當一個對話框控件將要被繪製前發送此消息給它的父窗口 通過響應這條消息,所有者窗口可以通過使用給定的相關顯示設備的句柄來設置對話框的文本背景顏色
#define WM_CTLCOLORSCROLLBAR 0x0137 //當一個滾動條控件將要被繪製時發送此消息給它的父窗口 通過響應這條消息,所有者窗口可以通過使用給定的相關顯示設備的句柄來設置滾動條的背景顏色
#define WM_CTLCOLORSTATIC 0x0138 //當一個靜態控件將要被繪製時發送此消息給它的父窗口 通過響應這條消息,所有者窗口可以 通過使用給定的相關顯示設備的句柄來設置靜態控件的文本和背景顏色
#define MN_GETHMENU 0x01E1
#define WM_MOUSEFIRST 0x0200 //移動鼠標時發生
#define WM_MOUSEMOVE 0x0200 //移動鼠標時發生,同WM_MOUSEFIRST
#define WM_LBUTTONDOWN 0x0201 //按下鼠標左鍵
#define WM_LBUTTONUP 0x0202 //釋放鼠標左鍵
#define WM_LBUTTONDBLCLK 0x0203 //雙擊鼠標左鍵
#define WM_RBUTTONDOWN 0x0204 //按下鼠標右鍵
#define WM_RBUTTONUP 0x0205 //釋放鼠標右鍵
#define WM_RBUTTONDBLCLK 0x0206 //雙擊鼠標右鍵
#define WM_MBUTTONDOWN 0x0207 //按下鼠標中鍵
#define WM_MBUTTONUP 0x0208 //釋放鼠標中鍵
#define WM_MBUTTONDBLCLK 0x0209 //雙擊鼠標中鍵
#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
#define WM_MOUSEWHEEL 0x020A //當鼠標輪子轉動時發送此消息個當前有焦點的控件 Buttons
#endif
#if (_WIN32_WINNT >= 0x0500)
#define WM_XBUTTONDOWN 0x020B
#define WM_XBUTTONUP 0x020C
#define WM_XBUTTONDBLCLK 0x020D
#endif
#if (_WIN32_WINNT >= 0x0500)
#define WM_MOUSELAST 0x020D
#elif (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
#define WM_MOUSELAST 0x020A
#else
#define WM_MOUSELAST 0x0209
#endif /* (_WIN32_WINNT >= 0x0500) */
#if(_WIN32_WINNT >= 0x0400)
/* Value for rolling one detent */
#define WHEEL_DELTA 120
#define GET_WHEEL_DELTA_WPARAM(wParam) ((short)HIWORD(wParam))
/* Setting to scroll one page for SPI_GET/SETWHEELSCROLLLINES */
#define WHEEL_PAGESCROLL (UINT_MAX)
#endif /* _WIN32_WINNT >= 0x0400 */
#if(_WIN32_WINNT >= 0x0500)
#define GET_KEYSTATE_WPARAM(wParam) (LOWORD(wParam))
#define GET_NCHITTEST_WPARAM(wParam) ((short)LOWORD(wParam))
#define GET_XBUTTON_WPARAM(wParam) (HIWORD(wParam))
/* XButton values are WORD flags */
#define XBUTTON1 0x0001
#define XBUTTON2 0x0002
/* Were there to be an XBUTTON3, its value would be 0x0004 */
#endif /* _WIN32_WINNT >= 0x0500 */
#define WM_PARENTNOTIFY 0x0210
#define WM_ENTERMENULOOP 0x0211
#define WM_EXITMENULOOP 0x0212
#if(WINVER >= 0x0400)
#define WM_NEXTMENU 0x0213
#define WM_SIZING 0x0214
#define WM_CAPTURECHANGED 0x0215
#define WM_MOVING 0x0216
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0400)
#define WM_POWERBROADCAST 0x0218
#ifndef _WIN32_WCE
#define PBT_APMQUERYSUSPEND 0x0000
#define PBT_APMQUERYSTANDBY 0x0001
#define PBT_APMQUERYSUSPENDFAILED 0x0002
#define PBT_APMQUERYSTANDBYFAILED 0x0003
#define PBT_APMSUSPEND 0x0004
#define PBT_APMSTANDBY 0x0005
#define PBT_APMRESUMECRITICAL 0x0006
#define PBT_APMRESUMESUSPEND 0x0007
#define PBT_APMRESUMESTANDBY 0x0008
#define PBTF_APMRESUMEFROMFAILURE 0x00000001
#define PBT_APMBATTERYLOW 0x0009
#define PBT_APMPOWERSTATUSCHANGE 0x000A
#define PBT_APMOEMEVENT 0x000B
#define PBT_APMRESUMEAUTOMATIC 0x0012
#endif
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0400)
#define WM_DEVICECHANGE 0x0219
#endif /* WINVER >= 0x0400 */
#define WM_MDICREATE 0x0220
#define WM_MDIDESTROY 0x0221
#define WM_MDIACTIVATE 0x0222
#define WM_MDIRESTORE 0x0223
#define WM_MDINEXT 0x0224
#define WM_MDIMAXIMIZE 0x0225
#define WM_MDITILE 0x0226
#define WM_MDICASCADE 0x0227
#define WM_MDIICONARRANGE 0x0228
#define WM_MDIGETACTIVE 0x0229
#define WM_MDISETMENU 0x0230
#define WM_ENTERSIZEMOVE 0x0231
#define WM_EXITSIZEMOVE 0x0232
#define WM_DROPFILES 0x0233
#define WM_MDIREFRESHMENU 0x0234
#if(WINVER >= 0x0400)
#define WM_IME_SETCONTEXT 0x0281
#define WM_IME_NOTIFY 0x0282
#define WM_IME_CONTROL 0x0283
#define WM_IME_COMPOSITIONFULL 0x0284
#define WM_IME_SELECT 0x0285
#define WM_IME_CHAR 0x0286
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0500)
#define WM_IME_REQUEST 0x0288
#endif /* WINVER >= 0x0500 */
#if(WINVER >= 0x0400)
#define WM_IME_KEYDOWN 0x0290
#define WM_IME_KEYUP 0x0291
#endif /* WINVER >= 0x0400 */
#if((_WIN32_WINNT >= 0x0400) || (WINVER >= 0x0500))
#define WM_MOUSEHOVER 0x02A1
#define WM_MOUSELEAVE 0x02A3
#endif
#if(WINVER >= 0x0500)
#define WM_NCMOUSEHOVER 0x02A0
#define WM_NCMOUSELEAVE 0x02A2
#endif /* WINVER >= 0x0500 */
#if(_WIN32_WINNT >= 0x0501)
#define WM_WTSSESSION_CHANGE 0x02B1
#define WM_TABLET_FIRST 0x02c0
#define WM_TABLET_LAST 0x02df
#endif /* _WIN32_WINNT >= 0x0501 */
#define WM_CUT 0x0300
#define WM_COPY 0x0301
#define WM_PASTE 0x0302
#define WM_CLEAR 0x0303
#define WM_UNDO 0x0304
#define WM_RENDERFORMAT 0x0305
#define WM_RENDERALLFORMATS 0x0306
#define WM_DESTROYCLIPBOARD 0x0307
#define WM_DRAWCLIPBOARD 0x0308
#define WM_PAINTCLIPBOARD 0x0309
#define WM_VSCROLLCLIPBOARD 0x030A
#define WM_SIZECLIPBOARD 0x030B
#define WM_ASKCBFORMATNAME 0x030C
#define WM_CHANGECBCHAIN 0x030D
#define WM_HSCROLLCLIPBOARD 0x030E
#define WM_QUERYNEWPALETTE 0x030F
#define WM_PALETTEISCHANGING 0x0310
#define WM_PALETTECHANGED 0x0311
#define WM_HOTKEY 0x0312
#if(WINVER >= 0x0400)
#define WM_PRINT 0x0317
#define WM_PRINTCLIENT 0x0318
#endif /* WINVER >= 0x0400 */
#if(_WIN32_WINNT >= 0x0500)
#define WM_APPCOMMAND 0x0319
#endif /* _WIN32_WINNT >= 0x0500 */
#if(_WIN32_WINNT >= 0x0501)
#define WM_THEMECHANGED 0x031A
#endif /* _WIN32_WINNT >= 0x0501 */
#if(WINVER >= 0x0400)
#define WM_HANDHELDFIRST 0x0358
#define WM_HANDHELDLAST 0x035F
#define WM_AFXFIRST 0x0360
#define WM_AFXLAST 0x037F
#endif /* WINVER >= 0x0400 */
#define WM_PENWINFIRST 0x0380
#define WM_PENWINLAST 0x038F

SendMessage常用編輯控件

EC_LEFTMARGIN EC_USEFONTINF 設置左邊距時使用
EC_RIGHTMARGIN EC_USEFONTINF 設置右邊距時使用
EC_USEFONTINF,O, 邊距 設置編輯控件的左、右邊距,當wParam含EC_LEFTMARGIN時在lParam的低16位指定左邊距點數,當wParam含EC_RIGHTMARGIN時在lParam的高16位指定右邊距點數。當指定wParam為EC_USEFONTINFO時,則用當前字體的字符"A"的寬度指定右邊距和字符"C"的寬度指定左邊距lParam被忽略。
EM_CHARFROMPOS(&HD7=215),0, 取得編輯控件中指定位置的字符相對於文本頭部的偏移量。使用本操作應先在第4個參數的高16位指定行號,低16位指定列號(或一個POINTAPI結構),行列是按編輯控件的客户區左上角為原點(0,0)計算的。如果指定的位置超出控件客户區則返回-1
EM_CANUNDO(&HC6=198),0,0   決定前一次編輯操作是否能夠撤消:檢測控件撤消緩衝區是否為空,通常控件把最後一次在控件的編輯操作保存在一個撤消緩衝區,如果緩衝區非空則返回TRUE表示上次操作可以撤消,否則返回FALSE,應用程序可以利用該返回值來禁止或允許菜單或工具條的"撤消"項。
EM_EMPTYUNDOBUFFER(&HCD=205 ),0,0 清除控件的撤消緩衝區,使其不能撤消前一次編輯操作
EM_FMTLINES(&HC8=200)   決定是否在取回的文本宇串中包含軟回車字符
EM_GETFIRSTVISIBLEINE(&HCE=206),0,0 獲得文本控件中處於可見位置的最頂部的文本所在的行號
EM_GETLINE(&HC4=196 ),行號,ByVal 變量 獲取編輯控件某一行的內容,變量須預先賦空格
EM_GETLINECOUNT(&HBA=186),0,0 獲取編輯控件的總行數
EM_GETMODIFY(&HB8=184),0,0  判斷編輯控件的內容是否已發生變化,返回TRUE則控件文本已被修改,返回FALSE則未變。
EM_GETPASSWORDCHAR( ),0,0  獲取編輯控件的密碼字符,返回NULL表示沒有字符
EM_GETRECT(&HB2=178),0,結構   獲取編輯控件的格式化矩形
EM_GETTHUMB(&HBE=190),0,0 取得多行文本編輯控件的滾動框的當前位置(注意:是象素值)
EM_GETSEL(&HB0=176),0,變量 獲取光標位置(以字節數表示),或:(緩衝區起點,緩衝區終點)取得編輯控件中選定內容的範圍,返回值中低16位為起點,高16位為終點
EM_GETHANDLE(&HBD=189),0,0 取得文本緩衝區
EM_GETWORDBREAKPROC(&HD1=209),0,0 取得整字換行回調函數EditWordBreakProc指針
EM_GETLIMITTEXT(WM_USER+37=1061),0,0 獲取一個編輯控件中文本的最大長度
EM_GETMARGINS( ),0,0 獲取編輯控件的左、右邊距,返回值低16位為左邊距,高16位為右邊距(不得用於NT3.51)
EM_LIMITTEXT(&HC5=197),最大值,0 設置編輯控件中的文本長度
EM_SCROLLCARET(&HB7=183),0,0 把可見範圍移至光標處
EM_LINEFROMCHAR(&HC9=201),偏移值,0 獲取指定位置(或:-1,0 表示光標位置)所在的行號
EM_LINEINDEX(&HBB=187),行號,0 獲取指定行(或:-1,0 表示光標所在行)首字符在文本中的位置(以字節數表示)
EM_LINELENGTH(&hC1=193),偏移值,0 獲取指定位置所在行(或:-1,0 表示光標所在行)的文本長度(以字節數表示)
EM_POSFROMCHARPOINT,結構地址,偏移值 取得指定字符位置的行列號,偏移值是字符相對於文本頭部的偏移。
EM_LINESCROLL(&HB6=182),列數,行數 指定行數的文本水平滾動,每次滾動N列
EM_EXGETSEL(&H434=1076)
EM_EXSETSEL(&H437=1079),0,結構 RichEdit控件設置文本選定範圍,參閲 EM_SETSEL 消息,結構是指 CHARRANGE 結構
EM_PASTESPECIAL(&H440=1088),2(1),1 RichEdit控件粘貼剪貼板中的位圖(或文本)
EM_FINDTEXT(&H738=1080) RichEdit控件正文搜索操作
EM_FINDTEXTEX(&H44F=1103) 同上
EM_SETTEXTEX(&H461=1121) RichEdit控件正文替換/插入操作
EM_SETTARGETDEVICE, GetDC(RichText.hWnd), RichText.Width / 15)設置 RichTextBox 自動換行,後續代碼是:RichText.RightMargin = iif(RichText.RightMargin = 0,1,0)
EM_SETTARGETDEVICE, 0, 1 設置 RichTextBox 不自動換行
EM_POSFROMCHAR(&HD6或&H426) 判斷指定字符在編輯控件的位置(用於NT3.51)
EM_SCROLL(&HB5=181),*,0 文本垂直滾動。第三個參數*控制滾動方向:SB_LINEDOWN(1)向下滾動一行,SB_LINEUP(0)向上滾動一行,SB_PAGEDOWN(3)向下滾動一頁,SB_PAGEUP(2)向上滾動一頁。
EM_REPLACESEL(&HC2=194),1(0), 字符串 用指定字符串替換編輯控件中的當前選定內容,如果第三個參數wParam為1,則本次操作允許撤消,0禁止撤消。字符串可用傳值方式,也可用傳址方式(例:SendMessage Text1.hwnd, EM_REPLACESEL, 0, Text2.Text '這是傳值方式)
EM_SETSEL(&HB1=177), 起點,終點 設置編輯控件中文本選定內容範圍(或設置光標位置),該範圍被反相顯示,用於為複製、替換、粘貼、剪切、刪除等編輯功能指定範圍,光標將被移至指定的終點後面。還可使用指定相同起點和終點來移動光標而不是選定範圍。當指定的起點等於0和終點等於-1時,文本全部被選中,此法常用在清空編輯控件。當指定的起點等於-2和終點等於-1時,全文均不選,光標移至文本未端,此法常用在文本未端追加內容。注意:當控件沒有輸入焦點時,本操作將會失敗,一般在執行本操作前都應調用SetFocus先取得輸入焦點。
EM_UNDO(&HC7=199),0,0 撤消前一次編輯操作,當重複發送本消息,控件將在撤消和恢復中來回切換
EM_SETCHARFORMAT(&H444) 改變選定文本的顏色
EM_SETHANDLE(&HBC=188),緩衝區指針,0 為編輯控件指定新的文本緩衝區。此操作僅適用對話框創建帶DS_LOCALEDIT風格的控件。
EM_SETLIMITTEXT,長度(字節),0 設置編輯控件中的文本最大長度(不得用於NT3.51)
EM_SETMARGINS(&HD3=211) 設置編輯控件的左、右邊距(不得用於NT3.51)
EM_SETMODIFY(&HB9=185),1(0),0 設置或清除一個編輯控件的修改標誌
EM_SETPASSWORDCHAR(&HCC=204),字符,0 指定控件用來顯示密碼的字符,缺省為"*"。當第三個參數wParam為0時,本操作將清除控件的ES_PASSWORD風格,並按實際字符顯示
EM_SETREADONLY(&HCF=207),1(0),0 決定是否將編輯控件設為只讀,同時決定控件的ES_READONLY風格
EM_SETRECT(&HB3=179),0(或RECT),結構地址 為一個編輯控件設置格式化矩形
EM_SETRECTNP(&HB4=180),0(或RECT),結構地址 為一個編輯控件設置格式化矩形,只是控件此時不會重畫
EN_CHANGE(&H300=768) 編輯控件的內容發生改變。與EN_UPDATE不同,該消息是在編輯框顯示的正文被刷新後才發出的。
EN_ERRSPACE(&H500=1280) 任何時候只要由於內存不足以完成一項編輯操作
EN_HSCROLL(&H601=1537) 用户單擊了編輯控件的水平滾動條。注意:這條消息是在控件更新顯示之前發送出去的。
EN_VSCROLL(&H602=1538) 用户單擊了編輯控件的垂直滾動條。注意:這條消息是在控件更新顯示之前發送出去的。
EN_KILLFOCUS(&H200=512) 編輯控件失去了輸入焦點
EN_SETFOCUS(&H100=256) 編輯控件獲得了輸入焦點
EN_UPDATE(&H400=1024) 控件準備顯示改變了的正文時發送該消息。它與EN_CHANGE通知消息相似,只是它發生於更新文本顯示出來之前。
EN_MAXTEXT(&H501=1281) 用户輸人的文字數超出由EM_LIMITTEXT消息規定的界限,或超出由VB Maxlength屬性規定的界限,就會發送這條消息 。此外,倘若不允許自動進行水平滾動,同時插入點要超出控件的寬度;或者不允許自動垂直滾動,同時插入點要超出控件的高度,那麼也會觸發這條消息。在沒有 ES_AUTOHSCROLL或ES_AUTOVSCROLL的編輯框中,當正文超出了編輯框的邊框時也會發出該消息。

SendMessage編輯風格消息

ES_MULTILINE   指定編輯控件能否進行多行文本編輯,若多行編輯器不指定ES_AUTOHSCROLL風格,則會自動換行,用户每按一次Enter,在當前光標處輸入一個回車換行符(0Dh,0Ah),文本增加一行。若不指定ES_AUTOVSCROLL,則多行編輯器會在窗口中正文裝滿時發出警告聲響。
ES_LEFT 文本顯示居左。
ES_CENTER  文本顯示居中。
ES_RIGHT  文本顯示居右。
ES_LOWERCASE  把用户輸入的字母統統轉換成小寫字母
ES_UPPERCASE  把用户輸入的字母統統轉換成大寫字母
ES_OEMCONVERT  把輸入的文本從ANSI碼轉換成OEM碼,然後又轉換成ANSI碼,目的是保證函數AnsiToOem的正確調用。這在編輯框中包含文件名時是很有用的。
ES_AUTOHSCROLL(自動增加水平滾動條) 當用户在行尾鍵入一個字符時,正文將自動向右滾動10個字符,當用户按回車鍵時,正文總是滾向左邊。
ES_AUTOVSCROLL  當用户在最後一個可見行按回車鍵時,正文向上滾動一頁。
ES_NUMBER  只接收數碼輸入,其它字符輸入一律無效。
ES_NOHIDESEL(&H100=256) 當編輯框失去輸入焦點時,選中的文本將隱藏,正文中的選擇保持不變。缺省時正文中的選擇將失效,當獲得輸入焦點後才又顯示出來。
ES_READONLY  將編輯框設置成只讀的。
ES_PASSWORD(&H20=32) 使所有鍵入的字符都用"*"來顯示。
ES_WANTRETURN  使多行編輯器接收回車鍵輸入並換行。如果不指定該風格,按回車鍵會選擇缺省的命令按鈕,這往往會導致對話框的關閉。

SendMessage列表框操作

LB_FINDSTRING(&H18F=399),-1,ByVal 字串 查找列表項的字符串返回值=字符串所在的列表項的索引。-1表示從第0行開始查找,如果改為一個有效的列表項索引值,將從該行開始查找。
LB_ITEMFROMPOINT(&H1A9=425) 獲取光標所在的列表項的索引
LB_SETHORIZONTALEXTENT(&H194=404),長度,0 設置列表框的橫向滾動條以及滾動長度,長度為象素值

SendMessage組合框操作

CB_SHOWDROPDOWN(&H14F),1(0),0 打開(關閉)組合框的列表
TVM_SETBKCOLOR(&H1100+29=4381) 設置擴展樹型列表控件的背景色(TVM開頭的常數)

SendMessage常用窗口消息

WM_GETFONT(&H31=49) 得到當前控件繪製文本的字體(的句柄)
WM_GETTEXT(&HD=13),變量長度,變量 取得窗體的標題,變量須預先賦空字串(chr(0),變量長度=Len(變量)
WM_SETTEXT(&HC=12),0,ByVal "字串" 設置窗體的標題
WM_NCLBUTTONDOWN(&HA1=161),2,0 在非客户區,即邊框及標題欄上(假如定義的是一個組件,則非客户區包括Form等)按下鼠標左鍵;
WM_LBUTTONDOWN(&H201=513),2,0 在客户區,也就是除邊框及標題欄以外按下鼠標左鍵
WM_VSCROLL(&H115=277),&H10000*p+SB_THUMBPOSITION(&H4),0 同步滾動文本,p是位置改變量
WM_PAINT
WM_USER(&H400=1024)
WM_CUT(&H300=768),0,0 剪切
WM_COPY(&H301=769),0,0 複製
WM_PASTE(&H302=770),0,0 粘貼
WM_CLEAR(&H303=771),0,0 刪除
WM_UNDO(&H304=772),0,0 撤消

SendMessage按鈕消息

BM_SETSTYLE(&HF4) 設置按紐樣式
BS_RADIOBUTTON(&H4) 收音機旋紐式的按紐,是 BM_SETSTYLE 使用的參數