找回密码
 加入
搜索
查看: 6239|回复: 6

[AU3基础] 【已解决】Input无输入响应回车

  [复制链接]
发表于 2011-9-18 11:52:18 | 显示全部楼层 |阅读模式
本帖最后由 koflion 于 2011-9-18 14:08 编辑

如果用GUICtrlSetOnEvent注册,输入框只能响应变动过数据的操作,想使用GUIRegisterMsg 获取回车操作然后判断焦点应该可以实现。。,就是不知道该咋写,希望知道的朋友们提个醒。。。谢谢了、、

目的:无论$Input[2]是否输入了信息,按下回车后Button控件获得焦点
#include <GuiConstants.au3>
#include <EditConstants.au3>


Opt("GUIOnEventMode", 1)
Dim $Input[3]
$GUI = GUICreate("测试", 140, 130)
GUISetOnEvent($GUI_EVENT_CLOSE, "GUICtrlMsg")
$Input[1] = GUICtrlCreateInput("", 10, 10, 120, 25, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NOHIDESEL, $ES_AUTOVSCROLL, $ES_WANTRETURN))
GUICtrlSetState(-1, $GUI_FOCUS)
GUICtrlSetFont(-1, 12, 200, 0, "宋体")
$Input[2] = GUICtrlCreateInput("", 10, 50, 120, 25, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_AUTOVSCROLL, $ES_PASSWORD, $ES_WANTRETURN))
GUICtrlSetFont(-1, 12, 100, 0)
$Button = GUICtrlCreateButton("测试", 10, 90, 120, 30)
GUICtrlSetFont(-1, 16, 400, 0)
GUICtrlSetOnEvent($Button, "GUICtrlMsg")
GUICtrlSetOnEvent($Input[1], "GUICtrlMsg")
GUICtrlSetOnEvent($Input[2], "GUICtrlMsg")
GUISetState(@SW_SHOW)
While 1
        Sleep(1000)
WEnd        
        
        
        Func GUICtrlMsg()
        Switch @GUI_CtrlId;选择事件 ID 或 控件 ID
                Case $GUI_EVENT_CLOSE;如果点下的是$GUI_EVENT_CLOSE(关闭)
                        Exit
                Case $Input[1]
                        GUICtrlSetState($Input[2], $GUI_FOCUS)
                Case $Input[2]
                        GUICtrlSetState($Button, $GUI_FOCUS)
                Case $Button
                        MsgBox(0,"","1#输入框:"&GUICtrlRead($Input[1])&@LF&@LF&"2#输入框:"&GUICtrlRead($Input[2]))
        EndSwitch

EndFunc
        

评分

参与人数 1金钱 +15 收起 理由
afan + 15 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2011-9-18 12:49:26 | 显示全部楼层
#include <GuiConstants.au3>
#include <EditConstants.au3>

Opt("GUIOnEventMode", 1)

Dim $Input[3]
$GUI = GUICreate("测试", 140, 130)
GUISetOnEvent($GUI_EVENT_CLOSE, "GUICtrlMsg")
$Input[1] = GUICtrlCreateInput("", 10, 10, 120, 25, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NOHIDESEL, $ES_AUTOVSCROLL, $ES_WANTRETURN))
GUICtrlSetState(-1, $GUI_FOCUS)
$iFOCUS = $Input[1]
GUICtrlSetFont(-1, 12, 200, 0, "宋体")
$Input[2] = GUICtrlCreateInput("", 10, 50, 120, 25, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_AUTOVSCROLL, $ES_PASSWORD, $ES_WANTRETURN))
GUICtrlSetFont(-1, 12, 100, 0)
$Button = GUICtrlCreateButton("测试", 10, 90, 120, 30)
GUICtrlSetFont(-1, 16, 400, 0)
GUICtrlSetOnEvent(-1, "GUICtrlMsg")

GUISetState(@SW_SHOW)
GUIRegisterMsg(0x0111, "MY_WM_COMMAND") ;$WM_COMMAND

While 1
        Sleep(100)
WEnd

Func GUICtrlMsg()
        Switch @GUI_CtrlId;选择事件 ID 或 控件 ID
                Case $GUI_EVENT_CLOSE;如果点下的是$GUI_EVENT_CLOSE(关闭)
                        Exit
                Case $Button
                        MsgBox(0, "", "1#输入框:" & GUICtrlRead($Input[1]) & @LF & @LF & "2#输入框:" & GUICtrlRead($Input[2]))
        EndSwitch
EndFunc   ;==>GUICtrlMsg

Func MY_WM_COMMAND($hWnd, $Msg, $wParam)
        #forceref $hWnd, $iMsg
        $nNotifyCode = BitShift($wParam, 16)
        $nID = BitAND($wParam, 0x0000FFFF)
        If $nID = 1 And $nNotifyCode = 0 Then
                GUICtrlSetState($iFOCUS + 1, $GUI_FOCUS)
                Return 0
        Else
                $iFOCUS = $nID
        EndIf
        Return $GUI_RUNDEFMSG
EndFunc   ;==>MY_WM_COMMAND
 楼主| 发表于 2011-9-18 14:07:43 | 显示全部楼层
原来如此,使用WM_COMMAND (好囧。。帮助里面有。。就是英文的看起来好累,没理解清楚)
百度了下:
WM_COMMAND 当用户点击菜单、按钮、下拉列表框、快捷键等控件时候,会触发WM_COMMAND ,WM_COMMAND消息中有两个参数,wparam、lparam,定义如下:
wParam 高两个字节    通知码
wParam 低两字节     命令ID
lParam 发送命令消息的子窗体句柄。
如果这个消息是由子窗口控件产生,如button产生则: LOWORD(wParam): 控件ID HIWORD(wParam): 通知码   lParam: 子窗口句柄。   如果这个消息是由子窗口或者快捷键产生,则通知码为1,由菜单产生,通知码为0。通过参数,可以区分这个消息的来源是来自于控件,快捷键还是菜单。

测试中wParam 返回的数据格式为:0x00000000(十六位进制的8位数)
A大回复的代码中
$nNotifyCode = BitShift($wParam, 16) (通过右移运算获取高两个字节获取通知码,不过没明白为什么要移动16次,难道是因为是十六进制的??)
题外话:位移运算帮助中的Local $x = BitShift(14, 2)
;  x == 3 因为 1110b 右移两次是 11b == 3 等于我这种没学习过人很难搞懂,最后明白了。。使用的是2进制换算,然后移位,大家别被那个b搞晕了。。我之前也觉得奇怪。。2进制的话不可能有b,16进制的话14是e啊。。倒
$nID = BitAND($wParam, 0x0000FFFF),按位或运算 其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。(这个。。。这个。。太晕了。。不懂待学)
然后就是
If $nID = 1 And $nNotifyCode = 0 Then
呵呵。。明白了。。。非常感谢啊!!!!!
发表于 2011-11-3 22:21:56 | 显示全部楼层
没搞懂  做成4个input 就不行了
发表于 2012-4-6 09:00:20 | 显示全部楼层
upupupupup
发表于 2014-7-14 14:50:16 | 显示全部楼层
学习下,感谢,感谢
发表于 2014-7-21 09:38:13 | 显示全部楼层
学习下,感谢,感谢
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-28 06:19 , Processed in 0.095545 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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