下列自定函数,是在另外一个帖子里找到的,我做了代码精简,就变成了下面这个样子,不需要插入头文件。
这个是用来限制GUICtrlCreateInput输入的类型的,它的难能可贵之处在于可以实时检测。我仔细看了一下,主要通过_Input_Changed($hWnd, $CtrlId)这个函数里的正则来实现的,于是我就想,通过变换正则,就可以实现多种限制,太爽了。可是遇到一个问题,如果不加修改,那一个脚本里只能检测一种,光修改正则,就全部堆到脚本里,是不行的。所以我就动手把所有的变量都修改掉,函数名也修改掉,正则那里修改成自己想要限制的类型,然后放入到同一个脚本里,但是发现根本就不行。琢磨了几天都没进展。大家帮忙看看,需要怎么才能实现我这个想法?欢迎指点。谢谢!
Global Const $GUI_EVENT_CLOSE = -3
Global Const $GUI_RUNDEFMSG = 'GUI_RUNDEFMSG'
Global $sToolTip_Text[2] = ["对不起,不支持中文字符!", "错误:"]
Global $sInputs_Array[1]
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
GUIRegisterMsg($WM_MOVE, "WM_CLEAR_TOOLTIP")
GUIRegisterMsg($WM_LBUTTONDOWN, "WM_CLEAR_TOOLTIP")
GUIRegisterMsg($WM_RBUTTONDOWN, "WM_CLEAR_TOOLTIP")
Func _GuiInputSetNotCN($CtrlId)
Local $iUbound = UBound($sInputs_Array)
ReDim $sInputs_Array[$iUbound + 1]
$sInputs_Array[$iUbound] = $CtrlId
EndFunc ;==>_GuiInputSetNotCN
Func _Input_Changed($hWnd, $CtrlId)
ToolTip("")
Local $Read_Input = GUICtrlRead($CtrlId)
If StringRegExp($Read_Input, '[^\x00-\xff]') Then
GUICtrlSetData($CtrlId, StringRegExpReplace($Read_Input, '[^\x00-\xff]', ''))
Local $Gui_Get_Pos = WinGetPos($hWnd)
Local $Ctrl_Get_Pos = ControlGetPos($hWnd, "", $CtrlId)
Local Const $SM_CYCAPTION = 4
Local Const $SM_CXFIXEDFRAME = 7
Local $X_Pos = $Gui_Get_Pos[0] + $Ctrl_Get_Pos[0] + $Ctrl_Get_Pos[2] + GetSystemMetrics($SM_CXFIXEDFRAME)
Local $Y_Pos = $Gui_Get_Pos[1] + $Ctrl_Get_Pos[1] + $Ctrl_Get_Pos[3] + GetSystemMetrics($SM_CYCAPTION)
ToolTip($sToolTip_Text[0], $X_Pos, $Y_Pos, $sToolTip_Text[1], 3, 1 + 4)
DllCall("user32.dll", "int", "MessageBeep", "int", 0x0)
EndIf
EndFunc ;==>_Input_Changed
Func WM_CLEAR_TOOLTIP($hWnd, $iMsg, $wParam, $lParam)
ToolTip("")
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_CLEAR_TOOLTIP
Func MY_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
If $hWnd = 0 Or Not WinExists($hWnd) Then Return $GUI_RUNDEFMSG
Local $nNotifyCode = BitShift($wParam, 16)
Local $nID = BitAND($wParam, 0xFFFF)
Local Const $EN_CHANGE = 0x300
Local Const $EN_UPDATE = 0x400
Local Const $EN_SETFOCUS = 0x100
Local Const $EN_KILLFOCUS = 0x200
For $i = 1 To UBound($sInputs_Array) - 1
If $nID = $sInputs_Array[$i] Then
Switch $nNotifyCode
Case $EN_UPDATE
_Input_Changed($hWnd, $sInputs_Array[$i])
Case $EN_SETFOCUS, $EN_KILLFOCUS
ToolTip("")
EndSwitch
ExitLoop
EndIf
Next
Return $GUI_RUNDEFMSG
EndFunc ;==>MY_WM_COMMAND
Func GetSystemMetrics($Flag)
Local $iRet = DllCall('user32.dll', 'int', 'GetSystemMetrics', 'int', $Flag)
Return $iRet[0]
EndFunc ;==>GetSystemMetrics
$GUI = GUICreate("_GuiInputSetNotCN() Demo", 400, 100)
$Input_1 = GUICtrlCreateInput("", 20, 10, 360, 20)
_GuiInputSetNotCN($Input_1)
$Input_2 = GUICtrlCreateInput("", 20, 40, 360, 20)
_GuiInputSetNotCN($Input_2)
$Exit = GUICtrlCreateButton("Exit", 20, 70, 60, 20)
GUISetState()
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $Exit
ExitLoop
EndSwitch
WEnd
|