宇硕 发表于 2021-1-6 08:25:21

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

本帖最后由 宇硕 于 2021-1-10 10:16 编辑

各位大神,请教一个问题:拟制作一个简单的快捷键的按钮窗口,即点击按钮1,就在所选的文档内输入“abc”,用的send,但是在激活按钮窗口的时候,所选文档的激活状态就没有了,请问有什么方法能够返回上一次点击的文档窗口的激活状态呢,文档窗口的title不定,不胜感激

xlj310 发表于 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('') Then
      Run('notepad.exe')
      WinWait('')
      WinActivate('')
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('')
;~         _ArrayDisplay($aAryWin)
      For $i = 1 To $aAryWin
                If BitAND(_WinAPI_GetWindowLong($aAryWin[$i], $GWL_EXSTYLE), $WS_EX_TOPMOST) Then ContinueLoop;引用前辈们的代码,其实我也看不懂
                If Not BitAND(WinGetState($aAryWin[$i]), 2) Then ContinueLoop;引用前辈们的代码,其实我也看不懂
                WinActivate($aAryWin[$i]);激活窗口
               
                Send("原字符串,与输入法相关:" & @CR & $sText &"{Enter}"&@CRLF);先发送原来的字符
                $vSendStr = _SendEx($sText);转换字符串,一般有send都会涉及到输入法状态
                Send("修正字符串,与输入法无关:" & @CR & $vSendStr & @CRLF);转换后的字符串与输入法无关
                ControlSend("", "", ControlGetFocus("", ""), "与输入法无关的实际字符为:" & @LF);提示语,将实际字符串打出来看一下。
                ControlSend("", "", ControlGetFocus("", ""), $vSendStr, 1);最后一个参数1的意思按原字符模样输出,不转换。
                ControlSend("", "", ControlGetFocus("", ""), @CRLF & "用controlSend加快速度:" & @CR & $vSendStr & @CRLF);直接用Controlsend速度很快。
                $oldText = ControlGetText("", "", ControlGetFocus("", ""))
               
                ;ControlSetText不会激活修改事件,也就是说,如果不做别的改动,关闭记事本甚至不会提示保存。
                ControlSetText("", "", ControlGetFocus("", ""), $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
                $sStr = $aSplit[$i]
                If StringRegExp($sStr, '(?i)[\w,/\\\|~`!<>\[\]\.''":@#$%\^&*\(\)-+=]', 0) Then
                        $vSendStr &= '{ASC ' & Asc($sStr) & '}'
                Else
                        $vSendStr &= $sStr
                EndIf
      Next
      
      Return $vSendStr
EndFunc   ;==>_SendEx

zghwelcome 发表于 2021-1-6 11:06:31

**** Hidden Message *****


ban_r 发表于 2021-1-6 15:25:36

关于解决按钮后激活原窗口的方法

tubaba 发表于 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))

宇硕 发表于 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 ...

学习了,谢谢大神

xlj310 发表于 2021-1-7 11:01:12

看看你隐藏了什么内容,学习一下

afan 发表于 2021-1-7 15:19:11

解决了就编辑标题,添加已解决
最近很多不编辑的,直接移至无意义,之后批量删除。

zhaoceshi 发表于 2021-1-19 16:53:57

是什么神奇的方法,居然隐藏起来了
页: [1]
查看完整版本: 【已解决】小白问题,关于解决按钮后激活原窗口的方法