見出し画像

PowerShellでウィンドウを「常に最前面」に設定する

Windows で作業中に特定のウィンドウを「常に最前面」に表示したいことはありませんか?
生成AIのウインドウを常に横に表示させておいたりとか、他のウインドウに隠れないようにしたいとか、、、

検索すればフリーソフトでたくさん出てきますが

Windows標準でやりたい人向けのPowerShellを使って簡単にウィンドウを「常に最前面」に設定するスクリプトをChatGPTを使って作成してみました。
ウィンドウ一覧から選択したウィンドウを「常に最前面」にすることができます。
注意:以下のスクリプトには解除する機能はないのでウインドウを閉じるしかないです

スクリプト

# Add-Typeで必要なユーザー32.dll関数をインポート
Add-Type @"
using System;
using System.Runtime.InteropServices;

public class User32 {
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

    public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
    public const UInt32 SWP_NOSIZE = 0x0001;
    public const UInt32 SWP_NOMOVE = 0x0002;
    public const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;
}
"@

# Get-Processでウィンドウを持つプロセスを取得
$processes = Get-Process | Where-Object { $_.MainWindowTitle -ne "" }

# ウィンドウタイトルの選択プロンプトを表示
$windowTitles = $processes | Select-Object -ExpandProperty MainWindowTitle
$selectedTitle = $windowTitles | Out-GridView -Title "常に最前面に表示するウィンドウを選択" -OutputMode Single

# 選択されたウィンドウのプロセスを取得
$selectedProcess = $processes | Where-Object { $_.MainWindowTitle -eq $selectedTitle }

if ($selectedProcess) {
    $hwnd = $selectedProcess.MainWindowHandle
    # ウィンドウを常に最前面に設定
    [User32]::SetWindowPos($hwnd, [User32]::HWND_TOPMOST, 0, 0, 0, 0, [User32]::TOPMOST_FLAGS)
    [User32]::SetForegroundWindow($hwnd)
    Write-Host "ウィンドウ '$selectedTitle' は常に最前面に設定されました。"
} else {
    Write-Host "ウィンドウが選択されませんでした。"
}

スクリプトの実行方法

  1. PowerShellを開きます。

  2. 上記のスクリプトをコピーしてPowerShellに貼り付け、実行します。

  3. ウィンドウ一覧が表示されるので、常に最前面にしたいウィンドウを選択します。

これで、選択したウィンドウが「常に最前面」に設定されます。

解除する機能はないのでウインドウを閉じるしかないです


いいなと思ったら応援しよう!