windows 10, 如何使用 batch , vbs 將桌面上的視窗移至特定位置?
在 Windows 10 中,單純使用原生 Batch 或 VBScript 是無法直接移動第三方視窗的,因為這些腳本語言缺乏直接控制 Windows GUI 視窗 API(如 MoveWindow)的能力。
要達成這個目的,最有效率的原生做法是使用 PowerShell,或是用 VBScript 呼叫 PowerShell/Excel 內建的 API。
以下為您提供三種最實用的解決方案:
方案一:使用 VBScript 呼叫 PowerShell(推薦,免安裝最方便)
這個方法最安全,因為它完全使用 Windows 10 內建的組件。我們利用 VBScript 啟動 PowerShell,並透過 PowerShell 呼叫 Windows API (user32.dll) 來移動視窗。
請建立一個名為 move_window.vbs 的檔案,並寫入以下程式碼:
' 設定目標視窗標題與位置
Dim windowTitle, x, y, width, height
windowTitle = "記事本" ' 改為您的目標視窗標題(支援部分比對)
x = 100 ' 畫面 X 座標
y = 100 ' 畫面 Y 座標
width = 800 ' 視窗寬度
height = 600 ' 視窗高度
' 組合 PowerShell 指令
Dim psCmd
psCmd = "powershell -NoProfile -Command """ & _
"[[void]][System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); " & _
"$code = @' " & vbCrLf & _
"[DllImport(\""user32.dll\"")] " & vbCrLf & _
"public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); " & vbCrLf & _
"[DllImport(\""user32.dll\"")] " & vbCrLf & _
"public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); " & vbCrLf & _
"'@; " & _
"$type = Add-Type -MemberDefinition $code -Name Win32 -PassThru; " & _
"$ws = New-Object -ComObject Shell.Application; " & _
"$win = $ws.Windows() | Where-Object { $_.LocationName -like '*" & windowTitle & "*' -or $_.Name -like '*" & windowTitle & "*' }; " & _
"if (!$win) { $processes = Get-Process | Where-Object { $_.MainWindowTitle -like '*" & windowTitle & "*' }; " & _
"foreach ($p in $processes) { $type::MoveWindow($p.MainWindowHandle, " & x & ", " & y & ", " & width & ", " & height & ", $true) } }" & _
""""
' 執行指令(隱藏視窗背景執行)
CreateObject("Wscript.Shell").Run psCmd, 0, True
方案二:使用純 PowerShell 腳本(程式碼最乾淨)
如果您不一定要用 .vbs 或 .bat 副檔名,直接寫成 .ps1 檔案是 Windows 10 系統下最標準的做法。
請建立一個 MoveWindow.ps1 檔案:
# 定義 Windows API
$API = @'
[DllImport("user32.dll")]
public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
'@
Add-Type -MemberDefinition $API -Name WindowModifier -Namespace Win32
# 設定目標與參數
$ProcessName = "notepad" # 執行緒名稱(例如記事本為 notepad)
$X = 200
$Y = 200
$Width = 1024
$Height = 768
# 取得視窗控制代碼並移動
$Target = Get-Process -Name $ProcessName -ErrorAction SilentlyContinue
if ($Target) {
[Win32.WindowModifier]::MoveWindow($Target.MainWindowHandle, $X, $Y, $Width, $Height, $true)
}
- 如何執行:您可以寫一個簡易的
.bat 檔案來啟動它:powershell -ExecutionPolicy Bypass -File "C:\路徑\MoveWindow.ps1"
方案三:使用 VBScript 模擬鍵盤快速鍵(僅能靠邊或最大化)
如果您的目的只是想把視窗「靠左」、「靠右」或「最大化」,不需要精準的座標(如 X=123),可以用 VBScript 模擬 Windows 10 的快捷鍵(Win + 方向鍵)。
請建立 snap_window.vbs:
Set WshShell = CreateObject("WScript.Shell")
' 1. 先將目標視窗帶到最前端(以記事本為例)
WshShell.AppActivate "記事本"
WScript.Sleep 500 ' 等待視窗反應
' 2. 模擬按下 Win + 左方向鍵 (將視窗靠左側拼貼)
' 註:VBScript 無法直接模擬 Win 鍵,但可以透過組合鍵或複製特定行為。
' 這裡改用通用組合鍵:Alt + Space,再按 M (移動),再用方向鍵移動
WshShell.SendKeys "% "
WScript.Sleep 100
WshShell.SendKeys "M"
WScript.Sleep 100
WshShell.SendKeys "{LEFT 50}" ' 往左移動 50 次
WshShell.SendKeys "{ENTER}" ' 確認位置
(注意:此方法容易受到當前使用者滑鼠點擊干擾,精準度較低。)
如果您想讓腳本更符合您的需求,請告訴我:
- 您想要移動的目標程式是什麼?(例如:Chrome 瀏覽器、LINE、或是特定的資料夾?)
- 您的具體移動規則是什麼?(例如:固定移到右下角、或者是偵測雙螢幕移動?)
沒有留言:
張貼留言