找回密码  加入

QQ登录

只需一步,快速开始

AUTOIT CN

搜索
查看: 296|回复: 22

[AU3基础] 请教关于GUIRegisterMsg注册消息ID的用法

[复制链接]
发表于 2019-11-18 19:52:58 | 显示全部楼层 |阅读模式
关于GUIRegisterMsg函数的用法,看了很多遍帮助文件,并加入了MSGBOX进行实际测试,但由于加入了MSGBOX后,经常导致中断,所以测试不出来结果。
相关疑问:
1、$hWnd, $iMsg, $wParam, $lParam这几个参数,为啥不用先定义就能使用?
2、这里 $hWndFrom = $lParam,我感觉有点多余?
3、$iIDFrom = _WinAPI_LoWord($wParam) ;检索长字值的低位字.
$iCode = _WinAPI_HiWord($wParam) ;获取一个长字值的高位字.
具体怎么理解呢?
4、$EN_CHANGE = 0x300,具体表示什么意义呢?
5、$iCode = $EN_CHANGE Then,具体是什么含义呢?
6、Return $GUI_RUNDEFMSG,具体是什么含义呢?什么叫做:AutoIt 内部消息处理程序也将被执行?
请教大神,如能通俗讲解一下,非常感谢!


  1. GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") ;$WM_COMMAND = 0x0111,<WindowsConstants.au3>中定义;WM_COMMAND:自定义函数名
  2. Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) ;$hWnd:出现消息的 GUI 窗口句柄;$iMsg:Windows 消息 ID;十六进制值的第一个消息参数;$lParam:十六进制值的第二个消息参数.
  3. Local $hWndFrom, $iIDFrom, $iCode
  4. $hWndFrom = $lParam
  5. $iIDFrom = _WinAPI_LoWord($wParam) ;检索长字值的低位字.
  6. $iCode = _WinAPI_HiWord($wParam) ;获取一个长字值的高位字.
  7. If $iCode = $EN_CHANGE Then ;$EN_CHANGE = 0x300,<EditConstants.au3>中定义。
  8.   For $i = 0 To 7
  9.    If $iIDFrom = $Input[$i] Then
  10.     Local $t1, $t2, $f, $fx, $t3, $t4
  11.     If Mod($i, 2) = 0 Then
  12.      $f = $i + 1
  13.      $t1 = StringStripWS(GUICtrlRead($Input[$i]), 3)
  14.      $t2 = StringStripWS(GUICtrlRead($Input[$f]), 3)
  15.      $fx = GUICtrlRead($Label[$i / 2])
  16.     Else
  17.      $f = $i - 1
  18.      $t1 = StringStripWS(GUICtrlRead($Input[$f]), 3)
  19.      $t2 = StringStripWS(GUICtrlRead($Input[$i]), 3)
  20.      $fx = GUICtrlRead($Label[$f / 2])
  21.     EndIf
  22.     For $j = 0 To 7
  23.      If $j <> $i And $j <> $f Then
  24.       If $t1 = "" And $t2 = "" Then
  25.        GUICtrlSetState($Input[$j], $GUI_ENABLE)
  26.       Else
  27.        GUICtrlSetState($Input[$j], $GUI_DISABLE)
  28.       EndIf
  29.      EndIf
  30.     Next
  31.     If $t1 = "" Or $t2 = "" Then
  32.      _GUICtrlListView_DeleteAllItems_($lv)
  33.      If $t1 <> "" Or $t2 <> "" Then
  34.       _GUICtrlStatusBar_SetText($hStatus, "    等待输入完成...")
  35.      Else
  36.       _GUICtrlStatusBar_SetText($hStatus, "")
  37.      EndIf
  38.     Else
  39.      _GUICtrlStatusBar_SetText($hStatus, "")
  40.      _GetResult($fx, $t1, $t2)
  41.     EndIf
  42.     ExitLoop
  43.    EndIf
  44.   Next
  45. EndIf
  46. Return $GUI_RUNDEFMSG;如果关键字Return与常量参数$GUI_RUNDEFMSG(可以在包含文件 GUIConstantsEx.au3 中找到)一起使用, 则 AutoIt 内部消息处理程序也将被执行.
  47. EndFunc   ;==>WM_COMMAND
复制代码

发表于 2019-11-19 21:19:27 | 显示全部楼层
去百度搜索一下windows系统消息,这个三言两语说不清楚
 楼主| 发表于 2019-11-20 09:19:41 | 显示全部楼层
tubaba 发表于 2019-11-19 21:19
去百度搜索一下windows系统消息,这个三言两语说不清楚

谢谢!

百度、本论坛、IT天空论坛,我都搜过了,有用的资料都看了,还是不太理解。
发表于 2019-11-21 00:44:07 | 显示全部楼层
au3业余菜鸟一枚,非邀自来,强答一波,都是自己目前的理解,交流一下,相信理是越辩越明的:
1。Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) 个人感觉就是固定的写法,C# 里面的函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam),这个不纠结……
2。$hWndFrom = $lParam,我也感觉有点多余,可以注释掉,试试,如果不影响的话,那就问题不大? 虽然说 lParam含有发送消息的控件的HWND(窗口的句柄),但我认为在 $wParam里面的:$iIDFrom = _WinAPI_LoWord($wParam),LoWORD里面也含有发送消息的控件或菜单的标识号,所以在本WM_COMMAND里面,$iIDFrom= $lParam???,应该是多余的??????
发表于 2019-11-21 00:49:19 | 显示全部楼层
3。网上黏贴过来的:              http://winprog.org/tutorial/zh/message_loop_cn.html
每个windows消息可能拥有至多两个参数,wParam和lParam.最初wParam是16bit,lParam是32bit,但在Win32平台下两者都是32bit.不是每个消息使用了这些参数,而且每个消息以不同的方式来使用.比如,WM_CLOSE不使用它们任一个,所以你应该忽略它们.WM_COMMAND消息两个都使用,wParam有两个部分,HIWORD(wParam)中含有提示消息(如果有的话),LOWORD(wParam)含有发送消息的控件或菜单的标识号.
HIWORD()和LOWORD()是windows定义的两个宏,用来从一个32bit值中分离出高字(0xffff0000)和低字(0x0000ffff)的两字节.
发表于 2019-11-21 00:56:06 | 显示全部楼层
4。0x300 对应 EN_CHANGE,即文本框输入数据变化时触发
5。按照我的理解: 在本脚本里面的自定义WM_COMMAND里面:wParam这个参数,包含了2个信息:高的(0xffff0000)==〉0x300= EN_CHANGE=文本框输入数据变化时触发事件,低的(0x0000ffff)就是所谓的所发生改变的文本框的句柄(?????反正是唯一标识吧)。
   $iCode = $EN_CHANGE then具体是含义: 当文本框输入数据变化时(将会)……………………
