npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@sky-hi/window-manager

v0.0.2

Published

A window manager library for Electron applications

Readme

@sky-hi/window-manager

一个用于 Electron 应用的窗口管理库,提供了简单而强大的窗口管理功能。

特性

  • 窗口创建和管理
  • 窗口组管理
  • 支持开发环境和生产环境
  • 自定义协议支持
  • 窗口状态管理(最大化、最小化、还原等)
  • 窗口事件监听
  • 安全的渲染进程 API
  • TypeScript 支持
  • 完整的类型定义

安装

npm install @sky-hi/window-manager
# 或
yarn add @sky-hi/window-manager
# 或
pnpm add @sky-hi/window-manager

使用方法

主进程

import { app } from 'electron';
import WindowManager from '@sky-hi/window-manager';

let windowManager: WindowManager;

// 启动应用
app.whenReady().then(() => {
  // 创建窗口管理器实例
  windowManager = new WindowManager({
    rendererDirectoryName: 'dist', // 渲染进程目录名
    devServerUrl: 'http://localhost:5173', // 开发服务器 URL(可选)
    webPreferences: {
      // 自定义 webPreferences
    }
  });

  // 创建主窗口
  const mainWindow = windowManager.createWindow({
    isMainWin: true,
    route: '/',
    width: 800,
    height: 600,
    maximize: true // 是否最大化
  });

  // 创建子窗口
  const childWindow = windowManager.createWindow({
    parentId: mainWindow.id,
    route: '/child',
    width: 400,
    height: 300
  });
});

// 清理
app.on('window-all-closed', () => {
  windowManager.closeAllWindow();
});

渲染进程

// 类型定义已包含在库中
declare global {
  interface Window {
    windowManager: {
      createWindow: (options?: WindowOptions) => Promise<number>;
      closeWindow: (winId?: number) => Promise<void>;
      hideWindow: (winId?: number) => Promise<void>;
      showWindow: (winId?: number) => Promise<void>;
      minimizeWindow: (winId?: number) => Promise<void>;
      maximizeWindow: (winId?: number) => Promise<void>;
      toggleMaximizeWindow: (winId?: number) => Promise<void>;
      restoreWindow: (winId?: number) => Promise<void>;
      reloadWindow: (winId?: number) => Promise<void>;
      focusWindow: (winId: number) => Promise<void>;
      getWindowInfo: (params?: WindowInfoParams) => Promise<WindowInfo>;
      getDisplayInfo: () => Promise<Electron.Display[]>;
    };
  }
}

// 使用示例
async function example() {
  // 创建新窗口
  const winId = await window.windowManager.createWindow({
    route: '/new-window',
    width: 400,
    height: 300
  });

  // 获取窗口信息
  const windowInfo = await window.windowManager.getWindowInfo({
    isBounds: true,
    isMaximized: true,
    isFocused: true
  });

  // 获取显示器信息
  const displays = await window.windowManager.getDisplayInfo();
}

渲染进程详细使用说明

  1. 窗口创建
// 创建独立窗口
const winId = await window.windowManager.createWindow({
  route: '/new-window',
  width: 800,
  height: 600,
  title: '新窗口',
  webPreferences: {
    nodeIntegration: true
  }
});

// 创建模态窗口
const modalWinId = await window.windowManager.createWindow({
  route: '/modal',
  width: 400,
  height: 300,
  parentId: winId, // 指定父窗口
  modal: true
});
  1. 窗口控制
// 关闭当前窗口
await window.windowManager.closeWindow();

// 关闭指定窗口
await window.windowManager.closeWindow(winId);

// 最小化窗口
await window.windowManager.minimizeWindow();

// 最大化窗口
await window.windowManager.maximizeWindow();

// 切换最大化状态
await window.windowManager.toggleMaximizeWindow();

// 还原窗口
await window.windowManager.restoreWindow();
  1. 窗口状态管理
// 隐藏窗口
await window.windowManager.hideWindow();

// 显示窗口
await window.windowManager.showWindow();

// 聚焦窗口
await window.windowManager.focusWindow(winId);

// 重新加载窗口
await window.windowManager.reloadWindow();
  1. 获取窗口信息
