还原/带到程序开头的脚本,如果未激活,则将其打开


11

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

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

我想对几个程序执行此操作:!W对于Word,!N对于Notepad ++,!X对于excel,!P对于powerpoint,!F对于Firefox。

如果一个程序的多个实例正在运行,或者有多个选项卡可用,则它应该对最新的实例或选项卡执行上述操作。因此,当Firefox的多个窗口打开时,它应该还原(或显示在最前面)带有最近打开的选项卡的窗口。同样,如果打开了多个word文档,则应针对我上次处理的文档执行此操作。并且,如果没有打开或最小化任何Word文档,则应打开一个新的Word实例。

对于某些程序,我可以执行某些操作,但不能始终如一地执行,也不能使用一个热键(我仍在学习脚本语言)。我怎样才能做到这一点?

Answers:


14

我对窗口激活如何工作的理解非常简单。它会还原该类型的最近使用的窗口。该默认行为使对所需内容的编码变得非常简单。实际上,我用两个简单的代码块所做的事情几乎与您要做的事情相同。

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

我创建了一些有趣的协同作用以与多台显示器一起使用。请注意,在Windows 7上,按住Shift + Windows键并使用箭头向左和向右导航将以光速在监视器之间移动活动窗口。所以我尝试了一些巧妙的方法,将单词映射为shift + window + w。如果已经打开,它将恢复单词;否则,将运行一个新实例。该方法的优点在于,我从不放过shift + Windows键。这样,我既可以激活/开始单词,又可以使用左右箭头键将其精确移动到我想要的位置(顺便说一句,向上最大化,而向下则最小化)。映射+#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,

注意:上面的代码仅是自动脚本编写器的通用输出的改编。它有些多余,但有效。要查找类似于窗口的ahk_class的内容,请考虑使用AutoIt3窗口间谍。

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

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

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

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


太棒了!很棒的技巧和非常有用的代码。我将添加第二个监视器,因此部分答案也将不胜感激。
彼得·韦比

顺便说一句,我也喜欢officetabs提示。我不知道它的存在,但是它看起来非常有用。
彼得·韦比

幸运的是,“运行,winword”命令有效,因此似乎不必提供完整路径。
彼得·韦比

@Coldrainwater:如何在上面更改脚本以使其适用于Google Chrome?问题是标题根据打开的网站而变化。
Lernkurve 2013年

1

我知道您已经知道宏伟的Autohotkey语言;)。我会用:

  • ifWinActive; 检查窗口是否处于活动状态
  • WinGet,输出,MinMax;检查窗口是否最小化
  • ifWinExists; 检查窗口是否存在(但不活动)
  • 跑 ; 如果没有进程关联,请运行程序
  • Z顺序/ 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

谢谢。我一直在玩这些游戏,但是真的不知道如何在其中获得有效的if-else循环。因此,如果IfWinActive为false,如何将适当的Run命令作为else命令的一部分启动?
Peter Verbeet 2012年

@PeterVerbeet:请参见编辑。我使用过Word 2007英文版。按Shift + 1 + w查看脚本的工作方式。
colemik 2012年

我已经编辑了几次。
colemik 2012年

感谢trismarck,这真的很有用。效果很好。有没有办法使它更“通用”?我希望运行此命令,而不管Word当前正在编辑哪个文档。在我看来,我每次都必须在脚本中手动更改名称(我经常使用Word,很少使用“ Document1”。可以通过检查Word本身是否处于活动状态来实现,而不管它是哪个文档。活跃在吗
彼得·韦比

1

它可能没有某些复杂,但是这是我用来启动大多数程序的方法。如果该窗口已经处于活动状态,则使用该开关可以将其最小化。

^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
            }
        }
}

不会始终切换为0吗?
山姆·哈斯勒

0

这就是我为自己解决此问题的方式。https://superuser.com/a/1405409/997992 我确实没有在原始帖子中提到我使用的是称为实际Windows管理器的Windows附加组件,这就是为什么我在其中对WinExist进行了额外的检查,以检查是否为externalwindowsmanager或explorer.exe。

希望这可以帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.