「最前面に固定マネージャー」でウィンドウ操作をもっと快適に!

PC

はじめに

パソコンでの作業中に、「このウィンドウを常に最前面に固定したい!」と思ったことはありませんか?例えば、資料を見ながらメモを取りたいときや、動画を見ながら別のアプリを操作したいときなど、ウィンドウの重なりが邪魔になる場面は多いですよね。

そこで今回ご紹介するのは、**「最前面に固定マネージャー」**という便利なツールです。このツールを使えば、簡単に任意のウィンドウを最前面に固定したり解除したりできるようになります。さらに、操作ウィンドウ自体も常に最前面に表示されるため、作業効率が大幅に向上します!

このツールの特徴

  1. シンプルで使いやすいインターフェース
    • リストボックスから固定したいウィンドウを選択し、ボタンを押すだけで最前面に固定できます。
    • 操作ウィンドウ自体も常に最前面に表示されるため、他のウィンドウに隠れる心配がありません。
  2. 自動的に消える通知メッセージ
    • 最前面に固定したときや解除したときに表示されるメッセージは、数秒後に自動的に消えます。煩わしさを感じることなくスムーズに操作できます。
  3. ショートカットキー対応
    • 「Ctrl + Alt + W」のショートカットキーで操作ウィンドウを瞬時に表示・アクティブ化できます。マウスを使わずに素早く操作可能です。
  4. トレイアイコンで最小化可能
    • 使わないときはトレイアイコンに格納できるので、デスクトップをスッキリ保てます。

使用方法

1.autohotkeyをインストールします。

2.下記ソースコードを適当な名前で保存(例:「AlwaysOnTop.ahk」)して実行します。

AutoHotkey のソースコード

#NoEnv
#SingleInstance Force
SetTitleMatchMode, 2 ; 部分一致でウィンドウを検索

; ##############################################################
;  alwaysOntop mode
; ##############################################################
; トレイアイコンのメニューを設定
Menu, Tray, NoStandard ; 標準のトレイメニューを無効化
Menu, Tray, Add, 最前面に固定マネージャーを開く, ShowGUI ; メニュー項目を追加
Menu, Tray, Add ; 区切り線を追加
Menu, Tray, Add, 終了, ExitScript ; 終了メニューを追加
Menu, Tray, Default, 最前面に固定マネージャーを開く ; デフォルトアクションを設定
Menu, Tray, Icon, Shell32.dll, 14 ; トレイアイコンを設定(任意)

; ショートカットキーの設定
^!w:: ; Ctrl + Alt + W を押したとき
    if WinExist("最前面に固定マネージャー") {
        ; 既にGUIが存在する場合は、そのウィンドウをアクティブ化
        WinActivate
    } else {
        ; GUIが存在しない場合は新しく作成
        CreateGUI()
    }
return

; GUIを作成する関数
CreateGUI() {
    Gui, Font, s10 ; フォントサイズを10に設定(オプション)
    
    ; リストボックスを追加
    Gui, Add, ListBox, vWindowList r15 w400 x10 y10, % "ウィンドウを選択してください" ; x=10, y=10で固定
    
    ; 「最前面に固定/解除」ボタンを追加
    Gui, Add, Button, x10 y+10 w140 h30 gToggleAlwaysOnTop, 最前面に固定/解除 ; x=10, yはリストボックスの下
    
    ; 「一覧を更新」ボタンを追加
    Gui, Add, Button, x+10 yp w140 h30 gRefreshListButton, 一覧を更新 ; xは前ボタンの右、yは同じ高さ
    
    ; GUIウィンドウを表示
    Gui, Show, w400 h270, 最前面に固定マネージャー ; ウィンドウサイズを調整
    WinSet, AlwaysOnTop, On, 最前面に固定マネージャー ; このウィンドウを常に最前面に固定
    RefreshList() ; 初期化時にウィンドウ一覧を読み込む
}

; GUIを閉じる
GuiClose:
Gui, Destroy ; GUIを完全に破棄
return

; 一覧を更新する関数
RefreshList() {
    GuiControl,, WindowList, | ; リストをクリア(ループ開始前に一度だけ実行)
    WinGet, WindowIDs, List ; 全てのウィンドウIDを取得
    if (ErrorLevel) {
        AutoCloseMsg("ウィンドウ一覧の取得に失敗しました。", 3)
        return
    }
    Loop, %WindowIDs% {
        hWnd := WindowIDs%A_Index%
        WinGetTitle, Title, ahk_id %hWnd%
        WinGetClass, Class, ahk_id %hWnd%
        
        ; 無効なウィンドウを除外
        if (!InStr(Class, "Shell_TrayWnd")) { ; Shell_TrayWnd のみ除外
            ; ウィンドウが表示されているか確認
            WinGet, Style, Style, ahk_id %hWnd%
            if !(Style & 0x10000000) { ; WS_VISIBLE をチェック
                continue ; 表示されていないウィンドウはスキップ
            }
            
            ; タイトルが空の場合は「[無題]」と表示
            if (Title = "") {
                Title := "[無題]"
            }
            GuiControl,, WindowList, %Title% ; タイトルをリストに追加
        }
    }
}

; 「一覧を更新」ボタンのアクション
RefreshListButton:
    RefreshList()
return

; 最前面に固定/解除を切り替える関数
ToggleAlwaysOnTop:
    Gui, Submit, NoHide
    if (WindowList = "") {
        AutoCloseMsg("ウィンドウが選択されていません。", 3)
        return
    }
    ; 選択されたウィンドウのハンドルを取得
    WinGet, hWnd, ID, %WindowList%
    ; 現在の「最前面に固定」の状態を取得
    WinGet, isAlwaysOnTop, ExStyle, ahk_id %hWnd%
    isAlwaysOnTop := (isAlwaysOnTop & 0x8) ; WS_EX_TOPMOST をチェック
    ; 最前面に固定の状態を反転
    if (isAlwaysOnTop) {
        WinSet, AlwaysOnTop, Off, ahk_id %hWnd%
        AutoCloseMsg("最前面に固定を解除しました: " WindowList, 3)
    } else {
        WinSet, AlwaysOnTop, On, ahk_id %hWnd%
        AutoCloseMsg("最前面に固定しました: " WindowList, 3)
    }
return

; 自動的に閉じるメッセージを表示する関数
AutoCloseMsg(Text, Timeout) {
    ; メッセージを表示
    ToolTip, %Text%, 10, 10 ; 左上にメッセージを表示
    SetTimer, RemoveToolTip, % Timeout * 1000 ; 指定された時間後にメッセージを削除
    return

    RemoveToolTip:
        ToolTip ; ToolTipを削除
        SetTimer, RemoveToolTip, Off ; タイマーを停止
    return
}

; トレイアイコンのメニューからGUIを表示
ShowGUI:
    if WinExist("最前面に固定マネージャー") {
        WinActivate
    } else {
        CreateGUI()
    }
return

; スクリプトを終了
ExitScript:
ExitApp

最後に

ソースコードを入れれば自分好みのカスタマイズができます。ぜひいろいろ試してみてください。

コメント

タイトルとURLをコピーしました