如下是对窗口最大化,最小化等相关操作:

import { ipcMain, ipcRenderer, remote } from 'electron'
import is from 'electron-is' // ipc 通信发送的窗口状态改变事件的channel名称
export const windowStateChangeChannel = 'window-state-changed' // window的当前状态
export const WINDOW_STATE = {
FULLSCREEN: 'full-screen',
MAXIMIZED: 'maximized',
MINIMIZED: 'minimized',
HIDDEN: 'hidden',
NORMAL: 'normal',
} // window可执行的操作,通过发送消息触发
const windowAction = {
maximize: 'window-maximize',
unmaximize: 'window-unmaximize',
minimize: 'window-minimize',
close: 'window-close',
} /**
* 获取window的状态
* @param {window对象} window
*/
export function getWindowState(window) {
if (window.isFullScreen()) {
return WINDOW_STATE.FULLSCREEN
} if (window.isMaximized()) {
return WINDOW_STATE.MAXIMIZED
} if (window.isMinimized()) {
return WINDOW_STATE.MINIMIZED
} if (!window.isVisible()) {
return WINDOW_STATE.HIDDEN
} return WINDOW_STATE.NORMAL
} /**
* 发送一个 window-state-changed 消息到 renderer 进程
* @param {\*} window
* @param {\*} state
*/
function sendWindowStateEvent(window, state) {
window.webContents.send(windowStateChangeChannel, state)
} /**
* 注册 window 状态变化后事件,它会发送一个消息到 renderer 进程
* @param {window对象} window
*/
export function registerWindowStateChangedEvents(window) {
window.on('enter-full-screen', () => sendWindowStateEvent(window, 'full-screen'))
window.on('leave-full-screen', () => sendWindowStateEvent(window, 'normal'))
window.on('maximize', () => sendWindowStateEvent(window, 'maximized'))
window.on('minimize', () => sendWindowStateEvent(window, 'minimized'))
window.on('unmaximize', () => sendWindowStateEvent(window, 'normal'))
window.on('restore', () => sendWindowStateEvent(window, 'normal'))
window.on('hide', () => sendWindowStateEvent(window, 'hidden'))
window.on('show', () => sendWindowStateEvent(window, 'normal'))
} /**
* 注册 window 状态变化动作,使用 ipc.send 对应的消息触发*
* @param {window对象} window
*/
export function registerWindowStateChangeActions(window) {
// 窗口最小化
ipcMain.on(windowAction.minimize, () => {
window.minimize()
}) // 窗口最大化
ipcMain.on(windowAction.maximize, () => {
window.maximize()
}) // 窗口取消最大化
ipcMain.on(windowAction.unmaximize, () => {
window.unmaximize()
}) // 窗口关闭
ipcMain.on(windowAction.close, () => {
window.close()
})
} /**
* 生成带有promise的操作窗口的函数,可以进一步处理事件结束后的逻辑
* @param {窗口可执行的操作} windowAction
*/
function generatePromisedWindowStateFunc(action) {
return () => {
return new Promise((resolve) => {
ipcRenderer.send(action)
ipcRenderer.once(windowStateChangeChannel, (event, args) => {
resolve(args)
})
})
}
} /**
* 生成不带有promise的操作窗口函数,只负责触发事件
* @param {窗口可执行的操作} windowAction
*/
function generateWindowStateFunc(action) {
return () => {
ipcRenderer.send(action)
}
} /**
* 最大化窗口的方法,因为windows和macOS之间的差异,单独写成一个函数
*/
function handleMaximizeWindow() {
if (is.windows()) {
remote.getCurrentWindow().maximize()
return Promise.resolve(WINDOW_STATE.MAXIMIZED)
} return new Promise((resolve) => {
ipcRenderer.send(windowAction.maximize)
ipcRenderer.once(windowStateChangeChannel, (event, args) => {
resolve(args)
})
})
} /**
* 窗口操作方法,包括最大化,最小化,关闭
* 每个方法返回一个promise,方便处理后续逻辑
*/
export const windowStateActionResponse = {
maximize: handleMaximizeWindow,
unmaximize: generatePromisedWindowStateFunc(windowAction.unmaximize),
minimize: generatePromisedWindowStateFunc(windowAction.minimize),
close: generatePromisedWindowStateFunc(windowAction.close),
} /**
* 窗口操作方法,包括最大化,最小化,关闭
* 只发送消息,不处理成功之后的回调
*/
export const WindowStateAction = {
maximize: generateWindowStateFunc(windowAction.maximize),
unmaximize: generateWindowStateFunc(windowAction.unmaximize),
minimize: generateWindowStateFunc(windowAction.minimize),
close: generateWindowStateFunc(windowAction.close),
} /**
* 给窗口改变事件增加监听
* @param {事件触发后的回调} handle
*/
export function listenToWindowStateChange(handle) {
ipcRenderer.on(windowStateChangeChannel, handle)
return () => {
ipcRenderer.removeListener(windowStateChangeChannel, handle)
}
}

