火凤凰 发表于 2012-6-14 17:18:55

2012年06月14日,签到!

hlzxcjx 发表于 2012-6-14 17:37:44

2012-6-14 17:37:22 签到.

1733413480 发表于 2012-6-14 18:42:08

坚持签到,支持论坛。

hlzxcjx 发表于 2012-6-14 20:41:58

2012-6-14 20:41:26 签到.

xms77 发表于 2012-6-14 21:52:35

到。。。到。。。到。。。。。。。。。

dd20121221 发表于 2012-6-14 22:08:10

每日来签到

user3000 发表于 2012-6-14 22:38:24

存稿:


(前言:此帖其实不算提问帖, 因为我认为自己已经解决了此疑问. 发这里, 主要想让大家分享下免费下载的喜悦!)

如果我们 GuiCreate 一个窗体后, 马上在上面创建任一控件, 此控件的ID必然是 3.
为什么是 3, 而不是 1 或是别的数字呢?这几个月来, 有时闲得无聊时, 我会想到这个问题. 不知道列位又是如何?
前天重新学习系统消息, 没想似乎找到了答案.
我们先来看下帮助里关于 GUIRegisterMsg的说明:(原文大半是英文, 我勉强翻了过来)
函数作用: 为已知的Windows 消息代码(WM_MSG)注册一个用户自定义的函数.
调用方式: GUIRegisterMsg ( msgID, "函数" )
参数说明:
msgID             一个Windows消息ID (参考附录的: Windows 消息代码).
函数                要调用的自定义函数的名称,或者或者一个空字符串""(反注册一个消息).

注意与说明
!!!为了让自定义函数能够发挥功能, 你必须把它的参数个数限制在4个以内, 要不然它将无法被调用!
举例1 (4个参数):
Func MyUserFunction($hWndGUI, $MsgID, $WParam, $LParam)
...
EndFunc
或者: (2个参数)
Func MyUserFunction($hWndGUI, $MsgID)
...
EndFunc
自定义函数被调用时, 这4个参数被赋予以下的值:
参数1            hwnd                   接收系统消息通知的窗体句柄
参数2            msg                     windows 消息的 id.
参数3             wparam                16进制数, 消息的第一个参数.
参数4             lparam               16进制数, 消息的第二个参数.

最多可以为这些系统消息注册 256 个自定义函数.

默认时,在完成注册的自定义函数后, AutoIt 内部的消息处理机制会继续运行.
但是, 如果你的自定义函数里用关键字'Return' 返回一个值或无返回值时, 该处理机制就不会继续运行.
(请运行下面的示例代码, 它为系统消息 WM_COMMAND 的注册了函数 MY_WM_COMMAND, 其中有一行代码 'Return 0', 注释这行与否, 结果大不同, 请自行尝试!)
只用关键字 'Return', 不带返回值, 执行完消息的自定义函数后, 不会再运行 AutoIt 内部的消息处理机制 (关于此消息, 如果存在一个处理机制的话)!
!!! 如果你想运行某个消息的 AutoIt 内部处理机制, 则自定义函数里应该返回变量 '$GUI_RUNDEFMSG' (头文件 GUIConstantsEx.au3 里有定义). 同样, 请参见示例! !!!
即: 你想在自定义函数终止前返回, 让 AutoIt 内部处理机制继续处理此消息.

警告: !!! 用 "Msgbox()" 等命令来展示各类Windows的信息, 会阻碍所注册的自定义函数的运行, 它有可能导致意料之外的后果, 所以应当尽可能快地返回. !!!

一些控件会'消耗掉'特定的系统消息, 所以注册它们是没有效果的. 比如: WM_CHAR, WM_KEYDOWN, WM_KEYUP 会被 edit 控件处理掉.