// 获取当前窗口的完整信息
const windowInfo = await window.windowManager.getWindowInfo({
  isBounds: true,      // 获取窗口位置和大小
  isMaximized: true,   // 获取最大化状态
  isMinimized: true,   // 获取最小化状态
  isFullScreen: true,  // 获取全屏状态
  isVisible: true,     // 获取可见状态
  isDestroyed: true,   // 获取销毁状态
  isFocused: true,     // 获取焦点状态
  isAlwaysOnTop: true  // 获取置顶状态
});

// 获取显示器信息
const displays = await window.windowManager.getDisplayInfo();
console.log('可用显示器:', displays);
  1. 实际应用场景
// 创建设置窗口
async function openSettings() {
  const settingsWinId = await window.windowManager.createWindow({
    route: '/settings',
    width: 600,
    height: 400,
    title: '设置',
    resizable: false,
    minimizable: false
  });
}

// 创建预览窗口
async function openPreview() {
  const previewWinId = await window.windowManager.createWindow({
    route: '/preview',
    width: 1024,
    height: 768,
    title: '预览',
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false
    }
  });
}

// 窗口状态监听
async function monitorWindowState() {
  const windowInfo = await window.windowManager.getWindowInfo({
    isMaximized: true,
    isFocused: true
  });
  
  if (windowInfo.isMaximized) {
    console.log('窗口已最大化');
  }
  
  if (windowInfo.isFocused) {
    console.log('窗口已获得焦点');
  }
}

注意事项

  1. 所有窗口操作方法都是异步的,需要使用 async/await 或 Promise 处理
  2. 窗口 ID 是唯一的,建议保存需要重复操作的窗口 ID
  3. 创建窗口时可以指定 parentId 来创建父子窗口关系
  4. 使用 getWindowInfo 时,只请求需要的状态信息以提高性能
  5. 在开发环境中,确保 devServerUrl 配置正确
  6. 窗口操作失败时会抛出异常,建议使用 try-catch 处理

API 文档

WindowManager 类

构造函数选项

interface WindowManagerOptions {
  rendererDirectoryName?: string; // 渲染进程目录名
  devServerUrl?: string; // 开发服务器 URL
  icon?: string; // 窗口图标
  webPreferences?: Electron.WebPreferences; // 自定义 webPreferences
}

窗口选项

interface WindowOptions extends Electron.BrowserWindowConstructorOptions {
  id?: number;
  route?: string;
  isMultiWindow?: boolean;
  isMainWin?: boolean;
  maximize?: boolean;
  parentId?: number;
  isDevTools?: boolean;
}

窗口信息参数

interface WindowInfoParams {
  isBounds?: boolean;
  isMaximized?: boolean;
  isMinimized?: boolean;
  isFullScreen?: boolean;
  isVisible?: boolean;
  isDestroyed?: boolean;
  isFocused?: boolean;
  isAlwaysOnTop?: boolean;
}

渲染进程 API

方法

  • createWindow(options?: WindowOptions): Promise<number>
  • closeWindow(winId?: number): Promise<void>
  • hideWindow(winId?: number): Promise<void>
  • showWindow(winId?: number): Promise<void>
  • minimizeWindow(winId?: number): Promise<void>
  • maximizeWindow(winId?: number): Promise<void>
  • toggleMaximizeWindow(winId?: number): Promise<void>
  • restoreWindow(winId?: number): Promise<void>
  • reloadWindow(winId?: number): Promise<void>
  • focusWindow(winId: number): Promise<void>
  • getWindowInfo(params?: WindowInfoParams): Promise<WindowInfo>
  • getDisplayInfo(): Promise<Electron.Display[]>

注意事项

  1. 确保在主进程中正确初始化 WindowManager
  2. 使用 TypeScript 时,类型定义已包含在库中
  3. 窗口选项中的 webPreferences 配置会被默认的安全设置覆盖,如需修改请在构造函数选项中配置
  4. 支持开发环境和生产环境的不同配置
  5. 使用自定义协议加载本地文件

开发

# 安装依赖
npm install

# 运行类型检查
npm run type-check

# 运行测试
npm test

# 构建
npm run build

# 代码检查
npm run lint

要求

  • Electron >= 28.3.3
  • Node.js >= 20

许可证

MIT © leaf