下面是electron配置:

import { BrowserWindow, screen } from 'electron'

function createWebRTCInternalWindow() {
const displayWorkAreaSize = screen.getAllDisplays()[0].workArea const options = {
x: displayWorkAreaSize.x,
y: displayWorkAreaSize.y,
width: displayWorkAreaSize.width,
height: displayWorkAreaSize.height,
resizable: true,
movable: true,
fullscreenable: false,
enableLargerThanScreen: false,
frame: true,
transparent: false,
alwaysOnTop: false,
hasShadow: false,
minWidth: 1000,
minHeight: 648,
webPreferences: {
devTools: true,
webSecurity: false,
plugins: true,
experimentalFeatures: true,
experimentalCanvasFeatures: true,
minimumFontSize: 10,
},
} const mainWindow = new BrowserWindow(options) return mainWindow
} export default createWebRTCInternalWindow
import { BrowserWindow, screen } from 'electron'

function createBrowserWindow() {
const displayWorkAreaSize = screen.getAllDisplays()[0].workArea const options = {
width: parseInt(displayWorkAreaSize.width * 0.85, 10),
height: parseInt(displayWorkAreaSize.height * 0.85, 10),
center: true,
resizable: true,
movable: true,
fullscreenable: false,
enableLargerThanScreen: false,
frame: false,
transparent: true,
alwaysOnTop: false,
clickThrough: 'pointer-events',
acceptFirstMouse: true,
hasShadow: false,
minWidth: 1000,
minHeight: 648,
webPreferences: {
devTools: true,
webSecurity: false,
plugins: true,
experimentalFeatures: true,
experimentalCanvasFeatures: true,
minimumFontSize: 10,
},
} const mainWindow = new BrowserWindow(options) return mainWindow
} export default createBrowserWindow

如上配置中可设置一系列初始值,其中包括 是否可resize,是否可拖动等。如果想在其它地方修改初始值,可按照如下实现:

const currentWindow = require('electron').remote.getCurrentWindow()

currentWindow.setResizable(false)
currentWindow.setMovable(false)
// 禁止Windows下双击最大化和调用maximize行为不一致导致的窗口尺寸变化
currentWindow.setMaximizable(false)