以下此函数的关键示例片断, 完整代码请参考帮助文档. 也可在帖子后面下载到.示例中的关键注释我已给出翻译.
Func MY_WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
        Local $nNotifyCode = BitShift($wParam, 16) ; 获取其高16位, 这里代表 控件定义的通知代号 (注意: 此代号的数值及个数因控件的不同而异.)
        Local $nID = BitAND($wParam, 0x0000FFFF); 获取其低16位, 这里代表 控件 ID
        Local $hCtrl = $lParam                  ; 控件句柄, 不同于 控件 ID,此句柄在系统中是该控件独一无二的辨别标志
        If $nID <> 2 And $nNotifyCode = 0 Then ; 检查"IDCANCEL - 2"(IDCANCEL 取消按钮? IDOK, 确定按钮?)
                ; 按下回车键时, 自绘按钮不会发送任何信息(注释掉下面第四行代码 PostButtonClick($hWnd, $nCtrlID) 后,对按钮1按回车是不再有响应的)
                ; 所以" IDOK - 1 "信息发生时, 要检查当前焦点是否在该控件上面
                If $nID = 1 Then ; IDOK
                        Local $hFocus = DllCall("user32.dll", "hwnd", "GetFocus") ; 获取焦点所在的控件指针
                        Local $nCtrlID = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $hFocus) ; 获取该指针指向的控件ID
                        PostButtonClick($hWnd, $nCtrlID) ; 重新发送一个 WM_COMMAND 消息给该控件.
                Else
                        MsgBox(4096, "MY_WM_COMMAND", "GUIHWnd" & @TAB & ":" & $hWnd & @LF & _
                                        "MsgID" & @TAB & ":" & $Msg & @LF & _
                                        "wParam" & @TAB & ":" & $wParam & @LF & _
                                        "lParam" & @TAB & ":" & $lParam & @LF & @LF & _
                                        "WM_COMMAND - Infos:" & @LF & _
                                        "-----------------------------" & @LF & _
                                        "Code" & @TAB & ":" & $nNotifyCode & @LF & _
                                        "CtrlID" & @TAB & ":" & $nID & @LF & _
                                        "CtrlHWnd" & @TAB & ":" & $hCtrl)
                EndIf
                Return 0 ; 仅仅是按钮点击的试验? Only workout clicking on the button
        EndIf
        ; 继续运行默认的 AutoIt3 内部的消息处理命令.
        ; 你也可以在此延长代码.
        ; !!! 但是 'Return' (不带任何返回值) 后就不会执行后面的 AutoIt3 默认的消息处理.
        Return $GUI_RUNDEFMSG
EndFunc   ;==>MY_WM_COMMAND

如果运行代码测试过, 大家应该都明白了上面的"$nNotifyCode = 0 "成立的条件就是: 按回车键或点击鼠标.
大家也应该能理解" $nID <> 2 " 时,就是对控件进行操作.
但反过来,$nID = 2什么时候能成立? 还有接下来的 $nID = 1 又意味着什么?
注释里有两个未知字眼:IDCANCEL - 2   ;IDOK - 1
我极怀疑 AutoIt 也有 类似 $IDOK 的常量定义, 搜索许久, 在 APIConstants.au3 的第2985行, 找到被注释掉的'定义':
;Global Const $IDCANCEL = 2
;Global Const $IDOK = 1
但毕竟是被注释掉的东西, 丝毫无说服力了. 于是我转向线上搜索. 得到的内容也不多, 都是与C++/C# 之类相关.
个人认为有用的内容如下, 并确定它们就代表'确定'与'取消':
A.   "表示那个对话框是用确定关闭 IDOK (回车,确定按钮都可能)
       "还是取消按钮关闭 IDCANCEL (esc,取消按钮都可以)"
B.   "点模态对话框上默认的OK按钮,对话框就结束并且DoModal返回IDOK,如果点的是Cancel,返回的就是IDCANCEL"
C.   "IDOK和IDCANCEL表示确定和取消"

songshu 发表于 2012-6-15 00:26:35

二〇一二年六月十五日 每日签到

ooxxgod 发表于 2012-6-15 01:02:27

在看球 是不来签到

zw196512 发表于 2012-6-15 03:50:17

2012年06月15日星期五签到。

pighead456 发表于 2012-6-15 06:39:49

2012年06月15日星期五签到

whitehead 发表于 2012-6-15 07:16:19

2012年06月15日星期五签到。

hlzxcjx 发表于 2012-6-15 07:51:43

2012-6-15 7:51:21 签到.

zerobin 发表于 2012-6-15 08:10:23

到到到签到

lby0711 发表于 2012-6-15 08:23:13

2012-6-15 签到来了。
页: 218 219 220 221 222 223 224 225 226 227 [228] 229 230 231 232 233 234 235 236 237
查看完整版本: AUTOIT CN 每日签到贴!