关于文本控件获取焦点即全选中的BUG【已解决】
本帖最后由 xyold1 于 2011-1-30 18:52 编辑下面的代码是在A版的写的一段代码上改的,不过改出BUG来了,晕{:face (394):}
表现为,点Input1 ,使内部文本全选,再激活其它窗口,然后再点击Input2 ,这时窗口就会假死,是哪里出问题了呢?
Opt('GUIOnEventMode', 1)
GUICreate('窗口')
GUISetOnEvent(-3, '_Exit')
$Input1 = GUICtrlCreateInput('这个点击即全选', 50, 50, 200, 20)
$hInput1 = GUICtrlGetHandle(-1)
$Input2 = GUICtrlCreateInput('这个点击即全选', 50, 110, 200, 20)
$hInput2 = GUICtrlGetHandle(-1)
GUICtrlCreateInput('这个不会全选,点哪是哪', 50, 80, 200, 20)
GUISetState()
GUIRegisterMsg(0x0111, 'WM_COMMAND')
While 1
Sleep(100)
WEnd
Func _Exit()
Exit
EndFunc ;==>_Exit
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg
If $ilParam = $hInput1 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input1, 256)
If $ilParam = $hInput2 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input2, 256)
EndFunc ;==>WM_COMMAND 顶下,看看楼下的回答 上面的情况不停地判断两个文本控件的状态,并使其全选,下面是Debug_Mode模下的输出代码,对Windows消息不太了解,请高手指点
WEnd
0016: 0-0: Sleep(100)
0017: 0-0: WEnd
0016: 0-0: Sleep(100)
0017: 0-0: WEnd
0016: 0-0: Sleep(100)
0024: 0-0: #forceref $hWnd, $iMsg
0025: 0-0: If $ilParam = $hInput1 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input1, 256)
0026: 0-0: If $ilParam = $hInput2 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input2, 256)
0027: 0-0: EndFunc ;==>WM_COMMAND
0024: 0-0: #forceref $hWnd, $iMsg
0025: 0-0: If $ilParam = $hInput1 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input1, 256)
0026: 0-0: If $ilParam = $hInput2 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input2, 256)
0027: 0-0: EndFunc ;==>WM_COMMAND
0024: 0-0: #forceref $hWnd, $iMsg
0025: 0-0: If $ilParam = $hInput1 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input1, 256)
0026: 0-0: If $ilParam = $hInput2 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input2, 256)
0027: 0-0: EndFunc ;==>WM_COMMAND
0024: 0-0: #forceref $hWnd, $iMsg
0025: 0-0: If $ilParam = $hInput1 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input1, 256)
0026: 0-0: If $ilParam = $hInput2 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input2, 256)
0027: 0-0: EndFunc ;==>WM_COMMAND
0024: 0-0: #forceref $hWnd, $iMsg
0025: 0-0: If $ilParam = $hInput1 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input1, 256)
0026: 0-0: If $ilParam = $hInput2 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input2, 256)
0027: 0-0: EndFunc ;==>WM_COMMAND
0024: 0-0: #forceref $hWnd, $iMsg
0025: 0-0: If $ilParam = $hInput1 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input1, 256)
0026: 0-0: If $ilParam = $hInput2 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input2, 256)
0027: 0-0: EndFunc ;==>WM_COMMAND 这根本不是BUG。不明白为何要这样写,wparam的高位已经是EN_SETFOCUS,说明编辑框已经接收到焦点了,为何还要用GUICtrlSetState(..., $GUI_FOCUS)重新设置一下呢?这样写不会引发递归错误吗?~ 回复 4# pusofalse
抄的A版的,没经过大脑,{:face (229):} 下面是我的解决方法,用的鼠标判断,没有上面的错误
Opt('GUIOnEventMode', 1)
#AutoIt3Wrapper_Run_Debug_Mode=Y
GUICreate('窗口')
GUISetOnEvent(-3, '_Exit')
#include <GUIConstantsEx.au3>
$Input1 = GUICtrlCreateInput('这个点击即全选', 50, 50, 200, 20)
$hInput1 = GUICtrlGetHandle(-1)
$Input2 = GUICtrlCreateInput('这个点击即全选', 50, 110, 200, 20)
$hInput2 = GUICtrlGetHandle(-1)
;GUICtrlCreateInput('这个不会全选,点哪是哪', 50, 80, 200, 20)
GUISetState()
;~ GUIRegisterMsg(0x0111, 'WM_COMMAND')
GUISetOnEvent($GUI_EVENT_PRIMARYUP, "SpecialEvents")
While 1
Sleep(100)
WEnd
Func SpecialEvents()
$a = GUIGetCursorInfo()
If Not @error And $a<>0 Then
GUICtrlSetState($a, 256)
EndIf
EndFunc
Func _Exit()
Exit
EndFunc ;==>_Exit 上面这个方法不怎么好,如果用的是Edit控件那么可以用_GUICtrlEdit_SetSel($Input1, 0, -1)来全选。
而Input框不行
{:face (394):} 回复 7# xyold1
Edit和Input不都是一种控件吗~? - -||| 本帖最后由 xyold1 于 2011-1-30 19:02 编辑
回复 8# pusofalse
刚才试了,_GUICtrlEdit_SetSel只识别编辑框 ,对输入框 无作用,我的程序里全是输入框 ,要改成编辑框的话,太麻烦了
我也不明白,同属于Edit类,差距怎么就这么大呢 回复 9# xyold1
把你的测试代码贴上来。 回复 10# pusofalse
P版看看哪里错了{:face (239):}Opt('GUIOnEventMode', 1)
#AutoIt3Wrapper_Run_Debug_Mode=Y
GUICreate('窗口')
GUISetOnEvent(-3, '_Exit')
#include <GUIConstantsEx.au3>
#include <GuiEdit.au3>
#include <GuiStatusBar.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
$Input1 = GUICtrlCreateEdit('这个点击即全选', 50, 50, 200, 20,BitOR($ES_WANTRETURN, $WS_VSCROLL))
$hInput1 = GUICtrlGetHandle(-1)
$Input2 = GUICtrlCreateInput('这个点击即全选', 50, 110, 200, 20)
$hInput2 = GUICtrlGetHandle(-1)
GUICtrlCreateInput('这个不会全选,点哪是哪', 50, 80, 200, 20)
GUISetState()
GUIRegisterMsg(0x0111, 'WM_COMMAND')
;~ GUISetOnEvent($GUI_EVENT_PRIMARYUP, "SpecialEvents")
While 1
Sleep(100)
WEnd
Func SpecialEvents()
$a = GUIGetCursorInfo()
If Not @error And $a<>0 Then
GUICtrlSetState($a, 256)
EndIf
EndFunc
Func _Exit()
Exit
EndFunc ;==>_Exit
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg
If $ilParam = $hInput1 And BitShift($iwParam, 16) = 256 Then
_GUICtrlEdit_SetSel($Input1, 0, -1)
EndIf
;~ GUICtrlSetState($Input1, 256)
If $ilParam = $hInput2 And BitShift($iwParam, 16) = 256 Then
_GUICtrlEdit_SetSel($Input2, 0, -1)
EndIf
EndFunc ;==>WM_COMMAND 改成edit控件,也不麻烦啊
#include <EditConstants.au3>
Opt('GUIOnEventMode', 1)
GUICreate('窗口')
GUISetOnEvent(-3, '_Exit')
$Input1 = GUICtrlCreateEdit('这个点击即全选', 50, 50, 200, 20,$GUI_SS_DEFAULT_INPUT)
$Input2 = GUICtrlCreateEdit('这个点击即全选', 50, 110, 200, 20,$GUI_SS_DEFAULT_INPUT)
GUICtrlCreateInput('这个不会全选,点哪是哪', 50, 80, 200, 20)
GUISetState()
GUIRegisterMsg(0x0111, 'WM_COMMAND')
While 1
Sleep(100)
WEnd
Func _Exit()
Exit
EndFunc ;==>_Exit
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
$nNotifyCode = BitShift($iwParam, 16)
$nID = BitAND($iwParam, 0x000FFFF)
Switch $nID
Case $Input1
If $nNotifyCode = 256 Then _
GUICtrlSendMsg($Input1,0x00b1,0,7)
Case $Input2
If $nNotifyCode = 256 Then _
GUICtrlSendMsg($Input2,0x00b1,0,7)
EndSwitch
EndFunc ;==>WM_COMMAND
回复 12# 风行者
谢谢风行者 又修改了一下,这下算是完美了
Opt('GUIOnEventMode', 1)
#AutoIt3Wrapper_Run_Debug_Mode=Y
GUICreate('窗口')
GUISetOnEvent(-3, '_Exit')
#include <GUIConstantsEx.au3>
#include <GuiEdit.au3>
#include <GuiStatusBar.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
$Input1 = GUICtrlCreateEdit('这个点击即全选', 50, 50, 200, 20,BitOR($ES_WANTRETURN, $WS_VSCROLL))
$hInput1 = GUICtrlGetHandle(-1)
$Input2 = GUICtrlCreateInput('这个点击即全选', 50, 110, 200, 20)
$hInput2 = GUICtrlGetHandle(-1)
GUICtrlCreateInput('这个不会全选,点哪是哪', 50, 80, 200, 20)
GUISetState()
GUIRegisterMsg(0x0111, 'WM_COMMAND')
;~ GUISetOnEvent($GUI_EVENT_PRIMARYUP, "SpecialEvents")
While 1
Sleep(100)
WEnd
Func SpecialEvents()
$a = GUIGetCursorInfo()
If Not @error And $a<>0 Then
GUICtrlSetState($a, 256)
EndIf
EndFunc
Func _Exit()
Exit
EndFunc ;==>_Exit
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
$a = GUIGetCursorInfo()
If Not @error And $a<>0 Then
GUICtrlSetState($a, 256)
EndFunc ;==>WM_COMMAND 少了个endif
页:
[1]
2