找回密码
 加入
搜索
楼主: athland5013

AUTOIT CN 每日签到贴!

 火... [复制链接]
发表于 2012-6-14 17:18:55 | 显示全部楼层
2012年06月14日,签到!
发表于 2012-6-14 17:37:44 | 显示全部楼层
2012-6-14 17:37:22 签到.
发表于 2012-6-14 18:42:08 | 显示全部楼层
坚持签到,支持论坛。
发表于 2012-6-14 20:41:58 | 显示全部楼层
2012-6-14 20:41:26 签到.
发表于 2012-6-14 21:52:35 | 显示全部楼层
到。。。到。。。到。。。。。。。。。
发表于 2012-6-14 22:08:10 | 显示全部楼层
每日来签到
发表于 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[0]) 后,对按钮1按回车是不再有响应的)
                ; 所以" IDOK - 1 "信息发生时, 要检查当前焦点是否在该控件上面
                If $nID = 1 Then ; IDOK
                        Local $hFocus = DllCall("user32.dll", "hwnd", "GetFocus") ; 获取焦点所在的控件指针
                        Local $nCtrlID = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $hFocus[0]) ; 获取该指针指向的控件ID
                        PostButtonClick($hWnd, $nCtrlID[0]) ; 重新发送一个 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表示确定和取消"

评分

参与人数 1金钱 +10 贡献 +5 收起 理由
Alam + 10 + 5

查看全部评分

发表于 2012-6-15 00:26:35 | 显示全部楼层
二〇一二年六月十五日 每日签到
发表于 2012-6-15 01:02:27 | 显示全部楼层
在看球 是不来签到
发表于 2012-6-15 03:50:17 | 显示全部楼层
2012年06月15日星期五签到。
发表于 2012-6-15 06:39:49 | 显示全部楼层
2012年06月15日星期五签到
发表于 2012-6-15 07:16:19 | 显示全部楼层
2012年06月15日星期五签到。
发表于 2012-6-15 07:51:43 | 显示全部楼层
2012-6-15 7:51:21 签到.
发表于 2012-6-15 08:10:23 | 显示全部楼层
到到到签到
发表于 2012-6-15 08:23:13 | 显示全部楼层
2012-6-15 签到来了。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-10-7 19:16 , Processed in 0.081907 second(s), 15 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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