SendMessage 窗口函数

函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。

MSDN:http://msdn.microsoft.com/en-us/library/windows/desktop/ms644950(v=vs.85).aspx

LRESULT WINAPI SendMessage(
_In_ HWND hWnd,
_In_ UINT Msg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);

参数:
hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
Msg:指定被发送的消息。系统消息列表.http://msdn.microsoft.com/en-us/library/windows/desktop/ms644927(v=vs.85).aspx#system_defined
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。

系统消息列表:

Windows系统定义的消息类别

Prefix前缀 Message category 消息类别 Documentation 参考资料
ABM and ABN Application desktop toolbar Shell Messages and Notifications
ACM and ACN Animation control Animation Control Messages and Animation Control Notifications
BCMBCNBM, and BN Button control Button Control Messages and Button Control Notifications
CB and CBN ComboBox control ComboBox Control Messages and ComboBox Control Notifications
CBEM andCBEN ComboBoxEx control ComboBoxEx Messages and ComboBoxEx Notifications
CCM General control Control Messages
CDM Common dialog box Common Dialog Box Messages
DFM Default context menu Shell Messages and Notifications
DL Drag list box Drag List Box Notifications
DM Default push button control Dialog Box Messages
DTM and DTN Date and time picker control Date and Time Picker Messages and Date and Time Picker Notifications
EM and EN Edit control Edit Control MessagesEdit Control NotificationsRich Edit Messages, and Rich Edit Notifications
HDM and HDN Header control Header Control Messages and Header Control Notifications
HKM Hot key control Hot Key Control Messages
IPM and IPN IP address control IP Address Messages and IP Address Notifications
LB and LBN List box control List Box Messages and List Box Notifications
LM SysLink control SysLink Control Messages
LVM and LVN List view control List View Messages and List View Notifications
MCM and MCN Month calendar control Month Calendar Messages and Month Calendar Notifications
PBM Progress bar Progress Bar Messages
PGM and PGN Pager control Pager Control Messages and Pager Control Notifications
PSM and PSN Property sheet Property Sheet Messages and Property Sheet Notifications
RB and RBN Rebar control Rebar Control Messages and Rebar Control Notifications
SB and SBN Status bar window Status Bar Messages and Status Bar Notifications
SBM Scroll bar control Scroll Bar Messages
SMC Shell menu Shell Messages and Notifications
STM and STN Static control Static Control Messages and Static Control Notifications
TB and TBN Toolbar Toolbar Control Messages and Toolbar Control Notifications
TBM and TRBN Trackbar control Trackbar Control Messages and Trackbar Control Notifications
TCM and TCN Tab control Tab Control Messages and Tab Control Notifications
TDM and TDN Task dialog Task Dialog Messages and Task Dialog Notifications
TTM and TTN Tooltip control Tooltip Control Messages and Tooltip Control Notifications
TVM and TVN

Tree-view control

Tree View Messages and Tree View Notifications
UDM and UDN

Up-down control

控件消息

Up-Down Messages and Up-Down Notifications
WM

General

普通窗口消息

Clipboard Messages
Clipboard Notifications
Common Dialog Box Notifications
Cursor Notifications
Data Copy Message
Desktop Window Manager Messages
Device Management Messages
Dialog Box Notifications
Dynamic Data Exchange Messages
Dynamic Data Exchange Notifications
Hook Notifications
Keyboard Accelerator Messages
Keyboard Accelerator Notifications
Keyboard Input Messages
Keyboard Input Notifications
Menu Notifications
Mouse Input Notifications
Multiple Document Interface Messages
Raw Input Notifications
Scroll Bar Notifications
Timer Notifications
Window Messages
Window Notifications

ABM 应用桌面工具栏消息
BM 按钮控件消息
CB 组合框控件消息
CBEM 扩展组合框控件消息
CDM 通用对话框消息
DBT 设备消息
DL 拖曳列表框控件消息
DM 默认按钮控件消息
DTM 日期时间选取控件消息
EM 编辑控件消息
HDM 头控件消息
HKM 热键控件消息
IPM IP地址控件消息
LB 列表框控件消息
LVM 列表视图控件消息
MCM 月历控件消息
PBM 进度条控件消息
PGM Pager控件消息
PSM 属性页面消息
RB Rebar 控件消息
SB 状态栏窗口消息
SBM 滚动条控件消息
STM 静态控件消息
TB 工具栏消息
TBM 跟踪条控件消息
TCM Tab 控件消息
TTM Tooltip控件消息
TVM 树形控件消息
UDM Up-down 控件消息
WM 普通窗口消息

http://blog.csdn.net/a199228/article/details/6627778

