稻草人男士手包系列:API 之消息函数

来源:百度文库 编辑:偶看新闻 时间:2024/05/09 03:57:51

API 之消息函数

目录

BroadcastSystemMessage            将一条系统消息广播给系统中所有的顶级窗口

GetMessagePos                           取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置:

GetMessageTime                         取得消息队列中上一条消息处理完毕时的时间

PostMessage                               将一条消息投递到指定窗口的消息队列

PostThreadMessage                     将一条消息投递给应用程序

RegisterWindowMessage              获取分配给一个字串标识符的消息编号

ReplyMessage                             答复一个消息

SendMessage                              调用一个窗口的窗口函数,将一条消息发给那个窗口

SendMessageCallback                  将一条消息发给窗口

SendMessageTimeout                  向窗口发送一条消息

SendNotifyMessage                     向窗口发送一条消息

消息列表

常用编辑控件消息

 

 

BroadcastSystemMessage函数

函数功能:

      该函数发送消息给指定的接受者。接受者可以是一个应用程序、安装驱动器、网络驱动器、系统级设备驱动器或这些系统组件的组合。

函数原型:

long BroadcastSystemMessage(DWORD dwFIags,LPDWORD IpdwRecipients,UINT UiMessage,WPARAMwParam,LPARAM Iparam);

参数:

dwFlags:

选项标志。可取下列值的组合:

BSF_FLUSHDISK:接受者处理消息之后清洗磁盘。

BSF_FORCEIFHUNG:继续广播消息,即使超时周期结束或一个接受者已挂起。 BSF_IGNORECURRENTTASK:不发送消息给属于当前任务的窗口。这样,应用程序就不会接收自己的消息。

BSF_NOHANG:强制挂起的应用程序超时。如果一个接受者超时,不再继续广播消息。 BSF_NOTIMEOUTIFNOTHUNG:只要接受者没挂起,一直等待对消息的响应。不会出现超时。 BSF_POSTMESSAGE:寄送消息。不能和BSF_QUERY组合使用。

BSF_QUERY:每次发送消息给一个接受者,只有当前接受者返回TRUE后,才能发送给下一个接受者。 lpdwRecipients:指向变量的指针,该变量含有和接收消息接受者的信息。此变量可为下列值的组合: BSM_ALLCOMPONENTS:广播到所有的系统组件。

BSM_ALLDESKTOPS:Windows NT下,广播到所有的桌面。要求SE_TCB_NAME特权。

BSM_APPLICATIONS:广播到应用程序。

BSM_INSTALLABLEDRIVERS:Windows 95下,广播到安装驱动器。

BSM_INTDRIVER:Windows 95下,广播到网络驱动器。

BSM_VXDS:Windows 95下,广播到所有系统级设备驱动器。

当函数返回时,此变量接受上述值的组合,以确定真正接受消息的接受者。如果此参数为NULL,则将消息广播到所有的组件。

uiMessage:

系统消息标识符。

WParam:

32位消息特定值。

IParam:

32位消息特定值。

返回值:

如果函数调用成功,返回值是正数。如果函数不能广播消息,返回值是C1。如果参数dwFlags为BSF_QUERY且至少一个接受者返回BROADCAST_QUERY_DENY给相应的消息,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。

备注:如果BSF_QUERY没指定,函数发送指定的消息给所有请求的接受者,并忽略这些接受者返回的值。

 

GetMessagePos函数

函数功能:

该函数返回表示屏幕坐标下光标位置的长整数值。此位置表示当上一消息由GetMessage取得时鼠标占用的点。

函数原型:

DWORD GetMessagePos(VOID);

参数:

无。

返回值:

返回值给出光标位置的X,y坐标。X坐标在低位整数,y坐标在高位整数。

备注:

如前所述,X坐标在返回值的低位整数,y坐标在高位整数(都表示有符号值,因为在多显示器的系统里可取得负值)。如果返回值赋给了一个变量,可用MAKEPOINT宏从返回值取得POINT结构。也可用GET_X_LPARAM或GET_Y_LPARAM宏来抽取X,y坐标,取得的坐标为屏幕坐标,并不是客户区坐标。

     要得到光标的当前位置而不是上一个消息发生时的位置,调用函数GetCursorPos。

