xyold1 发表于 2011-1-30 16:40:46

关于文本控件获取焦点即全选中的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

stcyk 发表于 2011-1-30 17:00:03

顶下,看看楼下的回答

xyold1 发表于 2011-1-30 17:07:17

上面的情况不停地判断两个文本控件的状态,并使其全选,下面是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

pusofalse 发表于 2011-1-30 17:49:49

这根本不是BUG。不明白为何要这样写,wparam的高位已经是EN_SETFOCUS,说明编辑框已经接收到焦点了,为何还要用GUICtrlSetState(..., $GUI_FOCUS)重新设置一下呢?这样写不会引发递归错误吗?~

xyold1 发表于 2011-1-30 17:59:35

回复 4# pusofalse

抄的A版的,没经过大脑,{:face (229):}

xyold1 发表于 2011-1-30 18:00:33

下面是我的解决方法,用的鼠标判断,没有上面的错误

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

xyold1 发表于 2011-1-30 18:51:00

上面这个方法不怎么好,如果用的是Edit控件那么可以用_GUICtrlEdit_SetSel($Input1, 0, -1)来全选。
而Input框不行
{:face (394):}

pusofalse 发表于 2011-1-30 18:56:05

回复 7# xyold1


    Edit和Input不都是一种控件吗~? - -|||

xyold1 发表于 2011-1-30 19:00:48

本帖最后由 xyold1 于 2011-1-30 19:02 编辑

回复 8# pusofalse
刚才试了,_GUICtrlEdit_SetSel只识别编辑框 ,对输入框 无作用,我的程序里全是输入框 ,要改成编辑框的话,太麻烦了

我也不明白,同属于Edit类,差距怎么就这么大呢

pusofalse 发表于 2011-1-30 19:05:42

回复 9# xyold1


    把你的测试代码贴上来。

xyold1 发表于 2011-1-30 19:10:18

回复 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

风行者 发表于 2011-1-30 19:41:27

改成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

xyold1 发表于 2011-1-30 20:28:28

回复 12# 风行者

谢谢风行者

xyold1 发表于 2011-1-31 08:25:06

又修改了一下,这下算是完美了



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

menfan1 发表于 2011-1-31 11:37:45

少了个endif
页: [1] 2
查看完整版本: 关于文本控件获取焦点即全选中的BUG【已解决】