基 础 函 数 参 考
GUIRegisterMsg
注册 Windows 消息 ID (WM_MSG) 的自定义函数.
参 数
消息ID |
A Windows 消息 ID (见附录: Windows 消息代码表). |
函数 |
消息出现时调用的自定义函数名称, 或使用空字符串 "" 注销消息. |
返 回 值
备 注
!!! 要使用户函数能正常工作, 必须定义最多 4 个参数. 否则函数将不能被调用!!!
例如:
Func MyUserFunction($hWndGUI, $MsgID, $WParam, $LParam)
...
EndFunc
或
Func MyUserFunction($hWndGUI, $MsgID)
...
EndFunc
当用户函数被调用时, 这 4 个参数有下列值:
参数位置
|
参数值
|
意义
|
1 |
hWnd |
出现消息的 GUI 窗口句柄. |
2 |
Msg |
Windows 消息 ID. |
3 |
wParam |
十六进制值的第一个消息参数. |
4 |
lParam |
十六进制值的第二个消息参数. |
可以注册多达 256 个消息 ID 的用户函数.
默认用户函数完成后, AutoIt 内部消息处理程序将继续进行.
使用的关键字 "Return" 后面不带任何参数, 将没有返回值(见示例中的 WM_COMMAND).
使用不带任何参数的 "Return", AutoIt 内部消息处理程序(如果此时有一个消息)将不会被执行!
!!! 如果要运行 AutoIt 内部消息处理程序, 需使用 "Return $GUI_RUNDEFMSG"语句
($GUI_RUNDEFMSG 在 GUIConstantsEx.au3 中定义, 见示例) !!!
即早于用户函数结束前取得返回值, 以便执行 AutoIt 内部消息处理程序.
警告: 使用"Msgbox()"中断用户函数执行的窗口消息命令, 可能会导致意外的行为.
应尽可能快速返回到系统 !!!
一些内部控件会消耗(使用)特定的 Windows 消息 ID,
因此注册他们将没有任何效果, 例如 WM_CHAR, WM_KEYDOWN, WM_KEYUP 将消耗(使用)编辑控件.
相 关 函 数
GUICtrlGetHandle
函 数 示 例
;
*******************************************************
; 示例 - 创建一个
ownerdrawn(所有者绘制)/彩色按钮
;
*******************************************************
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
Example()
Func Example()
Local
Const $BS_OWNERDRAW
= 0x0000000B
Local
$nButton,
$nButton2,
$GUIMsg
GUICreate("ownerdrawn(所有者绘制)创建的按钮",
300, 200)
$nButton = GUICtrlCreateButton("",
90, 50, 120, 30)
GUICtrlSetStyle($nButton, BitOR($WS_TABSTOP, $BS_NOTIFY, $BS_OWNERDRAW)) ; 设置 ownerdrawn (所有者绘制)标志
$nButton2 = GUICtrlCreateButton("常规按钮", 90,
110, 120, 30)
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
; 注册
WM_DRAWITEM 显示 GUI 函数, 否则不能完成初始绘图
GUIRegisterMsg($WM_DRAWITEM , "MY_WM_DRAWITEM")
GUISetState()
While
1
$GUIMsg = GUIGetMsg()
Switch $GUIMsg
Case $GUI_EVENT_CLOSE
ExitLoop
Case $nButton
; 一般情况下不应该运行 MY_WM_COMMAND
函数
MsgBox(0,
"信息", "按钮 1 被点击")
Case $nButton2
; 一般情况下不应该运行 MY_WM_COMMAND
函数
MsgBox(0,
"信息", "按钮 2 被点击")
EndSwitch
WEnd
EndFunc ;==>Example
; 处理按钮点击
Func MY_WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
Local
$nNotifyCode =
BitShift($wParam, 16)
Local
$nID = BitAND($wParam, 0x0000FFFF)
Local
$hCtrl =
$lParam
If
$nID <>
2 And $nNotifyCode = 0 Then ; 检查
IDCANCEL - 2
; Ownerdrawn 按钮按 ENTER 键不发送什么
; 因此, IDOK - 1 出现, 现在检查控件具有当前焦点
If $nID = 1 Then
Local $hFocus
= DllCall("user32.dll", "hwnd", "GetFocus")
Local $nCtrlID
= DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $hFocus[0])
PostButtonClick($hWnd, $nCtrlID[0])
Else
MsgBox(0, "MY_WM_COMMAND", "窗口句柄" & @TAB & ":" & $hWnd & @LF & _
"消息 ID"
& @TAB
& ":"
& $Msg
& @LF
& _
"wParam"
& @TAB
& ":"
& $wParam
& @LF
& _
"lParam"
& @TAB
& ":"
& $lParam
& @LF
& @LF
& _
"WM_COMMAND -
信息:" & @LF & _
"-----------------------------" & @LF & _
"代码"
& @TAB
& ":"
& $nNotifyCode
& @LF
& _
"控件 ID"
& @TAB
& ":"
& $nID
& @LF
& _
"控件句柄"
& @TAB
& ":"
& $hCtrl)
EndIf
Return 0 ;
只是练习按钮点击
EndIf
; 继续执行默认
Autoit3 内部消息命令.
;
您也可以跳过这行.
; !!! 仅使用
'Return' (不带任何值)
; 将无法在后来继续默认
Autoit3 消息 !!!
Return $GUI_RUNDEFMSG
EndFunc ;==>MY_WM_COMMAND
; RePost a WM_COMMAND message to a ctrl in a gui
window
Func PostButtonClick($hWnd, $nCtrlID)
DllCall("user32.dll", "int", "PostMessage", _
"hwnd",
$hWnd, _
"int", $WM_COMMAND, _
"int", BitAND($nCtrlID, 0x0000FFFF), _
"hwnd",
GUICtrlGetHandle($nCtrlID))
EndFunc ;==>PostButtonClick
; 绘制按钮
Func MY_WM_DRAWITEM
($hWnd, $Msg,
$wParam,
$lParam)
#forceref
$Msg, $wParam, $lParam
Local
$stDrawItem = DllStructCreate("uint;uint;uint;uint;uint;uint;uint;int[4];dword",
$lParam)
Local
Const $ODT_BUTTON
= 4
Local
$nCtlType =
DllStructGetData($stDrawItem , 1)
If
$nCtlType =
$ODT_BUTTON Then
;~ Local $nCtrlID =
DllStructGetData($stDrawItem , 2)
Local $nItemState = DllStructGetData($stDrawItem , 5)
Local $hCtrl = DllStructGetData($stDrawItem , 6)
Local $hDC = DllStructGetData($stDrawItem , 7)
Local $nLeft = DllStructGetData($stDrawItem , 8,
1)
Local $nTop = DllStructGetData($stDrawItem , 8,
2)
Local $nRight = DllStructGetData($stDrawItem , 8,
3)
Local $nBottom = DllStructGetData($stDrawItem , 8,
4)
Local $sText = "Ownerdrawn Button"
Local $nTextColor = 0x5555DD
Local $nBackColor = 0xFFEEDD
DrawButton($hWnd, $hCtrl, $hDC, $nLeft, $nTop, $nRight, $nBottom, $nItemState, $sText, $nTextColor, $nBackColor)
$stDrawItem = 0
Return 1
EndIf
$stDrawItem = 0
Return $GUI_RUNDEFMSG
; 继续执行默认 Autoit3 内部消息命令
EndFunc ;==>MY_WM_DRAWITEM
; 主要的绘图程序
Func DrawButton($hWnd, $hCtrl, $hDC, $nLeft, $nTop, $nRight, $nBottom, $nItemState, $sText, $nTextColor, $nBackColor)
#forceref
$hWnd
;Local
$bDefault = FALSE
Local
Const $GWL_STYLE
= -16
Local
Const $ODS_SELECTED
= 0x0001
Local
Const $ODS_GRAYED
= 0x0002
Local
Const $ODS_DISABLED
= 0x0004
;~ Local Const $ODS_CHECKED =
0x0008
Local
Const $ODS_FOCUS
= 0x0010
;~ Local Const $ODS_HOTLIGHT =
0x0040
;~ Local Const $ODS_INACTIVE =
0x0080
;~ Local Const $ODS_NOACCEL =
0x0100
;~ Local Const $ODS_NOFOCUSRECT =
0x0200
Local
Const $DFC_BUTTON
= 4
Local
Const $DFCS_BUTTONPUSH = 0x0010
;~ Local $bChecked = BitAND($nItemState,
$ODS_CHECKED)
Local
$bFocused =
BitAND($nItemState, $ODS_FOCUS)
Local
$bGrayed =
BitAND($nItemState, BitOR($ODS_GRAYED, $ODS_DISABLED))
Local
$bSelected =
BitAND($nItemState, $ODS_SELECTED)
Local
$stRect =
DllStructCreate("int;int;int;int")
DllStructSetData($stRect, 1, $nLeft)
DllStructSetData($stRect, 2, $nTop)
DllStructSetData($stRect, 3, $nRight)
DllStructSetData($stRect, 4, $nBottom)
Local
$nClrTxt
If
$bGrayed Then
$nClrTxt = SetTextColor($hDC, GetSysColor($COLOR_HIGHLIGHTTEXT))
ElseIf $nTextColor = -1
Then
$nClrTxt = SetTextColor($hDC, GetSysColor($COLOR_BTNTEXT))
Else
$nClrTxt = SetTextColor($hDC, $nTextColor)
EndIf
Local
$hBrush,
$nClrSel
If
$nBackColor =
-1 Then
$hBrush = GetSysColorBrush($COLOR_BTNFACE)
$nClrSel = GetSysColor($COLOR_BTNFACE)
Else
$hBrush = CreateSolidBrush($nBackColor)
$nClrSel = $nBackColor;
EndIf
Local
$nClrBk =
SetBkColor($hDC,
$nClrSel)
Local
$hOldBrush =
SelectObject($hDC,
$hBrush)
Local
$nTmpLeft =
$nLeft
Local
$nTmpTop =
$nTop
Local
$nTmpRight =
$nRight
Local
$nTmpBottom =
$nBottom
If
$bSelected Then
InflateRect($nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, -1,
-1)
Local $hBrushSel = CreateSolidBrush(GetSysColor($COLOR_BTNSHADOW))
FrameRect($hDC, $nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, $hBrushSel)
DeleteObject($hBrushSel)
Else
If $bFocused And Not $bSelected Then InflateRect($nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, -1,
-1)
DrawFrameControl($hDC, $nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, $DFC_BUTTON, $DFCS_BUTTONPUSH)
EndIf
$nTmpLeft = $nLeft
$nTmpTop = $nTop
$nTmpRight = $nRight
$nTmpBottom = $nBottom
If
$bSelected Then
InflateRect($nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, -2,
-2)
Else
If $bFocused And Not $bSelected Then
InflateRect($nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, -3,
-3)
$nTmpLeft -=
1
$nTmpTop -=
1
Else
InflateRect($nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, -2,
-2)
$nTmpLeft -=
1
$nTmpTop -=
1
EndIf
EndIf
FillRect($hDC,
$nTmpLeft,
$nTmpTop,
$nTmpRight,
$nTmpBottom,
$hBrush)
If
$bSelected Or
$bGrayed Then
$nTmpLeft = $nTmpLeft + 2
$nTmpTop = $nTmpTop + 2
EndIf
Local
$uFlags =
BitOR($DT_NOCLIP, $DT_CENTER, $DT_VCENTER)
If
Not BitAND(GetWindowLong($hCtrl, $GWL_STYLE), $BS_MULTILINE) Then $uFlags = BitOR($uFlags, $DT_SINGLELINE)
DrawText($hDC,
$sText,
$nTmpLeft,
$nTmpTop,
$nTmpRight,
$nTmpBottom,
$uFlags)
If
$bGrayed Then
$nTmpLeft = $nLeft
$nTmpTop = $nTop
$nTmpRight = $nRight
$nTmpBottom = $nBottom
$nTmpLeft -= 1
$nClrTxt = SetTextColor($hDC, GetSysColor($COLOR_GRAYTEXT))
DrawText($hDC, $sText, $nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, BitOR($DT_NOCLIP, $DT_CENTER, $DT_VCENTER, $DT_SINGLELINE))
EndIf
$nTmpLeft = $nLeft
$nTmpTop = $nTop
$nTmpRight = $nRight
$nTmpBottom = $nBottom
If
$bFocused Then
$hBrush = CreateSolidBrush(0)
FrameRect($hDC, $nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, $hBrush)
$nTmpLeft = $nLeft
$nTmpTop = $nTop
$nTmpRight = $nRight
$nTmpBottom = $nBottom
InflateRect($nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, -4,
-4)
DrawFocusRect($hDC, $nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom)
EndIf
SelectObject($hDC,
$hOldBrush)
DeleteObject($hBrush)
SetTextColor($hDC,
$nClrTxt)
SetBkColor($hDC,
$nClrBk)
Return 1
EndFunc ;==>DrawButton
; 一些图形/窗口函数
Func CreateSolidBrush($nColor)
Local
$hBrush =
DllCall("gdi32.dll", "hwnd", "CreateSolidBrush",
"int", $nColor)
Return $hBrush[0]
EndFunc ;==>CreateSolidBrush
Func GetSysColor($nIndex)
Local
$nColor =
DllCall("user32.dll", "int", "GetSysColor", "int", $nIndex)
Return $nColor[0]
EndFunc ;==>GetSysColor
Func GetSysColorBrush($nIndex)
Local
$hBrush =
DllCall("user32.dll", "hwnd", "GetSysColorBrush",
"int", $nIndex)
Return $hBrush[0]
EndFunc ;==>GetSysColorBrush
Func DrawFrameControl($hDC, $nLeft, $nTop, $nRight, $nBottom, $nType, $nState)
Local
$stRect =
DllStructCreate("int;int;int;int")
DllStructSetData($stRect, 1, $nLeft)
DllStructSetData($stRect, 2, $nTop)
DllStructSetData($stRect, 3, $nRight)
DllStructSetData($stRect, 4, $nBottom)
DllCall("user32.dll", "int", "DrawFrameControl",
"hwnd",
$hDC, "ptr", DllStructGetPtr($stRect), "int", $nType, "int", $nState)
$stRect = 0
EndFunc ;==>DrawFrameControl
Func DrawFocusRect($hDC, $nLeft, $nTop, $nRight, $nBottom)
Local
$stRect =
DllStructCreate("int;int;int;int")
DllStructSetData($stRect, 1, $nLeft)
DllStructSetData($stRect, 2, $nTop)
DllStructSetData($stRect, 3, $nRight)
DllStructSetData($stRect, 4, $nBottom)
DllCall("user32.dll", "int", "DrawFocusRect", "hwnd", $hDC, "ptr", DllStructGetPtr($stRect))
$stRect = 0
EndFunc ;==>DrawFocusRect
Func DrawText($hDC, $sText, $nLeft, $nTop, $nRight, $nBottom, $nFormat)
Local
$nLen =
StringLen($sText)
Local
$stRect =
DllStructCreate("int;int;int;int")
DllStructSetData($stRect, 1, $nLeft)
DllStructSetData($stRect, 2, $nTop)
DllStructSetData($stRect, 3, $nRight)
DllStructSetData($stRect, 4, $nBottom)
Local
$stText =
DllStructCreate("char[260]")
DllStructSetData($stText, 1, $sText)
DllCall("user32.dll", "int", "DrawText", "hwnd", $hDC, "ptr", DllStructGetPtr($stText), "int", $nLen, "ptr", DllStructGetPtr($stRect), "int", $nFormat)
$stRect = 0
$stText = 0
EndFunc ;==>DrawText
Func FillRect($hDC, $nLeft, $nTop, $nRight, $nBottom, $hBrush)
Local
$stRect =
DllStructCreate("int;int;int;int")
DllStructSetData($stRect, 1, $nLeft)
DllStructSetData($stRect, 2, $nTop)
DllStructSetData($stRect, 3, $nRight)
DllStructSetData($stRect, 4, $nBottom)
DllCall("user32.dll", "int", "FillRect", "hwnd", $hDC, "ptr", DllStructGetPtr($stRect), "hwnd", $hBrush)
$stRect = 0
EndFunc ;==>FillRect
Func FrameRect($hDC, $nLeft, $nTop, $nRight, $nBottom, $hBrush)
Local
$stRect =
DllStructCreate("int;int;int;int")
DllStructSetData($stRect, 1, $nLeft)
DllStructSetData($stRect, 2, $nTop)
DllStructSetData($stRect, 3, $nRight)
DllStructSetData($stRect, 4, $nBottom)
DllCall("user32.dll", "int", "FrameRect", "hwnd", $hDC, "ptr", DllStructGetPtr($stRect), "hwnd", $hBrush)
$stRect = 0
EndFunc ;==>FrameRect
Func InflateRect(ByRef $nLeft, ByRef $nTop, ByRef $nRight, ByRef $nBottom, $nX, $nY)
Local
$stRect =
DllStructCreate("int;int;int;int")
DllStructSetData($stRect, 1, $nLeft)
DllStructSetData($stRect, 2, $nTop)
DllStructSetData($stRect, 3, $nRight)
DllStructSetData($stRect, 4, $nBottom)
DllCall("user32.dll", "int", "InflateRect", "ptr", DllStructGetPtr($stRect), "int", $nX, "int", $nY)
$nLeft = DllStructGetData($stRect, 1)
$nTop
= DllStructGetData($stRect, 2)
$nRight = DllStructGetData($stRect, 3)
$nBottom = DllStructGetData($stRect, 4)
$stRect = 0
EndFunc ;==>InflateRect
Func SetBkColor($hDC, $nColor)
Local
$nOldColor =
DllCall("gdi32.dll", "int", "SetBkColor", "hwnd", $hDC,
"int", $nColor)
Return $nOldColor[0]
EndFunc ;==>SetBkColor
Func SetTextColor($hDC, $nColor)
Local
$nOldColor =
DllCall("gdi32.dll", "int", "SetTextColor", "hwnd", $hDC,
"int", $nColor)
Return $nOldColor[0]
EndFunc ;==>SetTextColor
Func SelectObject($hDC, $hObj)
Local
$hOldObj =
DllCall("gdi32.dll", "hwnd", "SelectObject", "hwnd", $hDC,
"hwnd",
$hObj)
Return $hOldObj[0]
EndFunc ;==>SelectObject
Func DeleteObject($hObj)
DllCall("gdi32.dll", "hwnd", "DeleteObject", "hwnd", $hObj)
EndFunc ;==>DeleteObject
Func GetWindowLong($hWnd, $nIndex)
Local
$nVal =
DllCall("user32.dll", "int", "GetWindowLong", "hwnd", $hWnd, "int", $nIndex)
Return $nVal[0]
EndFunc ;==>GetWindowLong