要点:

不要用LOWORD或HIWORD宏来抽取鼠标位置的x,y坐标,因为在多显示器的系统里将返回不正确的结果。多显示器的系统里可取得负的x, y坐标,但LOWORD和HIWORD将坐标当作无符号量。Windows CE下,对那些使用记录笔而不是鼠标的设备,光标位置是指当上一信息由GetMessage取得时,记录笔在触屏上的位置。

 

GetMessageTime函数

函数功能:

该函数返回由GetMessage从当前线程队列里取得上一消息的消息时间。时间是一个长整数,指定从系统开始到消息创建(即,放入线程消息队列)的占用时间(按毫秒计算)。

函数原型:

LONG GetMessageTime(VOID)

参数:

无。

返回值:

返回值为消息时间。

备注:

由GetMessageTime返回的值对后面的消息并不一定是增长的,因为当计时器计数超过长整数的最大值时,又从零开始计算。为计算消息间的延迟时间,必须验证第二个消息的时间比第一个消息的时间大,然后用第二个消息的时间减去第一个消息的时间。

 

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),消息参数不能包含指针。否则,操作将会失败。函数将再接收线程处理消息之前返回,发送者将在内存被使用之前释放。

HTML5标准下的PostMessage

      在HTML5中新增了PostMessage方法,PostMessage可以实现跨文档消息传输(Cross Document Messaging),Internet Explorer 8, Firefox 3, Opera 9, Chrome 3和 Safari 4都支持postMessage。可以通过绑定window的message事件来监听发送跨文档消息传输内容。

 

PostThreadMessage函数

函数功能:

该函数将一个消息放入(寄送)到指定线程的消息队列里,不等待线程处理消息就返回。

函数原型:

BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM Iparam);

      参数

idThread:

其消息将被寄送的线程的线程标识符。如果线程没有消息队列,此函数将失败。当线程第一次调用一个Win 32 USER或GDI函数时,系统创建线程的消息队列。要得到更多的信息,参见备注。

Msg:

指定将被寄送的消息的类型。

wParam:

指定附加的消息特定信息。

IParam:

指定附加的消息特定信息。

返回值:

如果函数调用成功,返回非零值。如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。如果idThread不是一个有效的线程标识符或由idThread确定的线程没有消息队列,GetLastError返回ERROR_INVALID_THREAD。

备注:

消息将寄送到的线程必须创建消息队列,否则调用PostThreadMessage会失败。用下列方法之一来处理这种情况:

     调用PostThreadMessage。如果失败,调用Sleep,再调用PostThreadMessage,反复执行,直到PostThreadMessage成功。

   创建一个事件对象,再创建线程。在调用PostThreadMessage之前,用函数WaitForSingleObject来等特事件被设置为被告知状态。消息将寄送到的线程调用PeekMessage(&msg,NULL,WM_USER,WM_USER,PM_NOREMOVE)来强制系统创建消息队列。设置事件,表示线程已准备好接收寄送的消息。

     消息将寄送到的线程通过调用GetMesssge或PeekMesssge来取得消息。返回的MSG结构中的hwnd成员为NULL。

 

RegisterWindowMessage函数

函数功能:

定义一个新的窗口消息,该消息保证在整个系统范围内是唯一的。调用SendMessage或PostMessage函数时可以使用该函数返回的消息值。
函数原型:

        UINT RegisterWindowMessage(lpsz)

参数:

Lpsz:

指向一个以NULL结束的字符串,该字符串指定待登记的消息。

返回值:

若成功地登记了消息,返回值是一个消息标识符。该标识符值的范围在0XC000到0XFFFF之间,否则,返回值为0。

备注:

RegisterWindowMessage函数通常用于为两个合作应用程序之间的通信登记消息。

