找回密码
 加入
搜索
查看: 3671|回复: 12

[AU3基础] 【已解决】小白问题,关于解决按钮后激活原窗口的方法

[复制链接]
发表于 2021-1-6 08:25:21 | 显示全部楼层 |阅读模式
本帖最后由 宇硕 于 2021-1-10 10:16 编辑

各位大神,请教一个问题:拟制作一个简单的快捷键的按钮窗口,即点击按钮1,就在所选的文档内输入“abc”,用的send,但是在激活按钮窗口的时候,所选文档的激活状态就没有了,请问有什么方法能够返回上一次点击的文档窗口的激活状态呢,文档窗口的title不定,不胜感激
发表于 2021-1-7 11:44:35 | 显示全部楼层
说到send函数,个人的一点经验。几种写入方法,写在一块了,有注释,运行一次就明白了。
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <array.au3>
$Form1 = GUICreate("Form1", 231, 128)
$Button1 = GUICtrlCreateButton("发送", 40, 24, 153, 73)
GUISetState(@SW_SHOW)
WinSetOnTop($Form1, '', 1)
If Not WinActivate('[class:Notepad]') Then
        Run('notepad.exe')
        WinWait('[class:Notepad]')
        WinActivate('[class:Notepad]')
EndIf
While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $Button1
                        _Send('ABC中华人民共和国' & Random())
        EndSwitch
WEnd
Func _Send($sText)
        Local $aAryWin = WinList('[REGEXPTITLE:(.+)]')
;~         _ArrayDisplay($aAryWin)
        For $i = 1 To $aAryWin[0][0]
                If BitAND(_WinAPI_GetWindowLong($aAryWin[$i][1], $GWL_EXSTYLE), $WS_EX_TOPMOST) Then ContinueLoop;引用前辈们的代码,其实我也看不懂
                If Not BitAND(WinGetState($aAryWin[$i][1]), 2) Then ContinueLoop;引用前辈们的代码,其实我也看不懂
                WinActivate($aAryWin[$i][1]);激活窗口
                
                Send("原字符串,与输入法相关:" & @CR & $sText &"{Enter}"&@CRLF);先发送原来的字符
                $vSendStr = _SendEx($sText);转换字符串,一般有send都会涉及到输入法状态
                Send("修正字符串,与输入法无关:" & @CR & $vSendStr & @CRLF);转换后的字符串与输入法无关
                ControlSend("[active]", "", ControlGetFocus("[active]", ""), "与输入法无关的实际字符为:" & @LF);提示语,将实际字符串打出来看一下。
                ControlSend("[active]", "", ControlGetFocus("[active]", ""), $vSendStr, 1);最后一个参数1的意思按原字符模样输出,不转换。
                ControlSend("[active]", "", ControlGetFocus("[active]", ""), @CRLF & "用controlSend加快速度:" & @CR & $vSendStr & @CRLF);直接用Controlsend速度很快。
                $oldText = ControlGetText("[active]", "", ControlGetFocus("[active]", ""))
                
                ;ControlSetText不会激活修改事件,也就是说,如果不做别的改动,关闭记事本甚至不会提示保存。
                ControlSetText("[active]", "", ControlGetFocus("[active]", ""), $oldText &  "用ControlSetText置入文本:" & @CR & $sText & @CR&"ControlSetText的缺点在于不激活修改事件,原软件不会认为你做过修改!");用了Controlsend怎么少得了ControlText呢?速度更快。
                
                Return True
        Next
EndFunc   ;==>_Send
Func _SendEx($sSendStr = '');论坛大神写的函数,借用一下
        Local $vSendStr = '', $aSplit, $sStr, $sOptSendKeyDelay
        If $sSendStr = '' Then Return SetError(1, 0, '')
        $aSplit = StringSplit($sSendStr, '')
        For $i = 1 To $aSplit[0]
                $sStr = $aSplit[$i]
                If StringRegExp($sStr, '(?i)[\w,/\\\|~`!<>\[\]\.''":@#$%\^&*\(\)-+=]', 0) Then
                        $vSendStr &= '{ASC ' & Asc($sStr) & '}'
                Else
                        $vSendStr &= $sStr
                EndIf
        Next
        
        Return $vSendStr
EndFunc   ;==>_SendEx

点评

讲解详细 受益匪浅  发表于 2021-1-7 15:32

评分

参与人数 2金钱 +50 收起 理由
宇硕 + 20
itzyx + 30

查看全部评分

发表于 2021-1-6 11:06:31 | 显示全部楼层
游客,如果您要查看本帖隐藏内容请回复



评分

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

查看全部评分

发表于 2021-1-6 15:25:36 | 显示全部楼层
关于解决按钮后激活原窗口的方法
发表于 2021-1-6 15:58:25 | 显示全部楼层
If Not BitAND(_WinAPI_GetWindowLong($Form1, $GWL_EXSTYLE), $WS_EX_NOACTIVATE) Then _WinAPI_SetWindowLong($Form1, $GWL_EXSTYLE, BitOR(_WinAPI_GetWindowLong($Form1, $GWL_EXSTYLE), $WS_EX_NOACTIVATE))

评分

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

查看全部评分

 楼主| 发表于 2021-1-6 18:50:21 | 显示全部楼层
zghwelcome 发表于 2021-1-6 11:06
**** 本内容被作者隐藏 ****

谢谢大神,我研究下
 楼主| 发表于 2021-1-6 18:51:06 | 显示全部楼层
tubaba 发表于 2021-1-6 15:58
If Not BitAND(_WinAPI_GetWindowLong($Form1, $GWL_EXSTYLE), $WS_EX_NOACTIVATE) Then _WinAPI_SetWindow ...

这个是?看不懂哇
 楼主| 发表于 2021-1-6 18:56:22 | 显示全部楼层
zghwelcome 发表于 2021-1-6 11:06
**** 本内容被作者隐藏 ****

大神,我想写的是视频播放快捷键盘,需要定位的是视频播放的窗口,但是视频的标题不定,用class:后面是不是把notepad换成个啥
 楼主| 发表于 2021-1-6 19:00:00 | 显示全部楼层
tubaba 发表于 2021-1-6 15:58
If Not BitAND(_WinAPI_GetWindowLong($Form1, $GWL_EXSTYLE), $WS_EX_NOACTIVATE) Then _WinAPI_SetWindow ...

学习了,谢谢大神
发表于 2021-1-7 11:01:12 | 显示全部楼层
看看你隐藏了什么内容,学习一下
发表于 2021-1-7 15:19:11 | 显示全部楼层
解决了就编辑标题,添加已解决
最近很多不编辑的,直接移至无意义,之后批量删除。
发表于 2021-1-19 16:53:57 | 显示全部楼层
是什么神奇的方法,居然隐藏起来了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 07:56 , Processed in 0.073689 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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