发表于 2019-11-21 01:07:18 | 显示全部楼层
6、Return $GUI_RUNDEFMSG, 自己解释不清楚………
$GUI_RUNDEFMSG 在 GUIConstantsEx.au3 中定义:Global Const $GUI_RUNDEFMSG = 'GUI_RUNDEFMSG',按照英文字面上的揣测: run defined message????运行系统本身定义/用户自己定义WM_COMMAND,

写了这一句,就可以将返回值  传递下去了??? 从而实现:早于用户函数结束前取得返回值, 以便执行 AutoIt 内部消息处理程序.???
 楼主| 发表于 2019-11-21 10:33:08 | 显示全部楼层
floor6ggg 发表于 2019-11-21 01:07
6、Return $GUI_RUNDEFMSG, 自己解释不清楚………
$GUI_RUNDEFMSG 在 GUIConstantsEx.au3 中定义:Global  ...

你的理解还是比较深刻的。请教一下,那低位字符,表示啥意思呢?
发表于 2019-11-21 10:56:13 | 显示全部楼层
我的理解,我觉得高位应该就是文本发生改变这一个是触发事件,然后低位的话就是你在程序运行中所点击的那一个input控件的标识符,或者说是句柄?????
 楼主| 发表于 2019-11-22 13:32:26 | 显示全部楼层
floor6ggg 发表于 2019-11-21 10:56
我的理解,我觉得高位应该就是文本发生改变这一个是触发事件,然后低位的话就是你在程序运行中所点击的那一 ...

