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"
}
相关推荐
烛阴11 小时前
从零开始掌握C#核心:变量与数据类型
前端·c#
han_12 小时前
前端高频面试题之Vuex篇
前端·vue.js·面试
qq_4152162512 小时前
vue3搭建项目yarn+vue3+webpack+less+element-plus
前端·webpack·less
天天向上102412 小时前
VueUse的使用
前端·vue.js·vscode
猪猪拆迁队13 小时前
前端图形引擎架构设计:双引擎架构设计
前端·后端·架构
宋辰月14 小时前
学习react第三天
前端·学习·react.js
bug总结14 小时前
更新原生小程序封装(新增缓存订阅)完美解决
前端·缓存·小程序
GISer_Jing14 小时前
Node.js 开发实战:从入门到精通
javascript·后端·node.js
5335ld14 小时前
后端给的post 方法但是要求传表单数据格式(没有{})
开发语言·前端·javascript·vue.js·ecmascript
二川bro14 小时前
第33节:程序化生成与无限地形算法
前端·算法·3d·threejs