在上文我已经详细叙述了Autoit处理系统消息的原理,这里我再系统介绍一下各类GUI通知。 一、通用GUI通知 使用通用GUI通知需要注册WM_NOTIFY消息,下面是全部的通用GUI通知的值及介绍: Global Const $WM_NOTIFY = 0x004E ; //这是使用通用GUI通知时需要用到的消息ID Global Const $NM_FIRST = 0 ; //无具体含义,只是方便赋值而已 一个例子: #Include <GuiListView.au3> $Form1 = GUICreate("AForm1", 452, 199, 177, 118) $ListView1 = GUICtrlCreateListView("1|2|3", 10, 10, 431, 156) $ListView1_0 = GUICtrlCreateListViewItem("1", $ListView1) $ListView1_1 = GUICtrlCreateListViewItem("item2", $ListView1) $ListView1_2 = GUICtrlCreateListViewItem("item3", $ListView1) $ListView1_3 = GUICtrlCreateListViewItem("item4", $ListView1) $ListView1_4 = GUICtrlCreateListViewItem("item5", $ListView1) $dd = GUICtrlCreateInput("",10,179) Global Const $WM_NOTIFY = 0x004E GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events") GuiSetState() Do Until GUIGetMsg()=-3 Func WM_Notify_Events($hWndGUI, $MsgID, $wParam, $lParam) Const $NM_FIRST = 0 Const $NM_CLICK = ($NM_FIRST - 2) Const $NM_HOVER = ($NM_FIRST - 13) #forceref $hWndGUI, $MsgID, $wParam Local $tagNMHDR, $event, $hwndFrom, $code $tagNMHDR = DllStructCreate("int;int;int", $lParam) ;NMHDR (hwndFrom, idFrom, code) If @error Then Return $event = DllStructGetData($tagNMHDR, 3) If $event = $NM_CLICK Then GUICtrlSetData($dd,"鼠标选中:"&_GUICtrlListViewGetItemText($ListView1, _GUICtrlListViewGetSelectedIndices($ListView1))) EndIf $tagNMHDR = 0 $event = 0 $lParam = 0 EndFunc 二、控件专用通知 你可以在http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/wincontrols.asp 里找到一份控件列表,通过这个列表你可以找到每个控件的介绍页面,比如按钮控件的页面就是http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/buttons/buttons.asp。 在每个控件的页面下都有专门的Notifications项,用以介绍不同的控件通知。因为这类通知实在太多,我仅以Edit控件为例作一下介绍,其他控件的通知可以以此类推。 Edit控件的详细信息可以在http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/editcontrols/editcontrols.asp 找到,下面是Edit控件所有通知的值和说明: Global Const $EN_ALIGN_LTR_EC = 0x700 ; //文本排列顺序更变为从左到右 Global Const $EN_ALIGN_RTL_EC = 0x701; //文本排列顺序更变为从右到左 Global Const $EN_CHANGE = 0x300 ; //文本发生改变 Global Const $EN_ERRSPACE = 0x500 ; //内存不足 Global Const $EN_HSCROLL = 0x601 ; //用户点击横向滚动条 Global Const $EN_KILLFOCUS = 0x200 ; //失去焦点 Global Const $EN_MAXTEXT = 0x501 ; //文本已满 Global Const $EN_SETFOCUS = 0x100 ; //获取焦点 Global Const $EN_UPDATE = 0x400 ; //控件重绘 Global Const $EN_VSCROLL = 0x602 ; //用户点击纵向滚动条 一个例子: CODE: AutoIt GuiCreate("MyGUI", 392, 66) $Input_1 = GuiCtrlCreateInput("", 10, 20, 190, 30) $Label_2 = GuiCtrlCreateLabel("", 220, 30, 130, 20) Global Const $WM_COMMAND = 0x0111 GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND") GUISetState() While 1 $msg = GUIGetMsg() Select Case $msg = -3 ExitLoop Case Else ;;; EndSelect WEnd Func MY_WM_COMMAND($hWnd, $msg, $wParam, $lParam) Local Const $EN_CHANGE = 0x300 Local $nNotifyCode = BitShift($wParam,16) Local $nID = BitAND($wParam,0xFFFF) Local $hCtrl = $lParam If $nNotifyCode = $EN_CHANGE Then GUICtrlSetData($Label_2,GUICtrlRead($Input_1)) EndFunc ;==>MY_WM_COMMAND 三、注意事项 我已经说过,不同的通知需要注册不同的消息,而不同的消息又会传递不同的参数。一般来说,GUI通知主要需要注册WM_COMMAND和WM_NOTIFY这两个消息(当然也例外,滚动条的通知就需要注册WM_HSCROLL消息),这两个消息的应用可以照搬上面的两个例子。如果遇到一些通知需要注册新的消息,你就需要在MSDN上查找该消息的参数说明,查找的方法我在上一篇文章里已做了说明。 还有一点需要注意,通用GUI通知不是什么时候都管用。如果在某一控件上通用GUI通知不起作用,你就需要查询该控件的专用通知。
|
|
来自: mintecgame > 《www.autoitx.com》