node 启动本地应用程序并设置窗口大小和屏幕显示位置

前言

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"
}
相关推荐
浪遏6 小时前
recruitment-cli:让 AI 接手求职招聘,从架构到一次发送超时
架构·typescript·node.js
treasure14011 小时前
【复古】浅尝Django前后端不分离
前端·css·python·django·bootstrap·html·web
jay神13 小时前
基于 YOLOv8 的手势识别系统(Web 版)
前端·人工智能·python·深度学习·yolo·计算机视觉·计算机毕业设计
屏什么录13 小时前
长时间录屏中途崩溃:MP4 打不开的 6 种救回方案与参数设置
前端·音视频开发
code_Bo13 小时前
不只命令行:我把跨 Agent 会话同步做成了桌面应用
前端·javascript·后端
kyriewen13 小时前
AI 能把页面写出来,为什么改个需求就开始崩?
前端·javascript·人工智能
涛涛ing14 小时前
2026年最值得关注的前端变化,藏在“默认值”里
前端
亿元程序员16 小时前
太牛了!这AI做出来的游戏,居然还能变现!
前端
hellice17 小时前
闪传 FlashDrop 实战:我用 300 行 Node 代码做了个「4 位取件码」临时文件中转站
前端·产品
用户08297732600517 小时前
RTX 5500 MIG 踩坑记录:切分之后模型跑不起来,排错整整一下午
前端