昔、WindowsにはX-Mouseと呼ばれるPowerToy(後でTweakUIで)がありました。これは、とりわけ、古いスタイルのX「フォーカスがマウスに従う」をサポートしていました。「フォーカス」と「フォアグラウンド」は同じものではありませんでした。私はそれがもう維持されているとは思いません(最後の目撃はWinXPのためでした)。
私はそれを広範囲に使用していませんが、無料のWindowsスクリプトツールAutoITは、短いスクリプトで必要なことを実行できます。
#include <WinAPI.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <MenuConstants.au3>
#include <SendMessage.au3>
Local $hWnd,$flags,$regexp
Func MyExit()
MsgBox(0,"Drop Window","Quitting!",2)
Exit 0
EndFunc
$flags = BitOr($SWP_NOMOVE,$SWP_NOSIZE,$SWP_NOACTIVATE,$SWP_ASYNCWINDOWPOS,$SWP_NOSENDCHANGING)
;; hot key to call exit: ALT + F11
HotKeySet("!{F11}","MyExit")
;; application window title
$regexp=".*Notepad$"
;; 10 second time out on first startup,
$hWnd = WinWait("[REGEXPTITLE:" & $regexp & "]", "", 10)
;; or wait forever
;$hWnd = WinWait("[REGEXPTITLE:" & $regexp & "]")
If ($hWnd) Then
;; uncomment next line to maximize window first
;_SendMessage($hWnd,$WM_SYSCOMMAND,$SC_MAXIMIZE)
_WinAPI_SetWindowPos($hWnd, $HWND_BOTTOM, 0, 0, 0, 0, $flags);
While 1
If WinWaitActive($hWnd,"",10) Then
_WinAPI_SetWindowPos($hWnd, $HWND_BOTTOM, 0, 0, 0, 0, $flags);
EndIf
;; check for new window
$hWnd = WinWait("[REGEXPTITLE:" & $regexp & "]","",1)
;; uncomment next 3 lines to quit if no window
;if (NOT $hWnd) Then
; MyExit()
;EndIf
Sleep(250)
Wend
Else
MsgBox(0,"Drop Window","No window title matching /" & $regexp & "/")
EndIf
「最上位」はWMが維持する永続的なウィンドウプロパティであり、同等の「最下位」はないため、少しファッジする必要があります。
Whileループは、アプリケーションがフォアグラウンドを取得するのを待ってから、キーボードフォーカスを維持したまま、再び下にドロップします。モーダルポップアップはこれに干渉する場合がありますが、かなり使いやすいはずです。監視対象のプログラムが終了した後も、スクリプトはバックグラウンドで実行され続けます。Alt + F11でいつでも終了できます。
$ regexpを「mIRC」などに一致するように変更します。上記は、一度に1つのウィンドウのみを確実に処理します。WinWait()のAutoITドキュメントを読んで、ウィンドウタイトル以外でウィンドウを一致させる方法を確認してください。
dropwindow.au3に保存して、「autoit3 dropwindow.au3」で実行します。
http://www.autoitscript.com/site/autoit/downloads/
foreground
ます。