プログラムの前に戻す/持ってくるスクリプト、またはアクティブでない場合は開くスクリプト


11

次のことを行うスクリプトを開発しようとしています。たとえば、次のようにする!W必要があります。

  • Wordがアクティブかどうかを確認します(開いているか、最小化できます)。
  • 最小化されている場合は、最小化前のサイズと場所に復元する必要があります
  • 開いているが他の開いているウィンドウの後ろに「隠れている」場合、スクリプトはそれを前面に移動し、最前面のアクティブなウィンドウにします。
  • 最小化もオープンもされていない場合は、プログラムを新たに開始する必要があります

!WWord、!NNotepad ++、!XExcel、!PPowerPoint、!FFirefoxのいくつかのプログラムでこれを実行したいと思います。

プログラムの複数のインスタンスが実行されている場合、または複数のタブが利用可能な場合は、最新のインスタンスまたはタブに対して上記を実行する必要があります。そのため、Firefoxの複数のウィンドウが開いている場合、最後に開いたタブで、最後に表示したウィンドウを復元(または前面に移動)する必要があります。同様に、複数のWord文書が開いている場合は、最後に作業していた文書に対してもこれを実行する必要があります。また、Word文書が開かれていないか、最小化されていない場合は、新しいWordインスタンスが開かれます。

一部のプログラムでは、これらのことの一部を実行できますが、一貫して、または1つのホットキーで実行できます(まだスクリプト言語を学習しています)。どうすればこれを達成できますか?

回答:


14

ウィンドウのアクティブ化のしくみについての私の理解は非常に簡単です。そのタイプの最後に使用したウィンドウを復元します。このデフォルトの動作により、必要なコーディングが非常に簡単になります。実際、2つの単純なコードブロックを使用して、目的とほぼ同じことを行います。

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

複数のモニターを操作するために、少し興味深い相乗効果を生み出しました。Windows 7では、Shift + Windowsキーを押しながら矢印を使用して左右に移動すると、アクティブなウィンドウがモニター間を軽い速度で移動します。だから私は少し賢いものを試し、単語をシフト+ウィンドウ+ 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%".

使用できるもう1つのトリックは、WinSetTitleを使用してアクティブなタイトルを設定することです。

編集:excel / word / powerpointのインスタンスが複数存在する場合は、officetabs無料版で問題を解決することも検討してください。これにより、開いているすべてのExcelファイルを、たとえばタスクバーに散らばることなく、単一のインスタンスに保持できます。


これは完璧です!すばらしいヒントと非常に役立つコード。2台目のモニターを追加しますので、その回答の一部も高く評価されます。
Peter Verbeet、2012年

ちなみに、officetabsのヒントも気に入っています。それが存在することは知りませんでしたが、とても便利そうです。
Peter Verbeet、2012年

幸い、コマンド「Run、winword」は機能するので、フルパスを指定する必要はないようです。
Peter Verbeet、2012年

@Coldrainwater:Google Chromeで機能させるには、上記のスクリプトをどのように変更する必要がありますか?問題は、開いているWebサイトによってタイトルが変わることです。
Lernkurve 2013

1

すばらしいオートホットキー言語をすでにご存じでしょうね;)。私は使用します:

  • 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の場合、elseコマンドの一部として適切なRunコマンドを起動するにはどうすればよいですか?
Peter Verbeet、2012年

@PeterVerbeet:編集を参照してください。Word 2007の英語版を使用しました。Shift + 1 + wを押して、スクリプトの動作を確認します。
colemik

これを何度か編集しました。
colemik

Trismarckに感謝します。それは本当に便利です。それは素晴らしい働きをします。それをより「一般的」にする方法はありますか?Wordで現在編集中のドキュメントに関係なく、これを実行したいと思います。毎回スクリプトで手動で名前を変更する必要があるようです(Wordを頻繁に使用し、「Document1」を使用することはめったにありません。Word自体がアクティブかどうかを確認することで、それがどのドキュメントであるかを確認できます。アクティブですか?
Peter Verbeet

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ではないのですか?
Sam Hasler

0

これが私がこの問題を自分で解決した方法です。/superuser//a/1405409/997992 元の投稿で、実際のWindowsマネージャーと呼ばれるWindowsアドオンを使用していることを忘れていました。そのため、実際のWindowsマネージャーのいずれかでWinExistで追加のチェックを行いますまたはexplorer.exe。

お役に立てれば。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.