你这么说,貌似也有道理。
发表于 2019-11-22 15:05:23 | 显示全部楼层
这两个参数不是固定不变的,不同的消息有不同的定义
  1. 消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做TMsg,

  2. 它在Windows单元中是这样声明的:
  3. type
  4. TMsg = packed record
  5. hwnd: HWND; / /窗口句柄
  6. message: UINT; / /消息常量标识符
  7. wParam: WPARAM ; // 32位消息的特定附加信息
  8. lParam: LPARAM ; // 32位消息的特定附加信息
  9. time: DWORD; / /消息创建时的时间
  10. pt: TPoint; / /消息创建时的鼠标位置
  11. end;

  12. 消息中有什么?
  13. 是否觉得一个消息记录中的信息像希腊语一样?如果是这样,那么看一看下面的解释:
  14. hwnd 32位的窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。
  15. message 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量。
  16. wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。
  17. lParam 通常是一个指向内存中数据的指针。由于W P a r a m、l P a r a m和P o i n t e r都是3 2位的,
  18. 因此,它们之间可以相互转换。

  19. WM_NULL = $0000;
  20. WM_CREATE = $0001;
  21. 应用程序创建一个窗口
  22. WM_DESTROY = $0002;
  23. 一个窗口被销毁
  24. WM_MOVE = $0003;
  25. 移动一个窗口
  26. WM_SIZE = $0005;
  27. 改变一个窗口的大小
  28. WM_ACTIVATE = $0006;
  29. 一个窗口被激活或失去激活状态;
  30. WM_SETFOCUS = $0007;
  31. 获得焦点后
  32. WM_KILLFOCUS = $0008;
  33. 失去焦点
  34. WM_ENABLE = $000A;
  35. 改变enable状态
  36. WM_SETREDRAW = $000B;
  37. 设置窗口是否能重画
  38. WM_SETTEXT = $000C;
  39. 应用程序发送此消息来设置一个窗口的文本
  40. WM_GETTEXT = $000D;
  41. 应用程序发送此消息来复制对应窗口的文本到缓冲区
  42. WM_GETTEXTLENGTH = $000E;
  43. 得到与一个窗口有关的文本的长度(不包含空字符)
  44. WM_PAINT = $000F;
  45. 要求一个窗口重画自己
  46. WM_CLOSE = $0010;
  47. 当一个窗口或应用程序要关闭时发送一个信号
  48. WM_QUERYENDSESSION = $0011;
  49. 当用户选择结束对话框或程序自己调用ExitWindows函数
  50. WM_QUIT = $0012;
  51. 用来结束程序运行或当程序调用postquitmessage函数
  52. WM_QUERYOPEN = $0013;
  53. 当用户窗口恢复以前的大小位置时,把此消息发送给某个图标
  54. WM_ERASEBKGND = $0014;
  55. 当窗口背景必须被擦除时(例在窗口改变大小时)
  56. WM_SYSCOLORCHANGE = $0015;
  57. 当系统颜色改变时,发送此消息给所有顶级窗口
  58. WM_ENDSESSION = $0016;
  59. 当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序,
  60. 通知它对话是否结束
  61. WM_SYSTEMERROR = $0017;
  62. WM_SHOWWINDOW = $0018;
  63. 当隐藏或显示窗口是发送此消息给这个窗口
  64. WM_ACTIVATEAPP = $001C;
  65. 发此消息给应用程序哪个窗口是激活的,哪个是非激活的;
  66. WM_FONTCHANGE = $001D;
  67. 当系统的字体资源库变化时发送此消息给所有顶级窗口
  68. WM_TIMECHANGE = $001E;
  69. 当系统的时间变化时发送此消息给所有顶级窗口
  70. WM_CANCELMODE = $001F;
  71. 发送此消息来取消某种正在进行的摸态(操作)
  72. WM_SETCURSOR = $0020;
  73. 如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口
  74. WM_MOUSEACTIVATE = $0021;
  75. 当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口
  76. WM_CHILDACTIVATE = $0022;
  77. 发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小
  78. WM_QUEUESYNC = $0023;
  79. 此消息由基于计算机的训练程序发送,通过WH_JOURNALPALYBACK的hook程序
  80. 分离出用户输入消息
  81. WM_GETMINMAXINFO = $0024;
  82. 此消息发送给窗口当它将要改变大小或位置;
  83. WM_PAINTICON = $0026;
  84. 发送给最小化窗口当它图标将要被重画
  85. WM_ICONERASEBKGND = $0027;
  86. 此消息发送给某个最小化窗口,仅当它在画图标前它的背景必须被重画
  87. WM_NEXTDLGCTL = $0028;
  88. 发送此消息给一个对话框程序去更改焦点位置
  89. WM_SPOOLERSTATUS = $002A;
  90. 每当打印管理列队增加或减少一条作业时发出此消息
  91. WM_DRAWITEM = $002B;
  92. 当button,combobox,listbox,menu的可视外观改变时发送
  93. 此消息给这些空件的所有者
  94. WM_MEASUREITEM = $002C;
  95. 当button, combo box, list box, list view control, or menu item 被创建时
  96. 发送此消息给控件的所有者
  97. WM_DELETEITEM = $002D;
  98. 当the list box 或 combo box 被销毁 或 当 某些项被删除通过LB_DELETESTRING, LB_RESETCONTENT, CB_DELETESTRING, or CB_RESETCONTENT 消息
  99. WM_VKEYTOITEM = $002E;
  100. 此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息
  101. WM_CHARTOITEM = $002F;
  102. 此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息
  103. WM_SETFONT = $0030;
  104. 当绘制文本时程序发送此消息得到控件要用的颜色
  105. WM_GETFONT = $0031;
  106. 应用程序发送此消息得到当前控件绘制文本的字体
  107. WM_SETHOTKEY = $0032;
  108. 应用程序发送此消息让一个窗口与一个热键相关连
  109. WM_GETHOTKEY = $0033;
  110. 应用程序发送此消息来判断热键与某个窗口是否有关联
  111. WM_QUERYDRAGICON = $0037;
  112. 此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序能返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标
  113. WM_COMPAREITEM = $0039;
  114. 发送此消息来判定combobox或listbox新增加的项的相对位置
  115. WM_GETOBJECT = $003D;
  116. WM_COMPACTING = $0041;
  117. 显示内存已经很少了
  118. WM_WINDOWPOSCHANGING = $0046;
  119. 发送此消息给那个窗口的大小和位置将要被改变时,来调用setwindowpos函数或其它窗口管理函数
  120. WM_WINDOWPOSCHANGED = $0047;
  121. 发送此消息给那个窗口的大小和位置已经被改变时,来调用setwindowpos函数或其它窗口管理函数
  122. WM_POWER = $0048;(适用于16位的windows)
  123. 当系统将要进入暂停状态时发送此消息
  124. WM_COPYDATA = $004A;
  125. 当一个应用程序传递数据给另一个应用程序时发送此消息
  126. WM_CANCELJOURNAL = $004B;
  127. 当某个用户取消程序日志激活状态,提交此消息给程序
  128. WM_NOTIFY = $004E;
  129. 当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口
  130. WM_INPUTLANGCHANGEREQUEST = $0050;
  131. 当用户选择某种输入语言,或输入语言的热键改变
  132. WM_INPUTLANGCHANGE = $0051;
  133. 当平台现场已经被改变后发送此消息给受影响的最顶级窗口
  134. WM_TCARD = $0052;
  135. 当程序已经初始化windows帮助例程时发送此消息给应用程序
  136. WM_HELP = $0053;
  137. 此消息显示用户按下了F1,如果某个菜单是激活的,就发送此消息个此窗口关联的菜单,否则就
  138. 发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口
  139. WM_USERCHANGED = $0054;
  140. 当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体
  141. 设置信息,在用户更新设置时系统马上发送此消息;
  142. WM_NOTIFYFORMAT = $0055;
  143. 公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICODE结构
  144. 在WM_NOTIFY消息,使用此控件能使某个控件与它的父控件之间进行相互通信
  145. WM_CONTEXTMENU = $007B;
  146. 当用户某个窗口中点击了一下右键就发送此消息给这个窗口
  147. WM_STYLECHANGING = $007C;
  148. 当调用SETWINDOWLONG函数将要改变一个或多个 窗口的风格时发送此消息给那个窗口
  149. WM_STYLECHANGED = $007D;
  150. 当调用SETWINDOWLONG函数一个或多个 窗口的风格后发送此消息给那个窗口
  151. WM_DISPLAYCHANGE = $007E;
  152. 当显示器的分辨率改变后发送此消息给所有的窗口
  153. WM_GETICON = $007F;
  154. 此消息发送给某个窗口来返回与某个窗口有关连的大图标或小图标的句柄;
  155. WM_SETICON = $0080;
  156. 程序发送此消息让一个新的大图标或小图标与某个窗口关联;
  157. WM_NCCREATE = $0081;
  158. 当某个窗口第一次被创建时,此消息在WM_CREATE消息发送前发送;
  159. WM_NCDESTROY = $0082;
  160. 此消息通知某个窗口,非客户区正在销毁
  161. WM_NCCALCSIZE = $0083;
  162. 当某个窗口的客户区域必须被核算时发送此消息
  163. WM_NCHITTEST = $0084;//移动鼠标,按住或释放鼠标时发生
  164. WM_NCPAINT = $0085;
  165. 程序发送此消息给某个窗口当它(窗口)的框架必须被绘制时;
  166. WM_NCACTIVATE = $0086;
  167. 此消息发送给某个窗口 仅当它的非客户区需要被改变来显示是激活还是非激活状态;
  168. WM_GETDLGCODE = $0087;
  169. 发送此消息给某个与对话框程序关联的控件,widdows控制方位键和TAB键使输入进入此控件
  170. 通过响应WM_GETDLGCODE消息,应用程序可以把他当成一个特殊的输入控件并能处理它
  171. WM_NCMOUSEMOVE = $00A0;
  172. 当光标在一个窗口的非客户区内移动时发送此消息给这个窗口 //非客户区为:窗体的标题栏及窗
  173. 的边框体
  174. WM_NCLBUTTONDOWN = $00A1;
  175. 当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息
  176. WM_NCLBUTTONUP = $00A2;
  177. 当用户释放鼠标左键同时光标某个窗口在非客户区十发送此消息;
  178. WM_NCLBUTTONDBLCLK = $00A3;
  179. 当用户双击鼠标左键同时光标某个窗口在非客户区十发送此消息
  180. WM_NCRBUTTONDOWN = $00A4;
  181. 当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息
  182. WM_NCRBUTTONUP = $00A5;
  183. 当用户释放鼠标右键同时光标又在窗口的非客户区时发送此消息
  184. WM_NCRBUTTONDBLCLK = $00A6;
  185. 当用户双击鼠标右键同时光标某个窗口在非客户区十发送此消息
  186. WM_NCMBUTTONDOWN = $00A7;
  187. 当用户按下鼠标中键同时光标又在窗口的非客户区时发送此消息
  188. WM_NCMBUTTONUP = $00A8;
  189. 当用户释放鼠标中键同时光标又在窗口的非客户区时发送此消息
  190. WM_NCMBUTTONDBLCLK = $00A9;
  191. 当用户双击鼠标中键同时光标又在窗口的非客户区时发送此消息
  192. WM_KEYFIRST = $0100;
  193. WM_KEYDOWN = $0100;
  194. //按下一个键
  195. WM_KEYUP = $0101;
  196. //释放一个键
  197. WM_CHAR = $0102;
  198. //按下某键,并已发出WM_KEYDOWN, WM_KEYUP消息
  199. WM_DEADCHAR = $0103;
  200. 当用translatemessage函数翻译WM_KEYUP消息时发送此消息给拥有焦点的窗口
  201. WM_SYSKEYDOWN = $0104;
  202. 当用户按住ALT键同时按下其它键时提交此消息给拥有焦点的窗口;
  203. WM_SYSKEYUP = $0105;
  204. 当用户释放一个键同时ALT 键还按着时提交此消息给拥有焦点的窗口
  205. WM_SYSCHAR = $0106;
  206. 当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后提交此消息给拥有焦点的窗口
  207. WM_SYSDEADCHAR = $0107;
  208. 当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后发送此消息给拥有焦点的窗口
  209. WM_KEYLAST = $0108;
  210. WM_INITDIALOG = $0110;
  211. 在一个对话框程序被显示前发送此消息给它,通常用此消息初始化控件和执行其它任务
  212. WM_COMMAND = $0111;
  213. 当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译
  214. WM_SYSCOMMAND = $0112;
  215. 当用户选择窗口菜单的一条命令或当用户选择最大化或最小化时那个窗口会收到此消息
  216. WM_TIMER = $0113; //发生了定时器事件
  217. WM_HSCROLL = $0114;
  218. 当一个窗口标准水平滚动条产生一个滚动事件时发送此消息给那个窗口,也发送给拥有它的控件
  219. WM_VSCROLL = $0115;
  220. 当一个窗口标准垂直滚动条产生一个滚动事件时发送此消息给那个窗口也,发送给拥有它的控件 WM_INITMENU = $0116;
  221. 当一个菜单将要被激活时发送此消息,它发生在用户菜单条中的某项或按下某个菜单键,它允许程序在显示前更改菜单
  222. WM_INITMENUPOPUP = $0117;
  223. 当一个下拉菜单或子菜单将要被激活时发送此消息,它允许程序在它显示前更改菜单,而不要改变全部
  224. WM_MENUSELECT = $011F;
  225. 当用户选择一条菜单项时发送此消息给菜单的所有者(一般是窗口)
  226. WM_MENUCHAR = $0120;
  227. 当菜单已被激活用户按下了某个键(不同于加速键),发送此消息给菜单的所有者;
  228. WM_ENTERIDLE = $0121;
  229. 当一个模态对话框或菜单进入空载状态时发送此消息给它的所有者,一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等待
  230. WM_MENURBUTTONUP = $0122;
  231. WM_MENUDRAG = $0123;
  232. WM_MENUGETOBJECT = $0124;
  233. WM_UNINITMENUPOPUP = $0125;
  234. WM_MENUCOMMAND = $0126;
  235. WM_CHANGEUISTATE = $0127;
  236. WM_UPDATEUISTATE = $0128;
  237. WM_QUERYUISTATE = $0129;
  238. WM_CTLCOLORMSGBOX = $0132;
  239. 在windows绘制消息框前发送此消息给消息框的所有者窗口,通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色
  240. WM_CTLCOLOREDIT = $0133;
  241. 当一个编辑型控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色
  242. WM_CTLCOLORLISTBOX = $0134;
  243. 当一个列表框控件将要被绘制前发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置列表框的文本和背景颜色
  244. WM_CTLCOLORBTN = $0135;
  245. 当一个按钮控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置按纽的文本和背景颜色
  246. WM_CTLCOLORDLG = $0136;
  247. 当一个对话框控件将要被绘制前发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置对话框的文本背景颜色
  248. WM_CTLCOLORSCROLLBAR= $0137;
  249. 当一个滚动条控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置滚动条的背景颜色
  250. WM_CTLCOLORSTATIC = $0138;
  251. 当一个静态控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置静态控件的文本和背景颜色
  252. WM_MOUSEFIRST = $0200;
  253. WM_MOUSEMOVE = $0200;
  254. // 移动鼠标
  255. WM_LBUTTONDOWN = $0201;
  256. //按下鼠标左键
  257. WM_LBUTTONUP = $0202;
  258. //释放鼠标左键
  259. WM_LBUTTONDBLCLK = $0203;
  260. //双击鼠标左键
  261. WM_RBUTTONDOWN = $0204;
  262. //按下鼠标右键
  263. WM_RBUTTONUP = $0205;
  264. //释放鼠标右键
  265. WM_RBUTTONDBLCLK = $0206;
  266. //双击鼠标右键
  267. WM_MBUTTONDOWN = $0207;
  268. //按下鼠标中键
  269. WM_MBUTTONUP = $0208;
  270. //释放鼠标中键
  271. WM_MBUTTONDBLCLK = $0209;
  272. //双击鼠标中键
  273. WM_MOUSEWHEEL = $020A;
  274. 当鼠标轮子转动时发送此消息个当前有焦点的控件
  275. WM_MOUSELAST = $020A;
  276. WM_PARENTNOTIFY = $0210;
  277. 当MDI子窗口被创建或被销毁,或用户按了一下鼠标键而光标在子窗口上时发送此消息给它的父窗口
  278. WM_ENTERMENULOOP = $0211;
  279. 发送此消息通知应用程序的主窗口that已经进入了菜单循环模式
  280. WM_EXITMENULOOP = $0212;
  281. 发送此消息通知应用程序的主窗口that已退出了菜单循环模式
  282. WM_NEXTMENU = $0213;
  283. WM_SIZING = 532;
  284. 当用户正在调整窗口大小时发送此消息给窗口;通过此消息应用程序可以监视窗口大小和位置也可以修改他们
  285. WM_CAPTURECHANGED = 533;
  286. 发送此消息 给窗口当它失去捕获的鼠标时;
  287. WM_MOVING = 534;
  288. 当用户在移动窗口时发送此消息,通过此消息应用程序可以监视窗口大小和位置也可以修改他们;
  289. WM_POWERBROADCAST = 536;
  290. 此消息发送给应用程序来通知它有关电源管理事件;
  291. WM_DEVICECHANGE = 537;
  292. 当设备的硬件配置改变时发送此消息给应用程序或设备驱动程序
  293. WM_IME_STARTCOMPOSITION = $010D;
  294. WM_IME_ENDCOMPOSITION = $010E;
  295. WM_IME_COMPOSITION = $010F;
  296. WM_IME_KEYLAST = $010F;
  297. WM_IME_SETCONTEXT = $0281;
  298. WM_IME_NOTIFY = $0282;
  299. WM_IME_CONTROL = $0283;
  300. WM_IME_COMPOSITIONFULL = $0284;
  301. WM_IME_SELECT = $0285;
  302. WM_IME_CHAR = $0286;
  303. WM_IME_REQUEST = $0288;
  304. WM_IME_KEYDOWN = $0290;
  305. WM_IME_KEYUP = $0291;
  306. WM_MDICREATE = $0220;
  307. 应用程序发送此消息给多文档的客户窗口来创建一个MDI 子窗口
  308. WM_MDIDESTROY = $0221;
  309. 应用程序发送此消息给多文档的客户窗口来关闭一个MDI 子窗口
  310. WM_MDIACTIVATE = $0222;
  311. 应用程序发送此消息给多文档的客户窗口通知客户窗口激活另一个MDI子窗口,当客户窗口收到此消息后,它发出WM_MDIACTIVE消息给MDI子窗口(未激活)激活它;
  312. WM_MDIRESTORE = $0223;
  313. 程序 发送此消息给MDI客户窗口让子窗口从最大最小化恢复到原来大小
  314. WM_MDINEXT = $0224;
  315. 程序 发送此消息给MDI客户窗口激活下一个或前一个窗口
  316. WM_MDIMAXIMIZE = $0225;
  317. 程序发送此消息给MDI客户窗口来最大化一个MDI子窗口;
  318. WM_MDITILE = $0226;
  319. 程序 发送此消息给MDI客户窗口以平铺方式重新排列所有MDI子窗口
  320. WM_MDICASCADE = $0227;
  321. 程序 发送此消息给MDI客户窗口以层叠方式重新排列所有MDI子窗口
  322. WM_MDIICONARRANGE = $0228;
  323. 程序 发送此消息给MDI客户窗口重新排列所有最小化的MDI子窗口
  324. WM_MDIGETACTIVE = $0229;
  325. 程序 发送此消息给MDI客户窗口来找到激活的子窗口的句柄
  326. WM_MDISETMENU = $0230;
  327. 程序 发送此消息给MDI客户窗口用MDI菜单代替子窗口的菜单
  328. WM_ENTERSIZEMOVE = $0231;
  329. WM_EXITSIZEMOVE = $0232;
  330. WM_DROPFILES = $0233;
  331. WM_MDIREFRESHMENU = $0234;
  332. WM_MOUSEHOVER = $02A1;
  333. WM_MOUSELEAVE = $02A3;
  334. WM_CUT = $0300;
  335. 程序发送此消息给一个编辑框或combobox来删除当前选择的文本
  336. WM_COPY = $0301;
  337. 程序发送此消息给一个编辑框或combobox来复制当前选择的文本到剪贴板
  338. WM_PASTE = $0302;
  339. 程序发送此消息给editcontrol或combobox从剪贴板中得到数据
  340. WM_CLEAR = $0303;
  341. 程序发送此消息给editcontrol或combobox清除当前选择的内容;
  342. WM_UNDO = $0304;
  343. 程序发送此消息给editcontrol或combobox撤消最后一次操作
  344. WM_RENDERFORMAT = $0305;

  345. WM_RENDERALLFORMATS = $0306;
  346. WM_DESTROYCLIPBOARD = $0307;
  347. 当调用ENPTYCLIPBOARD函数时 发送此消息给剪贴板的所有者
  348. WM_DRAWCLIPBOARD = $0308;
  349. 当剪贴板的内容变化时发送此消息给剪贴板观察链的第一个窗口;它允许用剪贴板观察窗口来
  350. 显示剪贴板的新内容;
  351. WM_PAINTCLIPBOARD = $0309;
  352. 当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区需要重画;
  353. WM_VSCROLLCLIPBOARD = $030A;
  354. WM_SIZECLIPBOARD = $030B;
  355. 当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区域的大小已经改变是此消息通过剪贴板观察窗口发送给剪贴板的所有者;
  356. WM_ASKCBFORMATNAME = $030C;
  357. 通过剪贴板观察窗口发送此消息给剪贴板的所有者来请求一个CF_OWNERDISPLAY格式的剪贴板的名字
  358. WM_CHANGECBCHAIN = $030D;
  359. 当一个窗口从剪贴板观察链中移去时发送此消息给剪贴板观察链的第一个窗口;
  360. WM_HSCROLLCLIPBOARD = $030E;
  361. 此消息通过一个剪贴板观察窗口发送给剪贴板的所有者 ;它发生在当剪贴板包含CFOWNERDISPALY格式的数据并且有个事件在剪贴板观察窗的水平滚动条上;所有者应滚动剪贴板图象并更新滚动条的值;
  362. WM_QUERYNEWPALETTE = $030F;
  363. 此消息发送给将要收到焦点的窗口,此消息能使窗口在收到焦点时同时有机会实现他的逻辑调色板
  364. WM_PALETTEISCHANGING= $0310;
  365. 当一个应用程序正要实现它的逻辑调色板时发此消息通知所有的应用程序
  366. WM_PALETTECHANGED = $0311;
  367. 此消息在一个拥有焦点的窗口实现它的逻辑调色板后发送此消息给所有顶级并重叠的窗口,以此来改变系统调色板
  368. WM_HOTKEY = $0312;
  369. 当用户按下由REGISTERHOTKEY函数注册的热键时提交此消息
  370. WM_PRINT = 791;
  371. 应用程序发送此消息仅当WINDOWS或其它应用程序发出一个请求要求绘制一个应用程序的一部分;
  372. WM_PRINTCLIENT = 792;
  373. WM_HANDHELDFIRST = 856;
  374. WM_HANDHELDLAST = 863;
  375. WM_PENWINFIRST = $0380;
  376. WM_PENWINLAST = $038F;
  377. WM_COALESCE_FIRST = $0390;
  378. WM_COALESCE_LAST = $039F;
  379. WM_DDE_FIRST = $03E0;
  380. WM_DDE_INITIATE = WM_DDE_FIRST + 0;
  381. 一个DDE客户程序提交此消息开始一个与服务器程序的会话来响应那个指定的程序和主题名;
  382. WM_DDE_TERMINATE = WM_DDE_FIRST + 1;
  383. 一个DDE应用程序(无论是客户还是服务器)提交此消息来终止一个会话;
  384. WM_DDE_ADVISE = WM_DDE_FIRST + 2;
  385. 一个DDE客户程序提交此消息给一个DDE服务程序来请求服务器每当数据项改变时更新它
  386. WM_DDE_UNADVISE = WM_DDE_FIRST + 3;
  387. 一个DDE客户程序通过此消息通知一个DDE服务程序不更新指定的项或一个特殊的剪贴板格式的项
  388. WM_DDE_ACK = WM_DDE_FIRST + 4;
  389. 此消息通知一个DDE(动态数据交换)程序已收到并正在处理WM_DDE_POKE, WM_DDE_EXECUTE, WM_DDE_DATA, WM_DDE_ADVISE, WM_DDE_UNADVISE, or WM_DDE_INITIAT消息
  390. WM_DDE_DATA = WM_DDE_FIRST + 5;
  391. 一个DDE服务程序提交此消息给DDE客户程序来传递个一数据项给客户或通知客户的一条可用数据项
  392. WM_DDE_REQUEST = WM_DDE_FIRST + 6;
  393. 一个DDE客户程序提交此消息给一个DDE服务程序来请求一个数据项的值;
  394. WM_DDE_POKE = WM_DDE_FIRST + 7;
  395. 一个DDE客户程序提交此消息给一个DDE服务程序,客户使用此消息来请求服务器接收一个未经同意的数据项;服务器通过答复WM_DDE_ACK消息提示是否它接收这个数据项;
  396. WM_DDE_EXECUTE = WM_DDE_FIRST + 8;
  397. 一个DDE客户程序提交此消息给一个DDE服务程序来发送一个字符串给服务器让它象串行命令一样被处理,服务器通过提交WM_DDE_ACK消息来作回应;
  398. WM_DDE_LAST = WM_DDE_FIRST + 8;
  399. WM_APP = $8000;
  400. WM_USER = $0400;
  401. 此消息能帮助应用程序自定义私有消息;
  402. /////////////////////////////////////////////////////////////////////
  403. 通知消息(Notification message)是指这样一种消息,一个窗口内的子控件发生了一些事情,需要通知父窗口。通知消息只适用于标准的窗口控件如按钮、列表框、组合框、编辑框,以及Windows 95公共控件如树状视图、列表视图等。例如,单击或双击一个控件、在控件中选择部分文本、操作控件的滚动条都会产生通知消息。
  404. 按扭
  405. B N _ C L I C K E D //用户单击了按钮
  406. B N _ D I S A B L E //按钮被禁止
  407. B N _ D O U B L E C L I C K E D //用户双击了按钮
  408. B N _ H I L I T E //用户加亮了按钮
  409. B N _ PA I N T按钮应当重画
  410. B N _ U N H I L I T E加亮应当去掉
  411. 组合框
  412. C B N _ C L O S E U P组合框的列表框被关闭
  413. C B N _ D B L C L K用户双击了一个字符串
  414. C B N _ D R O P D O W N组合框的列表框被拉出
  415. C B N _ E D I T C H A N G E用户修改了编辑框中的文本
  416. C B N _ E D I T U P D AT E编辑框内的文本即将更新
  417. C B N _ E R R S PA C E组合框内存不足
  418. C B N _ K I L L F O C U S组合框失去输入焦点
  419. C B N _ S E L C H A N G E在组合框中选择了一项
  420. C B N _ S E L E N D C A N C E L用户的选择应当被取消
  421. C B N _ S E L E N D O K用户的选择是合法的
  422. C B N _ S E T F O C U S组合框获得输入焦点
  423. 编辑框
  424. E N _ C H A N G E编辑框中的文本己更新
  425. E N _ E R R S PA C E编辑框内存不足
  426. E N _ H S C R O L L用户点击了水平滚动条
  427. E N _ K I L L F O C U S编辑框正在失去输入焦点
  428. E N _ M A X T E X T插入的内容被截断
  429. E N _ S E T F O C U S编辑框获得输入焦点
  430. E N _ U P D AT E编辑框中的文本将要更新
  431. E N _ V S C R O L L用户点击了垂直滚动条消息含义
  432. 列表框
  433. L B N _ D B L C L K用户双击了一项
  434. L B N _ E R R S PA C E列表框内存不够
  435. L B N _ K I L L F O C U S列表框正在失去输入焦点
  436. L B N _ S E L C A N C E L选择被取消
  437. L B N _ S E L C H A N G E选择了另一项
  438. L B N _ S E T F O C U S列表框获得输入焦点




  439. 虚拟键码
  440.   虚拟键码保存在WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN和WM_SYSKEYUP讯息的wParam参数中。此代码标识按下或释放的键。

  441.   哈,又是「虚拟」,您喜欢这个词吗?虚拟指的是假定存在于思想中而不是现实世界中的一些事物,也只有熟练使用DOS组合语言编写应用程式的程式写作者才有可能指出,为什么对Windows键盘处理如此基本的键码是虚拟的而不是真实的。

  442.   对於早期的程式写作者来说,真实的键码由实际键盘硬体产生。在Windows文件中将这些键码称为「扫描码(scan codes)」。在IBM相容机种上,扫描码16是Q键,17是W键,18是E、19是R,20是T,21是Y等等。这时您会发现,扫描码是依据键盘的实际布局的。Windows开发者认为这些代码过於与设备相关了,於是他们试图通过定义所谓的虚拟键码,以便经由与装置无关的方式处理键盘。其中一些虚拟键码不能在IBM相容机种上产生,但可能会在其他制造商生产的键盘中找到,或者在未来的键盘上找到。

  443.   您使用的大多数虚拟键码的名称在WINUSER.H表头档案中都定义为以VK_开头。表6-2列出了这些名称和数值(十进位和十六进位),以及与虚拟键相对应的IBM相容机种键盘上的键。下表也标出了Windows执行时是否需要这些键。下表还按数位顺序列出了虚拟键码。

  444.   前四个虚拟键码中有三个指的是滑鼠键:

  445.   表6-2

  446.   十进位 十六进位 WINUSER.H识别字 必需? IBM相容键盘

  447.   1 01 VK_LBUTTON 滑鼠左键

  448.   2 02 VK_RBUTTON 滑鼠右键

  449.   3 03 VK_CANCEL ˇ Ctrl-Break

  450.   4 04 VK_MBUTTON 滑鼠中键

  451.   您永远都不会从键盘讯息中获得这些滑鼠键代码。在下一章可以看到,我们能够从滑鼠讯息中获得它们。VK_CANCEL代码是一个虚拟键码,它包括同时按下两个键(Ctrl-Break)。Windows应用程式通常不使用此键。

  452.   表6-3中的键--Backspace、Tab、Enter、Escape和Spacebar-通常用於Windows程式。不过,Windows一般用字元讯息(而不是键盘讯息)来处理这些键。

  453.   表6-3

  454.   十进位 十六进位 WINUSER.H识别字 必需? IBM相容键盘

  455.   8 08 VK_BACK ˇ Backspace

  456.   9 09 VK_TAB ˇ Tab

  457.   12 0C VK_CLEAR Num Lock关闭时的数字键盘5

  458.   13 0D VK_RETURN ˇ Enter (或者另一个)

  459.   16 10 VK_SHIFT ˇ Shift (或者另一个)

  460.   17 11 VK_CONTROL ˇ Ctrl (或者另一个)

  461.   18 12 VK_MENU ˇ Alt (或者另一个)

  462.   19 13 VK_PAUSE Pause

  463.   20 14 VK_CAPITAL ˇ Caps Lock

  464.   27 1B VK_ESCAPE ˇ Esc

  465.   32 20 VK_SPACE ˇ Spacebar

  466.   另外,Windows程式通常不需要监视Shift、Ctrl或Alt键的状态。

  467.   表6-4列出的前八个码可能是与VK_INSERT和VK_DELETE一起最常用的虚拟键码:

  468.   表6-4

  469.   十进位 十六进位 WINUSER.H识别字 必需? IBM相容键盘

  470.   33 21 VK_PRIOR ˇ Page Up

  471.   34 22 VK_NEXT ˇ Page Down

  472.   35 23 VK_END ˇ End

  473.   36 24 VK_HOME ˇ Home

  474.   37 25 VK_LEFT ˇ 左箭头

  475.   38 26 VK_UP ˇ 上箭头

  476.   39 27 VK_RIGHT ˇ 右箭头

  477.   40 28 VK_DOWN ˇ 下箭头

  478.   41 29 VK_SELECT

  479.   42 2A VK_PRINT

  480.   43 2B VK_EXECUTE

  481.   44 2C VK_SNAPSHOT Print Screen

  482.   45 2D VK_INSERT ˇ Insert

  483.   46 2E VK_DELETE ˇ Delete

  484.   47 2F VK_HELP

  485.   注意,许多名称(例如VK_PRIOR和VK_NEXT)都与键上的标志不同,而且也与卷动列中的识别字不统一。Print Screen键在平时都被Windows应用程式所忽略。Windows本身回应此键时会将视讯显示的点阵图影本存放到剪贴板中。假使有键盘提供了VK_SELECT、VK_PRINT、VK_EXECUTE和VK_HELP,大概也没几个人看过那样的键盘。

  486.   Windows也包括在主键盘上的字母和数位键的虚拟键码(数字键盘将单独处理)。

  487.   表6-5

  488.   十进位 十六进位 WINUSER.H识别字 必需? IBM相容键盘

  489.   48-57 30-39 无 ˇ 主键盘上的0到9

  490.   65-90 41-5A 无 ˇ A到Z

  491.   注意,数字和字母的虚拟键码是ASCII码。Windows程式几乎从不使用这些虚拟键码;实际上,程式使用的是ASCII码字元的字元讯息。

  492.   表6-6所示的代码是由Microsoft Natural Keyboard及其相容键盘产生的:

  493.   表6-6

  494.   十进位 十六进位 WINUSER.H识别字 必需? IBM相容键盘

  495.   91 5B VK_LWIN 左Windows键

  496.   92 5C VK_RWIN 右Windows键

  497.   93 5D VK_APPS Applications键

  498.   Windows用VK_LWIN和VK_RWIN键打开「开始」功能表或者(在以前的版本中)启动「工作管理员程式」。这两个都可以用於登录或登出Windows(只在Microsoft Windows NT中有效),或者登录或登出网路(在Windows for Applications中)。应用程式能够通过显示辅助资讯或者当成捷径键看待来处理application键。

  499.   表6-7所示的代码用於数字键盘上的键(如果有的话):

  500.   表6-7

  501.   十进位 十六进位 WINUSER.H识别字 必需? IBM相容键盘

  502.   96-105 60-69 VK_NUMPAD0到VK_ NUMPAD9 NumLock打开时数字键盘上的0到9

  503.   106 6A VK_MULTIPLY 数字键盘上的*

  504.   107 6B VK_ADD 数字键盘上的+

  505.   108 6C VK_SEPARATOR

  506.   109 6D VK_SUBTRACT 数字键盘上的-

  507.   110 6E VK_DECIMAL 数字键盘上的.

  508.   111 6F VK_DIVIDE 数字键盘上的/

  509.   最後,虽然多数的键盘都有12个功能键,但Windows只需要10个,而位元旗标却有24个。另外,程式通常用功能键作为键盘加速键,这样,它们通常不处理表6-8所示的按键:

  510.   表6-8

  511.   十进位 十六进位 WINUSER.H识别字 必需? IBM相容键盘

  512.   112-121 70-79 VK_F1到VK_F10 ˇ 功能键F1到F10

  513.   122-135 7A-87 VK_F11到VK_F24 功能键F11到F24

  514.   144 90 VK_NUMLOCK Num Lock

  515.   145 91 VK_SCROLL Scroll Lock

  516.   另外,还定义了一些其他虚拟键码,但它们只用於非标准键盘上的键,或者通常在大型主机终端机上使用的键。查看/ Platform SDK / User Interface Services / User Input / Virtual-Key Codes,可得到完整的列表。

  517.   虚拟键表

  518.   虚拟键与ASCII码对应的有: '1'-'9','A'-'Z'

  519.   vkkeyscan()函数可查看相应字符的实数值.参数为字符;

  520.   API常量型 实数值 解释

  521.   VK_LBUTTON 1 滑鼠左键

  522.   VK_RBUTTON 2 滑鼠右键

  523.   VK_CANCEL 3 Ctrl+Break

  524.   VK_MBUTTON 4 滑鼠中键

  525.   VK_BACK 8 退格

  526.   VK_TAB 9 TAB

  527.   VK_CLEAR 12 NUM LOCK关闭时的数字键盘5?

  528.   VK_RETURN 13 回车

  529.   VK_SHIFT 16 Shift

  530.   VK_CONTROL 17 Ctrl

  531.   VK_MENU 18 Alt

  532.   VK_PAUSE 19 Pause Break

  533.   VK_CAPITAL 20 Caps Lock

  534.   VK_ESCAPE 27 ESC

  535.   VK_SPACE 32 空格键

  536.   VK_PRIOR 33 Page up

  537.   VK_NEXT 34 Page down

  538.   VK_END 35 End

  539.   VK_HOME 36 Home

  540.   VK_LEFT 37 左箭头

  541.   VK_RIGHT 38 上箭头

  542.   VK_UP 39 右箭头

  543.   VK_DOWN 40 下箭头

  544.   VK_SELECT 41

  545.   VK_PRINT 42

  546.   VK_EXECUTE 43

  547.   VK_SNAPSHOT 44 Print Screen

  548.   VK_INSERT 45 Insert

  549.   VK_DELETE 46 Delete

  550.   VK_HELP 47

  551.   VK_0..9 48..57 主键盘0..9

  552.   VK_A..Z 65..90 主键盘A..Z

  553.   VK_LWIN 91 左Win

  554.   VK_RWIN 92 右Win

  555.   VK_APPS 93 快捷菜单

  556.   Reserved 94 保留

  557.   VK_SLEEP 95 Sleep???

  558.   数字键盘

  559.   VK_NUMPAD0..9 96..105 小键盘上的0到9

  560.   VK_MULTIPLY 106 小键盘上的*

  561.   VK_ADD 107 小键盘上的+

  562.   VK_SEPARATOR 108 分隔符

  563.   VK_SUBTRACT 109 小键盘上的-

  564.   VK_DECIMAL 110 小键盘上的.

  565.   VK_DIVIDE 111 小键盘上的/

  566.   VK_NUMLOCK 144 Num Lock

  567.   VK_F1..VK_F24 112..135 F1..24

  568.   Unassigned 136..145 未定义

  569.   VK_SCROLL 145 Scroll Lock

  570.   Specific 146..150 特殊用途

  571.   Unassigned 151..159 未定义

  572.   VK_LSHIFT 160 左Shift键

  573.   VK_RSHIFT 161 右Shift键

  574.   VK_LCONTROL 162 左Ctrl键

  575.   VK_RCONTROL 163 右Ctrl键

  576.   VK_LMENU 164 左Alt键

  577.   VK_RMENU 165 右Alt键

  578.   浏览器

  579.   VK_BROWSER_BACK A6(166) Browser Back key

  580.   VK_BROWSER_FORWARD A7(167) Browser Forward key

  581.   VK_BROWSER_REFRESH A8(168) Browser Refresh key

  582.   VK_BROWSER_STOP A9(169) Browser Stop key

  583.   VK_BROWSER_SEARCH AA(170) Browser Search key

  584.   VK_BROWSER_FAVORITES AB(171) Browser Favorites key

  585.   VK_BROWSER_HOME AC(172) Browser Start and Home key

  586.   音量

  587.   VK_VOLUME_MUTE AD Volume Mute key

  588.   VK_VOLUME_DOWN AE Volume Down key

  589.   VK_VOLUME_UP AF Volume Up key

  590.   媒体

  591.   VK_MEDIA_NEXT_TRACK B0 Next Track key

  592.   VK_MEDIA_PREV_TRACK B1 Previous Track key

  593.   VK_MEDIA_STOP B2 Stop Media key

  594.   VK_MEDIA_PLAY_PAUSE B3 Play/Pause Media key

  595.   语言

  596.   VK_LAUNCH_MAIL B4 Start Mail key

  597.   VK_LAUNCH_MEDIA_SELECT B5 Select Media key

  598.   VK_LAUNCH_APP1 B6 Start Application 1 key

  599.   VK_LAUNCH_APP2 B7 Start Application 2 key

  600.   标点

  601.   VK_OEM_1 186 分号

  602.   VK_OEM_PLUS 187 等号

  603.   VK_OEM_COMMA 188 逗号

  604.   VK_OEM_MINUS 189 减号

  605.   VK_OEM_PERIOD 190 句号

  606.   VK_OEM_2 191 /

  607.   VK_OEM_3 192 ~

  608.   Reserved 193..215 保留码

  609.   Unassined 216..218 未指定

  610.   VK_OEM_4 219 [

  611.   VK_OEM_5 220 \

  612.   VK_OEM_6 221 ]

  613.   VK_OEM_7 222 引号

  614.   VK_OEM_8 223

  615.   VK_ATTN HF6(246)

  616.   VK_CRSEL HF7(247)

  617.   VK_EXSEL HF8(248)

  618.   VK_EREOF HF9(249)

  619.   VK_PLAY HFA(250)

  620.   VK_ZOOM HFB(251)

  621.   VK_NONAME HFC(252)

  622.   VK_PA1 HFD(253)

  623.   VK_OEM_CLEAR HFE(254)