electron窗口相关操作(放大缩小退出,可拖动,可resize等)的更多相关文章

  1. WPF布局之让你的控件随着窗口等比放大缩小,适应多分辨率满屏填充应用

    一直以来,我们设计windows应用程序,都是将控件的尺寸定好,无论窗体大小怎么变,都不会改变,这样的设计对于一般的应用程序来说是没有问题的,但是对于一些比较特殊的应用,比如有背景图片的,需要铺面整个 ...

  2. 解决多指操作放大缩小 指针错误 java.lang.IllegalArgumentException: pointerIndex out of range

    /** Custom your own ViewPager to extends support ViewPager. java source: */ /** Created by azi on 20 ...

  3. Atom窗口切换和放大或者缩小

    Atom窗口切换和放大或者缩小   快捷键就是 F11

  4. WebView 判断放大缩小操作

    using Android.App; using Android.Widget; using Android.OS; using Android.Content; using Android.Runt ...

  5. 猫猫学IOS(二)UI之button操作 点击变换 移动 放大缩小 旋转

    不多说,先上图片看效果,猫猫分享.必须精品 原创文章.欢迎转载.转载请注明:翟乃玉的博客 地址:viewmode=contents">http://blog.csdn.net/u013 ...

  6. AJ学IOS(02)UI之按钮操作 点击变换 移动 放大缩小 旋转

    不多说,先上图片看效果,AJ分享,必须精品 这个小程序主要实现点击方向键可以让图标上下左右动还有放大缩小以及旋转的功能,点击图片会显示另一张图片. 点击变换 其实用到了按钮的两个状态,再State C ...

  7. Canvas实现图片放大缩小移动操作

    对于HTML5相信大家都不陌生,很早就出来了,但是貌似都没有真正的使用过.最近做项目时要实现这样一个需求:一个图片,大小不固定,要求能实现类似地图一样放大.缩小.移动功能.这里就很合适使用html5的 ...

  8. Android DIY之路 (一) 指定区域多图片合成 放大 缩小 镜像 旋转 等(转)

    惯例先看效果图 // 注意做类似这种模板功能时候 方位由后台数据提供,这里我们用假数据 4个点 或者xy 加区域来做示例 //一开始我们公司用的是透明盖住 操作图片 但发现 局限性较大.后来直接限定区 ...

  9. 手把手教你打造ImageView支持手势放大缩小

    写在前面 最近有了新的任务,学习的时间比以前少了不少,Java回炉的文估计是得缓缓了,不过每周一篇尽量保质保量.最近感觉我文写的有点不好,因为我写东西除非必要,不然概念性的东西我基本上都是一笔带过…… ...

随机推荐

  1. 简单动态字符串-redis设计与实现

    简单动态字符串 Sds (Simple Dynamic String,简单动态字符串)是 Redis 底层所使用的字符串表示, 几乎所有的 Redis 模块中都用了 sds. 本章将对 sds 的实现 ...

  2. JAVA爬虫对font-face字体反爬虫解密

    1.参考博客          https://www.jianshu.com/p/9975de57b0ce          https://blog.csdn.net/litang199612/a ...

  3. Alpha项目冲刺! Day4-产出

    各个成员今日完成的任务 林恩:任务分工,博客撰写,了解安卓环境搭建 杨长元:安卓本地数据库基本建立 李震:学习 胡彤:完善服务端 寇永明:学习 王浩:学习 李杰:学习 各个成员遇到的问题 林恩:为自己 ...

  4. js修改Switchery复选框的状态

    声明一个switchery插件,绑定到一个input上 js代码 var mySwitch = new Switchery($('#blacklist')[0], { size:"small ...

  5. Ajax 是什么? 如何创建一个Ajax?

    ajax的全称:Asynchronous Javascript And XML. 异步传输+js+xml. 所谓异步,在这里简单地解释就是:向服务器发送请求的时候,我们不必等待结果,而是可以同时做其他 ...

  6. excel_vlookup函数_python代码实现

    python入门经典视频系列教程(免费,2K超清,送书) https://study.163.com/course/courseMain.htm?courseId=1006183019&sha ...

  7. Intel AI Cloud 使用

    1.申请AI Cloud A ‘training-ready’ hardware like Amazon® EC2, Intel® AI DevCloud, or a GPU-based system ...

  8. ES6展开运算符数组合并,函数传参

    定义: .展开运算符允许一个表达式在某处展开. 使用场景 1.展开函数在多个参数的地方使用 .意指用于函数传参 2.多个元素的地方使用,意指用于数组字面量 3.多个边框的地方使用,意指用于解构赋值 函 ...

  9. python下multiprocessing和gevent的组合使用

    python下multiprocessing和gevent的组合使用 对于有些人来说Gevent和multiprocessing组合在一起使用算是个又高大上又奇葩的工作模式. Python的多线程受制 ...

  10. 算法习题---4-4骰子涂色(UVa253)

    一:题目 分别对两个骰子的六个面涂色r-红 b-蓝 g-绿,通过转动骰子,看两个骰子是不是一样的涂色方法 (一)题目详解 题目规定了正方体的六个面的序号:从1-,按照这个需要提供涂色序列 (二)案例展 ...