wMsg
WM_CREATE 创建一个窗口
WM_DESTROY 当一个窗口被破坏时发送
WM_MOVE 移动一个窗口
WM_SIZE 改变一个窗口的大小
WM_ACTIVATE 一个窗口被激活或失去激活状态
WM_SETFOCUS 一个窗口获得焦点
WM_KILLFOCUS 一个窗口失去焦点
WM_ENABLE 一个窗口改变成Enable状态
WM_SETREDRAW 设置窗口是否能重画
WM_SETTEXT 应用程序发送此消息来设置一个窗口的文本
WM_GETTEXT 应用程序发送此消息来复制对应窗口的文本到缓冲区
WM_GETTEXTLENGTH 得到与一个窗口有关的文本的长度(不包含空字符)
WM_PAINT 要求一个窗口重画自己
WM_CLOSE 当一个窗口或应用程序要关闭时发送一个信号
WM_QUERYENDSESSION 当用户选择结束对话框或程序自己调用ExitWindows函数
WM_QUIT 用来结束程序运行
WM_QUERYOPEN 当用户窗口恢复以前的大小位置时,把此消息发送给某个图标
WM_ERASEBKGND 当窗口背景必须被擦除时(例在窗口改变大小时)
WM_SYSCOLORCHANGE 当系统颜色改变时,发送此消息给所有*窗口
WM_ENDSESSION 当系统进程发出 WM_QUERYENDSESSION消息后,此消息发送给应用程序,通知它对话是否结束
WM_SHOWWINDOW 当隐藏或显示窗口是发送此消息给这个窗口
WM_ACTIVATEAPP 发此消息给应用程序哪个窗口是激活的,哪个是非激活的
WM_FONTCHANGE 当系统的字体资源库变化时发送此消息给所有*窗口
WM_TIMECHANGE 当系统的时间变化时发送此消息给所有*窗口
WM_CANCELMODE 发送此消息来取消某种正在进行的摸态(操作)
WM_SETCURSOR 如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口
WM_MOUSEACTIVATE 当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口
WM_CHILDACTIVATE 发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小
WM_QUEUESYNC 此消息由基于计算机的训练程序发送,通过WH_JOURNALPALYBACK的hook程序分离出用户输入消息
WM_GETMINMAXINFO 此消息发送给窗口当它将要改变大小或位置
WM_PAINTICON 发送给最小化窗口当它图标将要被重画
WM_ICONERASEBKGND 此消息发送给某个最小化窗口,仅当它在画图标前它的背景必须被重画
WM_NEXTDLGCTL 发送此消息给一个对话框程序去更改焦点位置
WM_SPOOLERSTATUS 每当打印管理列队增加或减少一条作业时发出此消息
WM_DRAWITEM 当button,combobox,listbox,menu的可视外观改变时发送
WM_MEASUREITEM 当button, combo box, list box, list view control, or menu item 被创建时
WM_VKEYTOITEM 此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息
WM_CHARTOITEM 此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息
WM_SETFONT 当绘制文本时程序发送此消息得到控件要用的颜色
WM_GETFONT 应用程序发送此消息得到当前控件绘制文本的字体
WM_SETHOTKEY 应用程序发送此消息让一个窗口与一个热键相关连
WM_GETHOTKEY 应用程序发送此消息来判断热键与某个窗口是否有关联
WM_QUERYDRAGICON 此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序能返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标
WM_COMPAREITEM 发送此消息来判定combobox或listbox新增加的项的相对位置
WM_COMPACTING 显示内存已经很少了
WM_WINDOWPOSCHANGING 发送此消息给那个窗口的大小和位置将要被改变时,来调用setwindowpos函数或其它窗口管理函数
WM_WINDOWPOSCHANGED 发送此消息给那个窗口的大小和位置已经被改变时,来调用setwindowpos函数或其它窗口管理函数
WM_POWER 当系统将要进入暂停状态时发送此消息
WM_COPYDATA 当一个应用程序传递数据给另一个应用程序时发送此消息
WM_CANCELJOURNA 当某个用户取消程序日志激活状态,提交此消息给程序
WM_NOTIFY 当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口
WM_INPUTLANGCHANGEREQUEST 当用户选择某种输入语言,或输入语言的热键改变
WM_INPUTLANGCHANGE 当平台现场已经被改变后发送此消息给受影响的最*窗口
WM_TCARD 当程序已经初始化windows帮助例程时发送此消息给应用程序
WM_HELP 此消息显示用户按下了F1,如果某个菜单是激活的,就发送此消息个此窗口关联的菜单,否则就发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口
WM_USERCHANGED 当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体设置信息,在用户更新设置时系统马上发送此消息
WM_NOTIFYformAT 公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICODE结构
WM_CONTEXTMENU 当用户某个窗口中点击了一下右键就发送此消息给这个窗口
WM_styleCHANGING 当调用SETWINDOWLONG函数将要改变一个或多个 窗口的风格时发送此消息给那个窗口
WM_styleCHANGED 当调用SETWINDOWLONG函数一个或多个 窗口的风格后发送此消息给那个窗口
WM_DISPLAYCHANGE 当显示器的分辨率改变后发送此消息给所有的窗口
WM_GETICON 此消息发送给某个窗口来返回与某个窗口有关连的大图标或小图标的句柄
WM_SETICON 程序发送此消息让一个新的大图标或小图标与某个窗口关联
WM_NCCREATE 当某个窗口第一次被创建时,此消息在WM_CREATE消息发送前发送
WM_NCDESTROY 此消息通知某个窗口,非客户区正在销毁
WM_NCCALCSIZE 当某个窗口的客户区域必须被核算时发送此消息
WM_NCHITTEST 移动鼠标,按住或释放鼠标时发生
WM_NCPAINT 程序发送此消息给某个窗口当它(窗口)的框架必须被绘制时
WM_NCACTIVATE 此消息发送给某个窗口仅当它的非客户区需要被改变来显示是激活还是非激活状态
WM_GETDLGCODE 发送此消息给某个与对话框程序关联的控件,widdows控制方位键和TAB键使输入进入此控件通过应
WM_NCMOUSEMOVE 当光标在一个窗口的非客户区内移动时发送此消息给这个窗口 非客户区为:窗体的标题栏及窗 的边框体
WM_NCLBUTTONDOWN 当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息
WM_NCLBUTTONUP 当用户释放鼠标左键同时光标某个窗口在非客户区十发送此消息
WM_NCLBUTTONDBLCLK 当用户双击鼠标左键同时光标某个窗口在非客户区十发送此消息
WM_NCRBUTTONDOWN 当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息
WM_NCRBUTTONUP 当用户释放鼠标右键同时光标又在窗口的非客户区时发送此消息
WM_NCRBUTTONDBLCLK 当用户双击鼠标右键同时光标某个窗口在非客户区十发送此消息
WM_NCMBUTTONDOWN 当用户按下鼠标中键同时光标又在窗口的非客户区时发送此消息
WM_NCMBUTTONUP 当用户释放鼠标中键同时光标又在窗口的非客户区时发送此消息
WM_NCMBUTTONDBLCLK 当用户双击鼠标中键同时光标又在窗口的非客户区时发送此消息
WM_KEYFIRST WM_KEYDOWN 按下一个键
WM_KEYUP 释放一个键
WM_CHAR 按下某键,并已发出WM_KEYDOWN, WM_KEYUP消息
WM_DEADCHAR 当用translatemessage函数翻译
WM_KEYUP消息时发送此消息给拥有焦点的窗口
WM_SYSKEYDOWN 当用户按住ALT键同时按下其它键时提交此消息给拥有焦点的窗口
WM_SYSKEYUP 当用户释放一个键同时ALT 键还按着时提交此消息给拥有焦点的窗口
WM_SYSCHAR 当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后提交此消息给拥有焦点的窗口
WM_SYSDEADCHAR 当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后发送此消息给拥有焦点的窗口
WM_INITDIALOG 在一个对话框程序被显示前发送此消息给它,通常用此消息初始化控件和执行其它任务
WM_COMMAND 当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译
WM_SYSCOMMAND 当用户选择窗口菜单的一条命令或当用户选择最大化或最小化时那个窗口会收到此消息
WM_TIMER 发生了定时器事件
WM_HSCROLL 当一个窗口标准水平滚动条产生一个滚动事件时发送此消息给那个窗口,也发送给拥有它的控件
WM_VSCROLL 当一个窗口标准垂直滚动条产生一个滚动事件时发送此消息给那个窗口也,发送给拥有它的控件
WM_INITMENU 当一个菜单将要被激活时发送此消息,它发生在用户菜单条中的某项或按下某个菜单键,它允许程序在显示前更改菜单
WM_INITMENUPOPUP 当一个下拉菜单或子菜单将要被激活时发送此消息,它允许程序在它显示前更改菜单,而不要改变全部
WM_MENUSELECT 当用户选择一条菜单项时发送此消息给菜单的所有者(一般是窗口)
WM_MENUCHAR 当菜单已被激活用户按下了某个键(不同于加速键),发送此消息给菜单的所有者
WM_ENTERIDLE 当一个模态对话框或菜单进入空载状态时发送此消息给它的所有者,一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等待
WM_CTLCOLORMSGBOX 在windows绘制消息框前发送此消息给消息框的所有者窗口,通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色
WM_CTLCOLOREDIT 当一个编辑型控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色
WM_CTLCOLORLISTBOX 当一个列表框控件将要被绘制前发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置列表框的文本和背景颜色
WM_CTLCOLORBTN 当一个按钮控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置按纽的文本和背景颜色
WM_CTLCOLORDLG 当一个对话框控件将要被绘制前发送此消息给它的父窗口,通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置对话框的文本背景颜色
WM_CTLCOLORSCROLLBAR 当一个滚动条控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置滚动条的背景颜色
WM_CTLCOLORSTATIC 当一个静态控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以 通过使用给定的相关显示设备的句柄来设置静态控件的文本和背景颜色
WM_MOUSEFIRST WM_MOUSEMOVE 移动鼠标
WM_LBUTTONDOWN 按下鼠标左键
WM_LBUTTONUP 释放鼠标左键
WM_LBUTTONDBLCLK 双击鼠标左键
WM_RBUTTONDOWN 按下鼠标右键
WM_RBUTTONUP 释放鼠标右键
WM_RBUTTONDBLCLK 双击鼠标右键
WM_MBUTTONDOWN 按下鼠标中键
WM_MBUTTONUP 释放鼠标中键
WM_MBUTTONDBLCLK 双击鼠标中键
WM_MOUSEWHEEL 当鼠标*转动时发送此消息个当前有焦点的控件
WM_PARENTNOTIFY 当MDI子窗口被创建或被销毁,或用户按了一下鼠标键而光标在子窗口上时发送此消息给它的父窗口
WM_ENTERMENULOOP 发送此消息通知应用程序的主窗口that已经进入了菜单循环模式
WM_EXITMENULOOP 发送此消息通知应用程序的主窗口that已退出了菜单循环模式
WM_SIZING 当用户正在调整窗口大小时发送此消息给窗口 通过此消息应用程序可以监视窗口大小和位置也可以修改他们
WM_CAPTURECHANGED 发送此消息 给窗口当它失去捕获的鼠标时
WM_MOVING 当用户在移动窗口时发送此消息,通过此消息应用程序可以监视窗口大小和位置也可以修改他们
WM_POWERBROADCAST 此消息发送给应用程序来通