复制代码
发表于 2019-11-22 15:14:14 | 显示全部楼层
不用考虑为什么是这样定义的,只要知道它是如何运作的,就如使用一台电脑,你不必知道它是如何制造出来的,对于我们来说,只要知道如何正确的使用它就行了.

帮助文件里有很多关于消息的例子,可能你只是没注意到罢了.几乎每一个创建控件的UDF函数的示例中都有windows消息的使用.
发表于 2019-11-22 22:37:43 | 显示全部楼层
tubaba大大,干货满满!!!帮助文档的Windows Message Codes(系统消息代码)都没有这么详细的解释!!!大赞!!!

留个位,记录体会,以后再仔细回看…………

1.time: DWORD; / /消息创建时的时间
2.lParam 通常是一个指向内存中数据的指针
3.的line22:WM_NULL = $0000;
        等同于  Windows Message Codes(系统消息代码)里面的
                     WM_NULL 0x0000
         $0000的写法,暂时 没有掌握,估计:$=0x???
4.常见的几个以前不太明白的wm:
WM_CHAR = $0102;
//按下某键,并已发出WM_KEYDOWN, WM_KEYUP消息

WM_COMMAND = $0111;
当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译

WM_NOTIFY = $004E;
当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口

####需要结合实例在体会一下WM_NOTIFY与 WM_COMMAND的区别………现在还是不太明白………#####

