skrip untuk mengembalikan / membawa ke depan program, atau membukanya jika tidak aktif

11

Saya mencoba mengembangkan skrip yang harus melakukan hal berikut. Misalnya, !Wharus:

  • periksa apakah Word aktif (dapat dibuka atau diperkecil)
  • jika diminimalkan, harus dikembalikan ke ukuran dan lokasi yang dimilikinya sebelum minimisasi
  • jika terbuka, tetapi "tersembunyi" di balik jendela lain yang terbuka, skrip harus membawanya ke depan, menjadikannya jendela paling depan / aktif
  • jika tidak diminimalkan atau dibuka, program harus baru dimulai

Saya ingin melakukan ini untuk beberapa program: !Wuntuk Word, !Nuntuk Notepad ++, !Xuntuk excel, !Puntuk powerpoint, !Funtuk Firefox.

Jika beberapa instance dari suatu program sedang berjalan, atau jika banyak tab tersedia, ia harus melakukan hal di atas untuk instance atau tab terbaru. Jadi, ketika beberapa jendela Firefox terbuka, itu harus mengembalikan (atau membawa ke depan) jendela yang paling baru dilihat dengan tab yang paling baru dibuka. Demikian pula, jika banyak dokumen kata terbuka, itu harus melakukan ini untuk yang terakhir saya kerjakan. Dan, jika tidak ada dokumen Word yang terbuka atau diminimalkan, itu harus membuka contoh kata baru ..

Saya dapat melakukan beberapa hal ini, untuk beberapa program, tetapi tidak secara konsisten, atau dalam satu hotkey (saya masih belajar bahasa scripting). Bagaimana saya bisa mencapai ini?

Peter Verbeet
sumber

Jawaban:

14

Pemahaman saya tentang cara kerja Aktivasi Jendela cukup sederhana. Ini mengembalikan jendela yang terakhir digunakan dari jenis itu. Perilaku default itu membuat pengodean yang Anda inginkan menjadi sangat sederhana. Bahkan, saya melakukan sesuatu yang hampir identik dengan apa yang Anda cari dengan dua blok kode sederhana.

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

Saya membuat sinergi yang menarik untuk bekerja dengan beberapa monitor. Perhatikan bahwa pada Windows 7, menahan tombol shift + windows dan menggunakan panah untuk bernavigasi ke kiri dan kanan akan memindahkan jendela aktif di antara monitor dengan kecepatan rendah. Jadi saya mencoba sesuatu yang sedikit pintar dan memetakan kata untuk menggeser + window + w. Ini mengembalikan kata jika sudah membuka atau menjalankan contoh baru jika tidak. Keindahan dari pendekatan ini adalah saya tidak pernah melepaskan tombol shift + windows. Dengan melakukan itu saya bisa aktif / memulai kata dan memindahkannya ke posisi yang saya inginkan menggunakan tombol panah kanan kiri (naik akan memaksimalkan dengan cara dan turun akan meminimalkan). Map + # r untuk mengembalikan jendela aktif dan Anda sepenuhnya mengendalikan semua jendela yang biasanya Anda gunakan dengan mudah tanpa mouse. Yang harus Anda ingat adalah huruf pertama dari aplikasi yang Anda coba aktifkan.

Sebagai jawaban atas pertanyaan Anda tentang membuat skrip lebih umum:

1) Pertimbangkan untuk menggunakan

; 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

Atau kemungkinan lain:

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

Catatan: Kode di atas hanyalah adaptasi dari keluaran umum penulis autoscript. Ini agak berlebihan tetapi efektif. Untuk menemukan sesuatu seperti ahk_class jendela, pertimbangkan untuk menggunakan jendela mata-mata AutoIt3.

Jika Anda perlu menemukan judul jendela Anda bisa mendapatkan judul aktif seperti yang ditunjukkan pada file bantuan contoh ahk

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

Trik lain yang dapat Anda gunakan adalah mengatur judul aktif menggunakan WinSetTitle

Sunting: Mengingat bahwa Anda memiliki beberapa contoh excel / word / powerpoint yang beredar, juga pertimbangkan untuk menyelesaikan masalah tersebut dengan edisi bebas officetab. Ini akan memungkinkan Anda untuk menyimpan semua file excel terbuka dalam satu contoh misalnya bukannya bertebaran tentang taskbar.

Air dingin
sumber
Ini sempurna! Kiat-kiat hebat dan kode yang sangat berguna. Saya akan menambahkan monitor kedua, sehingga bagian dari jawabannya juga sangat dihargai.
Peter Verbeet
Ngomong-ngomong, saya juga suka ujung officetab. Saya tidak tahu itu ada, tetapi terlihat sangat berguna.
Peter Verbeet
Untungnya, perintah "Run, winword" berfungsi, jadi sepertinya saya tidak harus menyediakan jalur lengkap.
Peter Verbeet
@ Coldrainwater: Bagaimana cara mengubah skrip Anda di atas untuk membuatnya berfungsi untuk Google Chrome? Masalahnya adalah bahwa judul berubah tergantung pada situs web apa yang terbuka.
Lernkurve
1

Saya tahu Anda sudah tahu bahasa Autohotkey yang luar biasa;). Saya akan menggunakan:

  • ifWinActive; periksa apakah jendela aktif
  • WinGet, output, MinMax; periksa apakah jendela diminimalkan
  • ifWinExists; periksa apakah ada jendela (tetapi tidak aktif)
  • Lari ; jalankan program jika tidak ada proses yang terkait
  • Z-order / WinList; itu akan membantu Anda membuat daftar semua instance / menentukan instance mana yang pertama

Jika Anda memiliki pertanyaan lain, Anda harus menanyakannya di forum 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
colemik
sumber
Terima kasih. Saya telah bermain dengan ini, tetapi tidak benar-benar tahu cara mendapatkan loop if-else yang efektif di sana. Jadi, jika IfWinActive salah, bagaimana cara menjalankan perintah Jalankan yang sesuai sebagai bagian dari perintah lain?
Peter Verbeet
@PeterVerbeet: lihat hasil edit. Saya telah menggunakan versi bahasa Inggris Word 2007. Tekan Shift + 1 + w untuk melihat cara kerja skrip.
colemik
Saya sudah mengedit ini beberapa kali.
colemik
Terima kasih trismarck, itu sangat berguna. Ini bekerja dengan baik. Apakah ada cara untuk membuatnya lebih "generik"? Saya ingin ini dijalankan terlepas dari dokumen apa yang saat ini sedang diedit oleh Word. Sepertinya saya harus mengubah nama secara manual dalam skrip setiap kali (saya sering menggunakan Word dan jarang menggunakan "Document1". Dapatkah itu dilakukan dengan memeriksa apakah Word itu sendiri aktif, terlepas dari dokumen apa itu aktif?
Peter Verbeet
1

Mungkin tidak serumit beberapa orang, tetapi inilah yang saya gunakan untuk meluncurkan sebagian besar program saya. Beralih memungkinkan Anda untuk meminimalkan jendela jika sudah aktif.

^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
            }
        }
}
Elliot
sumber
tidak akan selalu beralih menjadi 0?
Sam Hasler
0

Inilah bagaimana saya memecahkan masalah ini untuk diri saya sendiri. /superuser//a/1405409/997992 Saya lupa menyebutkan di posting asli bahwa saya menggunakan jendela add on yang disebut windows manager aktual yang mengapa saya memiliki pemeriksaan tambahan dengan WinExist di sana untuk salah satu manajeman aktualwindowsmanager ATAU explorer.exe.

Semoga ini membantu.

Brandon G
sumber