知它有关电源管理事件
WM_DEVICECHANGE 当设备的硬件配置改变时发送此消息给应用程序或设备驱动程序
WM_MDIDESTROY 应用程序发送此消息给多文档的客户窗口来关闭一个MDI 子窗口
WM_MDIACTIVATE 应用程序发送此消息给多文档的客户窗口通知客户窗口激活另一个MDI子窗口,当客户窗口收到此消息后,它发出WM_MDIACTIVE消息给MDI子窗口(未激活)激活它
WM_MDIRESTORE 程序 发送此消息给MDI客户窗口让子窗口从最大最小化恢复到原来大小
WM_MDINEXT 程序 发送此消息给MDI客户窗口激活下一个或前一个窗口
WM_MDIMAXIMIZE 程序发送此消息给MDI客户窗口来最大化一个MDI子窗口
WM_MDITILE 程序 发送此消息给MDI客户窗口以平铺方式重新排列所有MDI子窗口
WM_MDICASCADE 程序 发送此消息给MDI客户窗口以层叠方式重新排列所有MDI子窗口
WM_MDIICONARRANGE 程序 发送此消息给MDI客户窗口重新排列所有最小化的MDI子窗口
WM_MDIGETACTIVE 程序 发送此消息给MDI客户窗口来找到激活的子窗口的句柄
WM_MDISETMENU 程序 发送此消息给MDI客户窗口用MDI菜单代替子窗口的菜单
WM_CUT 程序发送此消息给一个编辑框或combobox来删除当前选择的文本
WM_COPY 程序发送此消息给一个编辑框或combobox来复制当前选择的文本到剪贴板
WM_PASTE 程序发送此消息给editcontrol或combobox从剪贴板中得到数据
WM_CLEAR 程序发送此消息给editcontrol或combobox清除当前选择的内容
WM_UNDO 程序发送此消息给editcontrol或combobox撤消最后一次操作
WM_DESTROYCLIPBOARD 当调用ENPTYCLIPBOARD函数时 发送此消息给剪贴板的所有者
WM_DRAWCLIPBOARD 当剪贴板的内容变化时发送此消息给剪贴板观察链的第一个窗口 它允许用剪贴板观察窗口来显示剪贴板的新内容
WM_PAINTCLIPBOARD 当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区需要重画
WM_SIZECLIPBOARD 当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区域的大小已经改变是此消息通过剪贴板观察窗口发送给剪贴板的所有者
WM_ASKCBformATNAME 通过剪贴板观察窗口发送此消息给剪贴板的所有者来请求一个CF_OWNERDISPLAY格式的剪贴板的名字
WM_CHANGECBCHAIN 当一个窗口从剪贴板观察链中移去时发送此消息给剪贴板观察链的第一个窗口
WM_HSCROLLCLIPBOARD 此消息通过一个剪贴板观察窗口发送给剪贴板的所有者 它发生在当剪贴板包含CFOWNERDISPALY格式的数据并且有个事件在剪贴板观察窗的水平滚动条上 所有者应滚动剪贴板图象并更新滚动条的值
WM_QUERYNEWPALETTE 此消息发送给将要收到焦点的窗口,此消息能使窗口在收到焦点时同时有机会实现他的逻辑调色板
WM_PALETTEISCHANGING 当一个应用程序正要实现它的逻辑调色板时发此消息通知所有的应用程序
WM_PALETTECHANGED 此消息在一个拥有焦点的窗口实现它的逻辑调色板后发送此消息给所有*并重叠的窗口,以此来改变系统调色板
WM_HOTKEY 当用户按下由REGISTERHOTKEY函数注册的热键时提交此消息
WM_PRINT 应用程序发送此消息仅当WINDOWS或其它应用程序发出一个请求要求绘制一个应用程序的一部分