若两个不同的应用程序登记了相同的消息字符串,则这两个应用程序返回相同的消息值。该消息一直维持被登记状态,直到Windows会话结束。当多个应用程序必须处理同一消息时才使用RegisterWindowMessage函数。在一个窗口类范围内发送私有消息时,应用程序可使用范围在WM_USER到0X7FFF之间的任意整数。

 

ReplyMessage函数

函数功能:

该函数用于应答由函数SendMessage发送的消息,不返回控制给调用SendMessage的函数。

函数原型:

BOOL ReplyMessage(LRESULTIResult);

     参数

IResult:指定消息处理的结果。可能的值由所发送的消息确定。

返回值:

如果调用线程正处理从其他线程或进程发送的消息,返回非零值。如果调用线程不是正处理从其他线程或进程发送的消息,返回值是零。

备注:

调用此函数,接收消息的窗口程序允许调用SendMessage的线程继续运行,尽管接收消息的线程已返回控制。调用ReplyMessage的线程也继续运行。

       如果消息不是通过SendMessage发送的,或者消息由同一个线程发送,ReplyMessage不起作用。

 

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函数,方法是发一个CB_SHOWDROPDOWN(&H14F)消息给组合框。

在发CB_SHOWDROPDOWN消息时,wParam参数决定了是拉下列表(=True时)还是收起列表(=False时),lParam无用(设为0)。

举例说明:

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

}

当程序中某处需要拉下组合框Combol的列表时,写如下调用语句:

    SendMessage(Combol.hwnd,CB_SHOWDROPDOWN,True,0);

当需要收起组合框Combol的列表时,写如下语句:

   SendMessage(Combol.hwnd,CB_SHOWDROPDOWNN,False,0)

 

SendMessageCallback函数

函数功能:

该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,并立即返回。当窗口程序处理完消息后,系统调用指定的回调函数,将消息处理的结果和一个应用程序定义的值传给回调函数。

函数原型:

BOOL SendMessageCallback(HWND hwnd,UINT Msg,WPARAM wParam,LPARAM Iparam,SEhDASYNCPROC IpResultCallBack,DWORD dwData);

参数

hWnd:

其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。

Msg:

指定被发送的消息。

wParam:

指定附加的消息指定信息。

IParam:

指定附加的消息指定信息。

IpResultCallBack:

指向回收函数的指针,窗口程序处理完消息后调用该回调函数。参见SendAsyncProc可得到合适的回调函数的信息。如果hwnd为HWND_BROADCAST,系统为每个顶层窗口调用一次SendASyncProc回调函数。

dwData:

一个应用程序定义的值,被传给由参数IPResultCallBack指向的回调函数。

返回值:

如果函数调用成功,返回非零值。如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。

备注:

如果发送一个低于WM_USER范围的消息给异步消息函数(PostMessage,SendNotifyMesssge;SendMessageCallback),消息参数不能包含指针。否则,操作将会失败。函数将在接收线程处理消息之前返回,发送者将在内存被使用之前释放。

需要以HWND_BROADCAST方式通信的应用程序应当用函数RegisterWindwosMessage来获得应用程序间通信的独特的消息。

此回调函数仅当调用SendMessagecallback的线程调用GetMessage,PeekMessage或WaitMessage时调用。

 

SendMessageTimeout函数

函数功能:

该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,并且,如果指定的窗口属于不同的线程,直到窗口程序处理完消息或指定的超时周期结束函数才返回。如果接收消息的窗口和当前线程属于同一个队列,窗口程序立即调用,超时值无用。

    函数原型:

LRESULT SendMessageTimeout(HWND hwnd,UINT Msg,WPARAM wParam,LPARAM IParam,UINT fuFlags,UIUT uTimeout,LPDWORD lpdwResultult);

参数:

hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口。

Msg:指定被发送的消息。

wParam:指定附加的消息指定信息。IParam:指定附加的消息指定信息。

fuFlags;指定如何发送消息。此参数可为下列值的组合:

SMTO_ABORTIFHUNG:如果接收进程处于“hung”状态,不等待超时周期结束就返回。

