前言
node 启动windows应用程序是没有问题的,但是设置窗口大小和屏幕显示位置是无法完成的。 我这里用到的是exec 执行powershell。
node 代码
应用程序如果设置了最小窗口宽度限制,则会触发应用程序的宽度,就会设置失败, 句柄一定要是对的。
js
const { exec } = require("child_process");
const path = require("path");
// 直接调用
// 执行 PowerShell 脚本,传入参数
// scriptPath 下面创建的.ps1文件
const scriptPath = const fullPath = path.resolve(__dirname, './openwindows.ps1')
// programName exe 文件路径
const scriptPath = "D:\softwarellApifoxApifox.exe"
// windowTitle 启动程序的句柄
const windowTitle = "Apifox"
// x y 窗口放置的位置,width height 设置窗口的宽高
exec(
`powershell -ExecutionPolicy Bypass -File "${scriptPath}" -programName "${programName}" -windowTitle "${windowTitle}" -x ${x} -y ${y} -width ${width} -height ${height}`,
(err, stdout, stderr) => {
console.log(err, stdout, stderr);
if (err) {
console.error("执行失败:", err);
} else {
console.log("窗口已移动");
}
}
);
创建.ps1文件
powershell
param(
[string]$programName = "notepad.exe", # 默认程序名称
[string]$windowTitle = "无标题 - 记事本", # 默认窗口标题
[int]$x = 300, # 默认 X 坐标
[int]$y = 200, # 默认 Y 坐标
[int]$width = 800, # 默认宽度
[int]$height = 600 # 默认高度
)
# 启动指定程序
$proc = Start-Process -FilePath $programName -PassThru
# 等待窗口打开
Start-Sleep -Seconds 3
# 加载 user32.dll 函数(修正后的 C# 代码)
$cSharpCode = @'
using System;
using System.Runtime.InteropServices;
public class Win32 {
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
}
'@
Add-Type -TypeDefinition $cSharpCode -Language CSharp
$process = Get-Process -Name $windowTitle | Where-Object { $_.MainWindowHandle -ne 0 }
if ($process) {
Write-Host 'error2'
$hwnd = $process.MainWindowHandle
if ($hwnd -eq 0) {
Write-Host "进程存在,但无主窗口(可能是后台运行或最小化)。"
} else {
Write-Host "窗口句柄: $hwnd"
}
} else {
Write-Host "未找到进程 '$processName'。"
}
# 3. 最终检查
if ($hwnd -eq [IntPtr]::Zero) {
Write-Host 'error'
Write-Host "错误:未找到窗口 '$windowTitle' 或进程 '$processName'。"
Write-Host "请检查:"
Write-Host "1. 窗口标题是否匹配(当前标题:$(Get-Process | Where-Object { $_.MainWindowTitle -like $windowTitle } | Select-Object -ExpandProperty MainWindowTitle))"
Write-Host "2. 是否以管理员身份运行脚本"
exit
}
if ($hwnd -ne [IntPtr]::Zero) {
# 设置位置与大小:x, y, width, height
[Win32]::MoveWindow($hwnd, $x, $y, $width, $height, $true)
Write-Host "窗口已调整位置和大小"
} else {
Write-Host "未找到窗口:$windowTitle"
}