Buttons

BM_CLICK button被点击 消息

BM_GETCHECK 用于check boxes 或radio boxes 。查看 是否 checked 了。

BM_GETSTATE 发送此消息,可返回 button 的状态,如 是否被 checked;是否 可用(不可用就 变灰了)

BM_SETCHECK 如果 已经 checked 了,发送此消息后,变为 unchecked,就是 那个钩钩 没被 选上。ok?

BM_SETSTATE 设置 button被 点击 状态。

====================

Combo Boxes

CB_ADDSTRING 添加 字符串到 Combo Boxes 。

CB_DELETESTRING 删除 Combo Boxes 中的 条目,既 item

CB_GETCOUNT 得到 Combo Boxes 条目 item 的 数目

CB_GETCURSEL 返回 Combo Boxes 中被选 条目 在 Combo Boxes 中 的位置,第一条为0 。

如果 没有 条目或出错,则返回 -1

CB_GETDROPPEDSTATE 发送此消息,可判断 Combo Boxes 的list box 是否被 放下,如果 是,返回 非零值,不是,则 返回 0

CB_GETLBTEXT 得到 combo box 的 条目 的text。 返回值 是 这个text 的长度。

CB_GETLBTEXTLEN 返回值 是 条目的 text 的长度。

CB_INSERTSTRING 插入 字符串 条目到 combo box 中

CB_RESETCONTENT 清空 combo box 所有条目

CB_SETCURSEL 设置 combo box 被选 条目。

CB_SHOWDROPDOWN 让 combo box 的listbox 下拉。 既 显出 所有 条目

===================

Edit Controls

EM_CANUNDO 决定 上一次操作 是否可以 undo (撤消操作)。如果可以,则可发送 EM_undo

EM_GETFIRSTVISIBLELINE 在 multi-line 控件中,找到 最上层的 可见的 行号。次行号是相对于 所有行的。

EM_GETPASSWORDCHAR 返回 密码框的 字符集。既 是查看密码。

EM_GETSEL 返回在 可编辑 控件中 ,被选择(HIGHLIGHT高量选择)的字符集 的 起点 和终点的 位置。

用 sendmessage 的wParam 参数 返回 起点位置,lParam 返回 终点位置

EM_REPLACESEL 用不同的字符串 替换 可编辑 控件 中的 字符串,如果 可编辑 控件中 没有 字符串,则 此消息变为 添加 字符串

EM_SETPASSWORDCHAR 在可编辑 控件中 设置 密码字符集 ,既 用* 代替

EM_UNDO 发送 操作 撤消 消息。

======================

IP Address Control

===================

IPM_CLEARADDRESS 清除 IP 地址控件(IP Address control)的内容

IPM_GETADDRESS 从IP 地址控件 获得 存储在 它中的 IP 地址 信息/

IPM_ISBLANK 决定 IP 地址控件 是否可以为 空值。既 127.0.0.1 之类的地址 为 空。

IPM_SETADDRESS 在 IP 地址控件中设置 IP 地址。

IPM_SETFOCUS 在 IP 地址控件中,当需要输入 IP 地址时, 使之获得 键盘输入 焦点

IPM_SETRANGE 设置 输入IP 地址的有效范围

=====================

Media Control Interface (MCI)

=============================

MM_MCINOTIFY 告诉 窗体 MCI 命令 完成的状态. 这个 状态包括 success, failure, 或 其它事件

Menus