SMTO_BLOCK:阻止调用线程处理其他任何请求,直到函数返回。

SMTO_NORMAL:调用线程等待函数返回时,不被阻止处理其他请求。

SMTO_NOTIMEOUTIFNOTHUNG:Windows 95及更高版本:如果接收线程没被挂起,当超时周期结束时不返回。

uTimeout:为超时周期指定以毫秒为单位的持续时间。如果该消息是一个广播消息,每个窗口可使用全超时周期。例如,如果指定5秒的超时周期,有3个顶层窗回未能处理消息,可以有最多15秒的延迟。

IpdwResult:指定消息处理的结果,依赖于所发送的消息。

返回值:

如果函数调用成功,返回非零值。如果函数调用失败,或超时,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。如果GetLastError返回零,表明函数超时。如果使用HWND_BROADCAST,SenddMessaggTimeout不提供单个窗口超时信息。

 

SendNotifyMessage函数

函数功能:

该函数将指定的消息发送到一个窗口。如果该窗口是由调用线程创建的;此函数为该窗口调用窗口程序,并等待窗口程序处理完消息后再返回。如果该窗口是由不同的线程创建的,此函数将消息传给该窗口程序,并立即返回,不等待窗口程序处理完消息。

函数原型:

BOOL SendNotifyMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);

参数:

hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。

Msg:指定被发送的消息。

wParam:指定附加的消息指定信息。

IParam:指定附加的消息指定信息。

返回值:如果函数调用成功,返回非零值;如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。

备注:

如果发送一个低于WM_USER范围的消息给异步消息函数(PostMessage,SendNotifyMessage,SendMesssgeCallback),消息参数不能包含指针。否则,操作将会失败。函数将在接收线程处理消息之前返回,发送者将在内存被使用之前释放。

需要以HWND_BROADCAST方式通信的应用程序应当用函数RegisterWindwosMessage来获得应用程序间通信的独特的消息。

 

消息列表

  #define WM_NULL 0x0000

  #define WM_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

  #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

  #define WM_QUERYOPEN 0x0013

  #define WM_ENDSESSION 0x0016

#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

  #define WM_QUEUESYNC 0x0023

  #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

  #define WM_MEASUREITEM 0x002C

  #define WM_DELETEITEM 0x002D

  #define WM_VKEYTOITEM 0x002E

  #define WM_CHARTOITEM 0x002F

  #define WM_SETFONT 0x0030

  #define WM_GETFONT 0x0031

  #define WM_SETHOTKEY 0x0032

  #define WM_GETHOTKEY 0x0033

  #define WM_QUERYDRAGICON 0x0037

#define WM_COMPAREITEM 0x0039

 

  #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

  #define WM_WINDOWPOSCHANGED 0x0047

  #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

  #define WM_HELP 0x0053

  #define WM_USERCHANGED 0x0054

  #define WM_NOTIFYFORMAT 0x0055

  #define NFR_ANSI 1

  #define NFR_UNICODE 2

  #define NF_QUERY 3

  #define NF_REQUERY 4

  #define WM_CONTEXTMENU 0x007B

  #define WM_STYLECHANGING 0x007C

  #define WM_STYLECHANGED 0x007D

  #define WM_DISPLAYCHANGE 0x007E

  #define WM_GETICON 0x007F

  #define WM_SETICON 0x0080

#endif /* WINVER >= 0x0400 */

  #define WM_NCCREATE 0x0081

  #define WM_NCDESTROY 0x0082

  #define WM_NCCALCSIZE 0x0083

  #define WM_NCHITTEST 0x0084

  #define WM_NCPAINT 0x0085

  #define WM_NCACTIVATE 0x0086

#define WM_GETDLGCODE 0x0087

 

  #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

 

  #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

  #define WM_DEADCHAR 0x0103

  #define WM_SYSKEYDOWN 0x0104

  #define WM_SYSKEYUP 0x0105

  #define WM_SYSCHAR 0x0106

#define WM_SYSDEADCHAR 0x0107

 

  #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

  #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

  #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

#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 使用的参数