5.通知消息(Notification message)  编辑框  E N _ C H A N G E编辑框中的文本己更新, 以前不明白,为什么叫EN,现在看来,E 是 edit, n 是Notification………………应该是这样拆解吧?

6.spy++经常探测到的键盘按下后的 scan codes,=真实的键码…………!!

7.  VK_0..9 48..57 主键盘0..9
  VK_A..Z 65..90 主键盘A..Z

发表于 2019-11-22 23:26:03 | 显示全部楼层
smooth 发表于 2019-11-22 13:32
你这么说,貌似也有道理。

重新查阅了部分资料,修正原来的理解,我的理解有误,你1楼的代码加入调试,可以看出差别
发表于 2019-11-22 23:33:55 | 显示全部楼层
本帖最后由 floor6ggg 于 2019-11-23 00:02 编辑

将第五到第七行,更改为:
  1. $hWndFrom = $lParam
  2. ConsoleWrite(@ScriptLineNumber & '        $hWndFrom        =        ' & $hWndFrom&@crlf)
  3. $iIDFrom = _WinAPI_LoWord($wParam) ;检索长字值的低位字.
  4. ConsoleWrite(@ScriptLineNumber & '        $iIDFrom        =        ' & $iIDFrom&@crlf)
  5. $iCode = _WinAPI_HiWord($wParam) ;获取一个长字值的高位字.
  6. ConsoleWrite(@ScriptLineNumber & '        $iCode        =        ' & $iCode&@crlf)
复制代码


会发现:$iIDFrom  返回的时是 控件的ID!!!也就是说 : 在本次自己定义的WM_COMMAND里面 , _WinAPI_LoWord($wParam) =检索长字值的低位字=$wParam的低位值=文本框发生改变的控件的ID,不是句柄!!
$iCode = _WinAPI_HiWord($wParam) =$wParam的高位值=文本框发生改变的事件【=具体数值256???待验证】

您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|小黑屋|手机版|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2019-12-10 02:18 , Processed in 0.078128 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表