找回密码
 加入
搜索
查看: 1545|回复: 7

[AU3基础] 文本框如何感知识别键盘动作?[已解决]

[复制链接]
发表于 2019-9-20 14:24:12 | 显示全部楼层 |阅读模式
本帖最后由 cashiba 于 2019-9-20 22:00 编辑
#include <EditConstants.au3>
#include <GUIEdit.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3
_Example()
Func _Example()
 GUICreate("MyGUIedit")
 Local $idMyedit = GUICtrlCreateEdit("", 5, 5, 390, 320, $ES_AUTOVSCROLL + $WS_VSCROLL)
 GUICtrlSetData(-1, "伤情最是晚凉天,憔悴斯人不堪怜。邀酒摧肠三杯醉,寻香惊梦五更寒。钗头凤斜卿有泪,荼靡花了我无缘。小楼寂寞新雨月,也难如钩也难圆。")
 Local $Dummy = GUICtrlCreateDummy()
 GUISetState(@SW_SHOW)
 Send("{END}")
 GUICtrlSetData($idMyedit, @CRLF & "同样的事情,同样的地方,同样的人物,但你若从不同的角度,不同的观点,不同的心情去看,便会得到不同的结论。", 1)
 Local $Key[1][2] = [["^a", $Dummy]]
 GUISetAccelerators($Key)
 _GUICtrlEdit_SetSel($idMyedit, 0, 0)
 While 1
  Switch GUIGetMsg()
   Case $GUI_EVENT_CLOSE
    ExitLoop
   Case $Dummy
    Local $aResult = DllCall("user32.dll", "hwnd", "GetFocus")
    Switch $aResult[0]
     Case $idMyedit
      _GUICtrlEdit_SetSel($idMyedit, 0, -1)
    EndSwitch
  EndSwitch
 WEnd
 GUIDelete()
EndFunc   ;==>_Example
如上示例文本框代码。
1、如何感知并识别Ctrl+A键盘动作?
2、手工选定文本框中的部分字符串时,会高亮或反白显示
    如何用代码实现这一效果?

搜索发现有用GUICtrlCreateDummy实现Ctrl+A效果的,实践中好像有时会失灵....
没发现简捷完美的解决办法
是不是关键词没选对,以至于没搜索到匹配的帖子呢?

发表于 2019-9-20 15:37:42 | 显示全部楼层
用 GUISetAccelerators() 设置窗口快捷键是最简单且有效的。“好像会失灵”应该是焦点没有在编辑框。你可以设置快捷键,加一个先将编辑框激活的动作

评分

参与人数 1金钱 +20 收起 理由
cashiba + 20 赞一个!

查看全部评分

 楼主| 发表于 2019-9-20 15:52:44 | 显示全部楼层
afan 发表于 2019-9-20 15:37
用 GUISetAccelerators() 设置窗口快捷键是最简单且有效的。“好像会失灵”应该是焦点没有在编辑框。你可以 ...

明白了,A大一眼就看出问题所在了

没注意到原帖是使用_GUICtrlEdit_Create创建的编辑框,所以DllCall("user32.dll", "hwnd", "GetFocus")检索当前焦点有用。用GUICtrlCreateEdit创建的编辑框就没气作用。
发表于 2019-9-20 15:58:15 | 显示全部楼层
cashiba 发表于 2019-9-20 15:52
明白了,A大一眼就看出问题所在了

没注意到原帖是使用_GUICtrlEdit_Create创建的编辑框,所 ...

第24行改成 Case GUICtrlGetHandle($idMyedit) 就行了

评分

参与人数 1金钱 +10 收起 理由
cashiba + 10 谢谢!

查看全部评分

 楼主| 发表于 2019-9-20 16:01:25 | 显示全部楼层
再请教一下A大,如果要用代码高亮选定或标记文本框中的某个字符串,能实现吗?
比喻查找到文本框中某个字符串的位置(距起点字符的偏移量),然后抹黑,理论上似乎可以,但是基础太差,抹黑这一动作不知道怎么实现....
更不用说进一步改抹黑为抹红(改变颜色)了
是不是要用富文本框才行?
 楼主| 发表于 2019-9-20 16:13:03 | 显示全部楼层
afan 发表于 2019-9-20 15:58
第24行改成 Case GUICtrlGetHandle($idMyedit) 就行了

对哦,DllCall要求的参数是句柄,转换成句柄就ok了
斩鬼啊,对DllCall、APi、struct之类的一直绕开没深入了解,导致代码都看不透彻
发表于 2019-9-20 16:13:25 | 显示全部楼层
用富文本可以变色,不过很少人用,小题大做的事
EDIT编辑框很简单
#include <EditConstants.au3>
#include <GUIEdit.au3>
#include <WindowsConstants.au3>

_Example()

Func _Example()
        GUICreate("MyGUIedit")
        Local $idMyedit = GUICtrlCreateEdit("", 5, 5, 390, 320, $ES_AUTOVSCROLL + $WS_VSCROLL)
        GUICtrlSetData(-1, "伤情最是晚凉天,憔悴斯人不堪怜。邀酒摧肠三杯醉,寻香惊梦五更寒。钗头凤斜卿有泪,荼靡花了我无缘。小楼寂寞新雨月,也难如钩也难圆。")
        Local $iBtn = GUICtrlCreateButton('选择"晚凉天"', 5, 330)
        Local $Dummy = GUICtrlCreateDummy()
        GUISetState(@SW_SHOW)
        Send("{END}")
        GUICtrlSetData($idMyedit, @CRLF & "同样的事情,同样的地方,同样的人物,但你若从不同的角度,不同的观点,不同的心情去看,便会得到不同的结论。", 1)
        Local $Key[1][2] = [["^a", $Dummy]]
        GUISetAccelerators($Key)
        _GUICtrlEdit_SetSel($idMyedit, 0, 0)
        While 1
                Switch GUIGetMsg()
                        Case -3
                                ExitLoop
                        Case $Dummy
                                GUICtrlSetState($idMyedit, 256)
                                _GUICtrlEdit_SetSel($idMyedit, 0, -1)
                        Case $iBtn
                                GUICtrlSetState($idMyedit, 256)
                                _GUICtrlEdit_SetSel($idMyedit, 4, 4 + 3)
                EndSwitch
        WEnd
        GUIDelete()
EndFunc   ;==>_Example

评分

参与人数 1金钱 +20 收起 理由
cashiba + 20 很给力!谢谢!

查看全部评分

 楼主| 发表于 2019-9-20 21:52:47 | 显示全部楼层
谢谢A大!
终于知道_GUICtrlEdit_SetSel派啥用场了,没有具体实践场景就是印象不深...
A大还顺便把代码化繁为简了,精通Au3果然能达到信手拈来的境界阿
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-3-28 19:18 , Processed in 0.071930 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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