=============================

WM_COMMAND 当 用户 选择 菜单中的 项目后,将向 窗体 发送此消息. 窗体 受到 此消息后,再 决定 下一个 行为

WM_INITMENU 当 菜单 准备 显示 前,向 窗体发送 此消息, 窗体 将 初始化 菜单 项.

WM_SYSCOMMAND 向 窗体 发送 用户点击 系统菜单 消息. 窗体将 响应 这个消息 ,决定 下个 行为.

================

Windows

=====================

WM_CLOSE 发送 让窗体关闭的消息,有些窗体会 在此时 弹出个 关闭对话框。

WM_GETTEXT 返回 窗体 标题栏 (caption 属性)。 需要先 用WM_GETTEXTLENGTH 获得 字符串长度

WM_GETTEXTLENGTH 见上!

WM_HELP 发送此 消息后,将 显示 指定的 HELP 文件

WM_SETTEXT 设置 窗体 标题栏 。

==============================

List Boxes

===============

LB_ADDSTRING 在条目中添加 字符串

LB_DELETESTRING 删除一个 条目. 条目 序号是从 0 开始的.

LB_GETCOUNT 得到 条目总数.

LB_GETCURSEL 得到 单选 的list box 的 选项条目的 序号

LB_GETSEL 判断 list 的 条目 是否被选上, 如果 选上了,则返回 >0 的值.否则 返回 0 ,表示 用户没选择条目

LB_GETSELCOUNT 获得 可多选 的list , 被用户选择的条目的个数.

LB_GETSELITEMS 返回 可多选的list 的 被选条目的 序号. 可返回 数组.

LB_GETTEXT 得到 list中的 一个 条目的 text 值

LB_GETTEXTLEN 得到 list中的 一个 条目的 text 值的长度

LB_INSERTSTRING 在list 中,插入 一个条目。如果成功,将返回 插入后,此条目的序号。

LB_RESETCONTENT 清空 所有的 list 中的 条目。

LB_SETCURSEL 对单选 的list box, 设定 用户 选择条目的 具体值

LB_SETSEL 对多选 的list box, 设定 用户 选择条目的 具体值

=======================================================

Mouse

==================

WM_LBUTTONDBLCLK 当鼠标在一个窗体范围内时,告诉此窗体 鼠标左键 已双击 。返回值 0

WM_LBUTTONDOWN 当鼠标在一个窗体范围内时,告诉此窗体 鼠标左键 已点击,返回值 0

WM_LBUTTONUP 当鼠标在一个窗体范围内时,告诉此窗体 鼠标左键 已释放,返回值 0

WM_MBUTTONDBLCLK 当鼠标在一个窗体范围内时,告诉此窗体 鼠标中键 已双击 。返回值 0

WM_MBUTTONDOWN 当鼠标在一个窗体范围内时,告诉此窗体 鼠标中键 已点击,返回值 0

WM_MBUTTONUP 当鼠标在一个窗体范围内时,告诉此窗体 鼠标中键 已释放,返回值 0

SendMessage用例

SendMessage(hWnd,WM_SETFOCUS,0,0);
SendMessage(hWnd,WM_ACTIVATE,1,0);

SendMessage(hWnd,WM_KEYDOWN,VK_TAB,0x000f0001);
SendMessage(hWnd,WM_CHAR,VK_TAB,0x000f0001);
SendMessage(hWnd,WM_KEYUP,VK_TAB,0xc00f0001);
SendMessage(hWnd,WM_KEYDOWN,VK_TAB,0x000f0001);
SendMessage(hWnd,WM_CHAR,VK_TAB,0x000f0001);
SendMessage(hWnd,WM_KEYUP,VK_TAB,0xc00f0001);
SendMessage(hWnd,WM_KEYDOWN,VK_TAB,0x000f0001);
SendMessage(hWnd,WM_CHAR,VK_TAB,0x000f0001);
SendMessage(hWnd,WM_KEYUP,VK_TAB,0xc00f0001);
SendMessage(hWnd,WM_KEYDOWN,VK_RETURN,0x001c0001);
SendMessage(hWnd,WM_CHAR,VK_RETURN,0x001c0001);
SendMessage(HWND, WM_SYSCOMMAND, SC_MAXIMIZE, ByVal 0&) '最大化

SendMessage HWND, WM_SHOWWINDOW, SW_HIDE, vbNull '隐藏窗体
SendMessage HWND, WM_SHOWWINDOW, SW_NORMAL, vbNull '显示窗体

SendMessage(HWND, CB_SHOWDROPDOWN, -1, -1) '显示Combo1.hwnd下拉列表

SendMessage (Combo1.hWnd, CB_SHOWDROPDOWN, 0, 0 ) '不下拉

SendMessage(HWND, WM_SYSCOMMAND, SC_CLOSE, ByVal 0&) '关闭
SendMessage(HWND, WM_SYSCOMMAND, SC_MINIMIZE, ByVal 0&) '最小化
SendMessage(HWND, WM_PASTE, 0, 0) '粘贴
SendMessage(HWND, WM_COPY, 0, 0) '复制
SendMessage(HWND, WM_UNDO, 0, 0) '撤消
SendMessage(HWND, WM_SETTEXT, 0, ByVal new_caption) 'f发文本信息
SendMessage(HWND, WM_KEYDOWN, Asc("b"), 0&) '发送按键 只能用于 控件 不能用与整个窗体或进程
SendMessage(HWND, WM_LBUTTONDOWN, MK_LBUTTON, ByVal &H10001) '鼠标模拟
WindowFromPoint(Cursor.x, Cursor.y) '获得鼠标当前句柄
GetPixel(dc, Cursor.x, Cursor.y) '获取鼠标点颜色
SendMessage(HWND, WM_CUT, 0, 0) '剪切 但单击按钮会使其失去焦点 这里不做演示

