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"
}
相关推荐
aiprtem34 分钟前
基于Flutter的web登录设计
前端·flutter
浪裡遊37 分钟前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
why技术44 分钟前
Stack Overflow,轰然倒下!
前端·人工智能·后端
GISer_Jing1 小时前
0704-0706上海,又聚上了
前端·新浪微博
止观止1 小时前
深入探索 pnpm:高效磁盘利用与灵活的包管理解决方案
前端·pnpm·前端工程化·包管理器
whale fall1 小时前
npm install安装的node_modules是什么
前端·npm·node.js
会飞的鱼先生1 小时前
Node.js-http模块
网络协议·http·node.js
烛阴1 小时前
简单入门Python装饰器
前端·python
袁煦丞2 小时前
数据库设计神器DrawDB:cpolar内网穿透实验室第595个成功挑战
前端·程序员·远程工作
天天扭码2 小时前
从图片到语音:我是如何用两大模型API打造沉浸式英语学习工具的
前端·人工智能·github