SendMessage

SendMessage

Windows API宏,在WinUser.h中根據是否已定義Unicode被定義為SendMessageW或SendMessageA,這兩個函式將指定的訊息傳送到一個或多個視窗。此函式為指定的視窗調用視窗程式,直到視窗程式處理完訊息再返回。而和函式PostMessage不同,PostMessage是將一個訊息寄送到一個執行緒的訊息佇列後就立即返回。

函式功能

該函式將指定的訊息傳送到一個或多個視窗。此函式為指定的視窗調用視窗程式,直到視窗程式處理完訊息再返回。而和函式PostMessage不同,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# -------------

一、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(NULL,"QQ2010");

if( hWnd != NULL)

{

::SendMessage(hWnd,WM_CLOSE,0,0);

}

return 0;

}

為說明具體的使用方法,下面提供簡單的程式片段。首先在代碼模組中做如下聲明:

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–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–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訊息後,此訊息傳送給應用程式,通知它對話是否結束

#endif

#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

常用編輯控制項

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的編輯框中,當正文超出了編輯框的框線時也會發出該訊息。

編輯風格訊息

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  使多行編輯器接收回車鍵輸入並換行。如果不指定該風格,按回車鍵會選擇預設的命令按鈕,這往往會導致對話框的關閉。

列表框操作

LB_FINDSTRING(&H18F=399),-1,ByVal 字串 查找列表項的字元串,返回值=字元串所在的列表項的索引。-1表示從第0行開始查找,如果改為一個有效的列表項索引值,將從該行開始查找。

LB_ITEMFROMPOINT(&H1A9=425) 獲取游標所在的列表項的索引

LB_SETHORIZONTALEXTENT(&H194=404),長度,0 設定列表框的橫向滾動條以及滾動長度,長度為象素值

組合框操作

CB_SHOWDROPDOWN(&H14F),1(0),0 打開(關閉)組合框的列表

TVM_SETBKCOLOR(&H1100+29=4381) 設定擴展樹型列表控制項的背景色(TVM開頭的常數)

常用視窗訊息

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 撤消

按鈕訊息

BM_SETSTYLE(&HF4) 設定按紐樣式

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

相關詞條

相關搜尋

熱門詞條

聯絡我們