获得光标位置和字符个数.
Cpos = SendMessage(Text1.hwnd, 187, -1, 0) '光标所在行的首字符在文本中的位置
Lpos = SendMessage(Text1.hwnd, 201, Cpos, 0) '光标所在的行号
Line = SendMessage(Text1.hwnd, 193, Cpos, 0) '这行的字符数.
SendMessage (Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0 )'关闭显示器.
SendMessage Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1 ')打开显示器
SendMessage(mText.hwnd, EM_GETRECT, 0, rc) '获得窗口区域的边界

SendMessage hWnd, WM_KEYDOWN, VK_CONTROL, ByVal 0& )
SendMessage hWnd, WM_KEYDOWN, VK_X, ByVal 0&)
SendMessage hWnd, WM_KEYUP, VK_X, ByVal 0& )
SendMessage hWnd, WM_KEYUP, VK_CONTROL, ByVal 0&)

Windows消息机制要点:

一、 引言

二、Windows消息机制的概念

1、DOS与Windows驱动机制的区别

2、消息

3、消息的来源

4、Windows的消息系统的组成

5、消息的响应

三、Windows消息机制要点

1. 窗口过程

2 消息类型

3消息队列(Message Queues)

4 队列消息和非队列消息

5 Windows消息函数

6消息死锁( Message Deadlocks

7 BroadcastSystemMessage

四、MFC消息机制

1.MFC框架下,接收处理来自Windows消息的过程

2.MFC内部消息处理方式

一、 引言

在 C++程序架构 一文中,我们看到,程序是由一些层次和模块组成的,那么,这些模块之间, 以及你的程序和windows 之间,是如何传递信息呢?在windows 的平台上,传递信息是由 windows message 消息机制来负责的,这是Windows 的核心部分。

消息包括数据和指令。

二、Windows消息机制的概念

1、DOS与Windows驱动机制的区别

1)DOS是过程驱动的。

传统的MS-DOS程序主要采用顺序的。关联的、过程驱动的程序设计方法。一个过程是一系列预先定义好的操作序列的组合,它具有一定的开头、中间过程和结束。程序直接控制程序事件和过程的顺序。这样的程序设计方法是面向程序而不是面向用户的,交互性差,用户界面不够友好,因为它强迫用户按照某种不可更改的模式进行工作。它的基本模型如图1.1所示。

2)Windows是事件(消息)驱动

事件驱动程序设计是一种全新的程序设计方法,它不是由事件的顺序来控制,而是由事件的发生来控制,而这种事件的发生是随机的、不确定的,并没有预定的顺序,这样就允许程序的的用户用各种合理的顺序来安排程序的流程。对于需要用户交互的应用程序来说,事件驱动的程序设计有着过程驱动方法无法替代的优点。它是一种面向用户的程序设计方法,它在程序设计过程中除了完成所需功能之外,更多的考虑了用户可能的各种输入,并针对性的设计相应的处理程序。它是一种“被动”式程序设计方法,程序开始运行时,处于等待用户输入事件状态,然后取得事件并作出相应反应,处理完毕又返回并处于等待事件状态。它的框图如图1.2所示:

2、消息

Windows系统是一个事件驱动的OS,每一个事件的发生都会产生一个消息,我们通过消息来知道发生了什么事件,了解事件,进而解决事件。什么是消息呢?很难下一个定义,下面从不同的几个方面讲解一下:

1) 消息的组成:一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单转中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号,对菜单来讲就是菜单ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。

2)谁将收到消息:一个消息必须由一个窗口接收。在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。
3)未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。正因为有了这个默认窗口过程我们才可以利用Windows的窗口进行开发而不必过多关注窗口各种消息的处理。例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。

4)窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。

3、消息的来源

事件驱动围绕着消息的产生与处理展开,一条消息是关于发生的事件的消息。事件驱动是靠消息循环机制来实现的。也可以理解为消息是一种报告有关事件发生的通知。

Windows应用程序的消息来源有一下四种:

1)输入消息:包括键盘和鼠标的输入。这一类消息首先放在系统消息队列中,然后由Windows将它们送入应用程序消息队列中,由应用程序来处理消息。

2)控制消息:用来与Windows的控制对象,如列表框、按钮、检查框等进行双向通信。当用户在列表框中改动当前选择或改变了检查框的状态时发出此类消息。这类消息一般不经过应用程序消息队列,而是直接发送到控制对象上去。

3)系统消息:对程序化的事件或系统时钟中断作出反应。一些系统消息,象DDE消息(动态数据交换消息)要通过Windows的系统消息队列,而有的则不通过系统消息队列而直接送入应用程序的消息队列,如创建窗口消息。

4)用户消息:这是程序员自己定义并在应用程序中主动发出的,一般由应用程序的某一部分内部处理。

4、Windows的消息系统的组成

Windows的消息系统由以下3部分组成:

消息队列:Windows能够为所有的应用程序维护一个消息队列,应用程序必须从消息队列中获去消息,然后分派给某个窗体。

消息循环:通过这个循环机制,应用程序从消息队列中检索消息,再把它分派给适当的窗口,然后继续从消息队列中检索下一条消息,再分派给适当的窗口,依次进行。

窗口过程:每个窗口都有一个窗口过程,以接收Windows 传递给窗口的消息,窗口过程的任务就是获取消息并且响应它。窗口过程是一个回调函数,处理完一个消息后,通常要给Windows 一个返回值。

5、消息的响应

消息的产生来源于系统事情(包括计时器事件)和用户事情,Windows用消息来调入和关闭(还有其它处理,如绘制一个窗口等)应用程序,一个典型表现是在关机操作中,Windows发一个关机的消息给所有正在运行的应用程序,告知它们退出内存,此时,应用程序用回应消息的方法来响应OS,因此,消息是应用程序与WinOS交互的手段..

