脚本用于恢复/置于程序前面,或者在程序未处于活动状态时打开它

脚本用于恢复/置于程序前面,或者在程序未处于活动状态时打开它

我正在尝试开发一个应该执行以下操作的脚本。例如,!W应该:

  • 检查 Word 是否处于活动状态(可以打开或最小化)
  • 如果已最小化,则应恢复到最小化之前的大小和位置
  • 如果它是打开的,但“隐藏”在其他打开的窗口后面,则脚本应该将其置于最前面,使其成为最前面/活动窗口
  • 如果未最小化也未打开,则程序应重新启动

我想对几个程序执行此操作:!WWord、!NNotepad++、!Xexcel、!Ppowerpoint、!FFirefox。

如果某个程序的多个实例正在运行,或者有多个选项卡可用,它应该针对最近的实例或选项卡执行上述操作。因此,当打开多个 Firefox 窗口时,它应该恢复(或将最近打开的选项卡置于最前面)最近查看的窗口。同样,如果打开了多个 Word 文档,它应该针对我上次处理的文档执行此操作。并且,如果没有打开或最小化 Word 文档,它应该打开一个新的 Word 实例。

对于某些程序,我可以执行其中的一些操作,但不是始终如一,也不是用一个热键(我仍在学习脚本语言)。我该如何实现这一点?

答案1

我对窗口激活工作原理的理解非常简单。它会恢复该类型的最近使用的窗口。这种默认行为使编写所需的代码变得非常简单。事实上,我用两个简单的代码块做了一些与你几乎完全相同的事情。

+#w::
SetTitleMatchMode, 2 ; approximate match
IfWinExist, - Microsoft Word
{
WinActivate, - Micrsoft Word
}
IfWinNotExist, - Microsoft Word
{
Run FullFilePathToMicrosoftWord
}
return

我创建了一个有趣的协同作用来与多台显示器配合使用。请注意,在 Windows 7 上,按住 Shift + Windows 键并使用箭头向左和向右导航将以光速在显示器之间移动活动窗口。因此,我尝试了一些巧妙的方法,将 word 映射到 shift + window + w。如果已经打开,它会恢复 word,如果没有,它会运行一个新实例。这种方法的妙处在于我从未放开 Shift + Windows 键。通过这样做,我既可以激活/启动 word,也可以使用左右箭头键将其移动到我想要的准确位置(顺便说一下,向上将最大化,向下将最小化)。映射 +#r 以恢复活动窗口,您可以完全控制通常使用的所有窗口,而无需鼠标。您必须记住的只是您要尝试激活的应用程序的首字母。

回答您关于使脚本更通用的问题:

1)考虑使用

; Allows you to search for an approximate window title match
SetTitleMatchMode, 2  

; For example, you could do the following to activate any existing window with 
; "- Microsoft Word" as part of the title

WinWait, - Microsoft Word, 
IfWinNotActive, - Microsoft Word, , WinActivate, - Microsoft Word, 
WinWaitActive, - Microsoft Word,

; some other code here once you have the window active

或者另一种可能性:

;Active the window by finding its ahk_class
WinWait, ahk_class OpusApp, 
IfWinNotActive, ahk_class OpusApp, , WinActivate, ahk_class OpusApp, 
WinWaitActive, ahk_class OpusApp,

注意:上面的代码只是对 autoscriptwriter 通用输出的改编。它有些冗余,但很有效。要查找类似窗口的 ahk_class 的内容,请考虑使用 AutoIt3 窗口间谍。

如果你需要发现窗口的标题,你可以获取活动标题,如 ahk 示例帮助文件中所示

WinGetActiveTitle, Title
MsgBox, The active window is "%Title%".

您可以使用的另一个技巧是使用 WinSetTitle 设置活动标题

编辑:鉴于您有多个 excel/word/powerpoint 实例,也可以考虑使用 officetabs 免费版解决该问题。例如,它将允许您将所有打开的 excel 文件保留在单个实例中,而不是散落在任务栏中。

答案2

我看你已经了解了出色的 Autohotkey 语言 ;)。我会使用:

  • ifWinActive ; 检查窗口是否活动
  • WinGet,output,MinMax ;检查窗口是否最小化
  • ifWinExists ;检查窗口是否存在(但不活动)
  • 运行;如果没有关联进程,则运行程序
  • Z-order / WinList ;这些将帮助你列出所有实例/确定哪个实例是第一个

如果您还有更多问题,您一定要在 autohotkey 论坛上询问。

; The script activates a Word 2007 window
; The script uses 'winTitle' and 'winClass' variables to match the window
; so set those properly first.
; Press Shift + 1 + w to see how the script works.
;
winTitle := "Document1 - Microsoft Word" ; use Autoit Window Spy to get this
winClass := "OpusApp"
RunWait, winword
return

+1::
    KeyWait, w, D T1 ; KeyboardHook not needed
    if(errorlevel) {
        msgbox, % """Shift + 1 + w"" failed"
        return
    }
    Send, {Backspace} ; erase 'w'
    IfWinNotActive, %winTitle%
    {
        WinActivate, %winTitle%
        WinWaitActive, %winTitle%, , 3
        if(errorlevel)
            MsgBox, % "Failed to activate the window."
    } 
    else ; Last Found Window set
    {
        MsgBox, % "Window already activated."

    }
return


F11::Reload

答案3

它可能不像其他程序那样复杂,但这是我用来启动大多数程序的方法。如果窗口已经处于活动状态,则可以使用切换按钮将其最小化。

^NumpadDot::ShowStart("Google Chrome", "chrome.exe")

ShowStart(title, exe, toggle = 0)
{
    If WinActive(title) and toggle
        WinMinimize %title%
    Else
        {
            IfWinExist, %title%
                WinActivate
            else
            {
                Run, %exe%
                WinActivate
            }
        }
}

答案4

这就是我自己解决这个问题的方法。https://superuser.com/a/1405409/997992 我确实忘记在原始帖子中提到我正在使用一个名为实际窗口管理器的 Windows 插件,这就是为什么我需要使用 WinExist 对 actualwindowsmanager 或 explorer.exe 进行额外检查。

希望这可以帮助。

相关内容