消息产生到被窗口响应的步骤:(如下图)

1> 系统发生了或用户发出某个事件。

2> Windows把这个事件翻译为消息,然后把他放到消息队列中

3> 应用程序从消息队列中接受到这个消息,把他存放到TMsg记录中。

4> 应用程序把消息传递给一个适当的窗体过程。

窗体过程响应这个消息并进行处理。把消息传递给了这个窗体的窗体函数。

三、Windows消息机制要点

1. 窗口过程

每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ID),和两个消息参数(wParam, lParam), 当窗口收到消息时系统就会调用此窗口过程来处理消息。(所以叫回调函数)

2 消息类型

1) 系统定义消息(System-Defined Messages)

在SDK中事先定义好的消息,非用户定义的,其范围在[0×0000, 0×03ff]之间, 可以分为以下三类:

窗口消息(Windows Message)

与窗口的内部运作有关,如创建窗口,绘制窗口,销毁窗口等。可以是一般的窗口,可以是 Dialog,控件等。

如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL..

命令消息(Command Message)

与处理用户请求有关, 如单击菜单项或工具栏或控件时, 就会产生命令消息。

WM_COMMAND, LOWORD(wParam)表示菜单项,工具栏按钮或控件的ID。如果是控件, HIWORD(wParam)表示控件消息类型

控件通知(Notify Message)

控件通知消息, 这是最灵活的消息格式, 其Message, wParam, lParam分别为:WM_NOTIFY, 控件ID,指向NMHDR的指针。NMHDR包含控件通知的内容, 可以任意扩展。

2) 程序定义消息(Application-Defined Messages)

用户自定义的消息, 对于其范围有如下规定:

WM_USER: 0×0400-0×7FFF (ex. WM_USER+10)

WM_APP(winver>4.0): 0×8000-0xBFFF (ex.WM_APP+4)

RegisterWindowMessage: 0xC000-0xFFFF

3消息队列(Message Queues)

Windows中有两种类型的消息队列

1) 系统消息队列(System Message Queue)

这是一个系统唯一的Queue,设备驱动(mouse, keyboard)会把操作输入转化成消息存在系统队列中,然后系统会把此消息放到目标窗口所在的线程的消息队列(thread-specific message queue)中等待处理

2) 线程消息队列(Thread-specific Message Queue)
每一个GUI线程都会维护这样一个线程消息队列。(这个队列只有在线程调用GDI函数时才会创建,默认不创建)。然后线程消息队列中的消息会被送到相应的窗口过程(WndProc)处理.

注意: 线程消息队列中WM_PAINT,WM_TIMER只有在Queue中没有其他消息的时候才会被处理,WM_PAINT消息还会被合并以提高效率。其他所有消息以先进先出(FIFO)的方式被处理。

4 队列消息(Queued Messages)和非队列消息(Non-Queued Messages)
1)队列消息(Queued Messages)

消息会先保存在消息队列中,消息循环会从此队列中取消息并分发到各窗口处理

如鼠标,键盘消息。

2) 非队列消息(NonQueued Messages)

消息会绕过系统消息队列和线程消息队列直接发送到窗口过程被处理

如: WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSOR, WM_WINDOWPOSCHANGED

注意: postMessage发送的消息是队列消息,它会把消息Post到消息队列中; SendMessage发送的消息是非队列消息, 被直接送到窗口过程处理

5 Windows消息函数

1)PostMessage(PostThreadMessage), SendMessage

PostMessage:把消息放到指定窗口所在的线程消息队列中后立即返回。 PostThreadMessage:把消息放到指定线程的消息队列中后立即返回。

SendMessage:直接把消息送到窗口过程处理, 处理完了才返回。

2)GetMessage, PeekMessage

PeekMessage会立即返回 可以保留消息

GetMessage在有消息时返回 会删除消息

3) TranslateMessage, TranslateAccelerator

TranslateMessage: 把一个virtual-key消息转化成字符消息(character message),并放到当前线程的消息队列中,消息循环下一次取出处理。

TranslateAccelerator: 将快捷键对应到相应的菜单命令。它会把WM_KEYDOWN 或 WM_SYSKEYDOWN转化成快捷键表中相应的WM_COMMAND 或WM_SYSCOMMAND消息, 然后把转化后的 WM_COMMAND或WM_SYSCOMMAND直接发送到窗口过程处理, 处理完后才会返回。

6消息死锁( Message Deadlocks

假设有线程A和B, 现在有以下下步骤

1) 线程A SendMessage给线程B, A等待消息在线程B中处理后返回

2)线程B收到了线程A发来的消息,并进行处理, 在处理过程中,B也向线程A SendMessgae,然后等待从A返回。

因为此时, 线程A正等待从线程B返回, 无法处理B发来的消息, 从而导致了\线程A,B相互等待, 形成死锁。多个线程也可以形成环形死锁。

可以使用 SendNotifyMessage或SendMessageTimeout来避免出现死锁。

7 BroadcastSystemMessage

我们一般所接触到的消息都是发送给窗口的, 其实, 消息的接收者可以是多种多样的,它可以是应用程序(applications), 可安装驱动(installable drivers), 网络设备(network drivers), 系统级设备驱动(system-level device drivers)等,

BroadcastSystemMessage这个API可以对以上系统组件发送消息。

那么这些消息是怎样传送的呢。我们以MFC为例来看一下消息传送过程。

四、MFC消息机制

在Windows应用程序的主函数中,首先要注册窗口类,然后创建并显示窗口。创建窗口后程序就进入消息循环,在消息循环中,程序不断地获得消息并将消息派送给对应的窗口函数进行处理。

我们可以看到,在MFC的框架结构下,可以进行消息处理的类的头文件里面
都会含有DECLARE_MESSAGE_MAP()宏,这里主要进行消息映射和消息处理函数的声
明。可以进行消息处理的类的实现文件里一般都含有如下的结构。

BEGIN_MESSAGE_MAP(CInheritClass, CBaseClass) //{{AFX_MSG_MAP(CInheritClass)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

这里主要进行消息映射的实现和消息处理函数的实现。

所有能够进行消息处理的类都是基于CCmdTarget类的,也就是说CCmdTarget
类是所有可以进行消息处理类的父类。CCmdTarget类是MFC处理命令消息的基础和核心。

同时MFC定义了下面的两个主要结构:
AFX_MSGMAP_ENTRY
struct AFX_MSGMAP_ENTRY
{//“““//

};

和AFX_MSGMAP

struct AFX_MSGMAP

{//“““`//
};

其中AFX_MSGMAP_ENTRY结构包含了一个消息的所有相关信息, 而AFX_MSGMAP主要作用是两个,一:用来得到基类的消息映射入口地址。二:得到本身的消息映射入口地址。

实际上,MFC把所有的消息一条条填入到AFX_MSGMAP_ENTRY结构中去,形成一个数组,该数组存放了所有的消息和与它们相关的消息的参数。同时通过AFX_MSGMAP能得到该数组的首地址,同时也得到基类的消息映射入口地址,这是为例当本身对该消息不响应的时候,就调用其基类的消息响应。

现在我们来分析MFC是如何让窗口过程来处理消息的,实际上所有MFC的窗口类都通过钩子函数_AfxCbtFilterHook截获消息,并且在钩子函数_AfxCbtFilterHook中把窗口过程设定为AfxWndProc。原来的窗口过程保存在成员变量m_pfnSuper中

1.MFC框架下,接收处理来自Windows消息的过程:

2.MFC内部消息处理方式

MFC接收一个寄送的消息:

MFC处理一个寄送和发送消息的惟一明显不同是寄送的消息要做应用程序的消息队列中花费一些时间。在消息泵(message pump)弹出它之前,它要一直在队列中。下面是怎样接受寄送消息的过程。MFC应用程序中的消息泵在CWinApp的成员函数Run()中。应用程序开始运行时,Run()就被调用,Run()把时间分割成两部分。一部分用来执行后台处理,如取消临时CWnd对象;另一部分用来检查消息队列。当一个新的消息进来时,Run()抽取它—即用GetMessage( )从队列中取出该消息,运行PreTranslateMessage( )和::TranslateMessage( )两个消息翻译函数,然后用DispatchMessage( )函数调用该消息预期的目标窗口进程。如下图。

我们用一个实例函数A发送消息到函数B的过程来看一下MFC内部消息处理过程。

1. 首先函数A应获取消息的CWnd类对象的指针,然后,调用CWnd的成员函数SendMessage()。

LRESULT Res=pWnd->SendMessage(UINT Msg, WPARAM wParam, LPARAM lParam);

pWnd指针指向目标CWnd类对象。变量Msg是消息,wParam和lParam变量包含消息的参数,如鼠标单单击哪里或选择了什么菜单项。目标窗口返回的消息结果放在变量Res中。

发送消息到一个没有CWnd的函数对象的窗口,可以用下列目标窗口的句柄直接调用Windows API:

LRESULT Res=::SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
这里的hWnd是目标窗口的句柄。

如果是异步传输也可使用PostMessage(),消息同上相同,但返回值Res不一样,Res不是一个由目标窗体返回的值,而是一个布尔值,用来表示消息是否成功的放到消息队列中。

2. 正常情况下,一旦消息被发送后,应用程序后台会自动的将它发送,但是在特殊情况下,需要你自己去删除一个消息,例如想在应用程序接收到某种消息之前停止应用程序。有两种方法可以从应用程序消息队列中删除一个消息,但这两种方法都没有涉及MFC。

第一种方法:在不干扰任何事情之下窥视消息队列,看看一个消息是否在那里。
BOOL res=::PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg ) ;
第二种方法:实际上是等待,一直等到一个新的消息到达队列为止,然后删除并返回该消息。
BOOL res=::GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
在这两种方法中,变量hWnd指定要截获消息的窗口,如果该变量设为NULL,所有窗口消息将被截获。wMsgFilterMin和wMsgFilterMax变量与SendMessage( )中的变量Msg相对应,指定查看消息的范围。如果用“0,0〃,则所有的消息都将被截获。如果用WM_KEYFIRST,WM_KEYLAST或WM_MOUSEFIRST,WM_MOUSELAST,则所有键盘或鼠标的消息将被截获。wRemoveMsg变量指定PeekMessage( )是否应该真正地从队列中删除该消息。(GetMessage( )总是删除消息)。该变量可以取两个值:
PM_REMOVE,PeekMessage( )将删除消息。
PM_NOREMOVE,PeekMessage( )将把消息留在队列里,并返回它的一个拷贝。
当然,如果把消息留在消息队列中,然后再次调用PeekMessage( )查看相同类型的消息,则将返回完全相同的消息。
lpMsg变量是一个指向MSG结构的指针,MSG包含检索到的消息。
typedef struct tagMSG {
HWND hwnd; // window handle message is intended for
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time; // the time the message was put in the queue
POINT pt; // the location of the mouse cursor when the
// message was put in the queue
} MSG;

3. 消息会到消息队列中。CwinApp的成员函数Run,在应用程序运行时,Run就把时间分割成两部分,一部分执行后台的处理,另一部分来检查消息的队列,当发现新消息时,Run就调用GetMessage()从队列消息中取出该消息。

3.运行两个消息翻译函数PreTranslateMessage()和::TranslateMessage(),进行翻译。主要找到函数对象的位置、消息的动作标识和跟消息相关的执行操作。

4.用DispatchMessage()函数调用该消息预期的函数B进程,进行执行。

上一篇:windows下脚本配置IP地址


下一篇:放弃antd table,基于React手写一个虚拟滚动的表格