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

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. python3删除mysql上月分区数据(脚本)

    import datetime import pymysql import pymysql.cursors tables_schdule=["talbe1","table ...

  2. PL/SQL配置和连接远端数据库

    1. 安装与配置 (1) 安装 因为是免安装的绿色版,所以解压到目录就可以了,保证目录中没有空格.下划线和中文字符. 还有一点,PL/SQL需要和Oracle的版本一致,都是32位或者都是64位,否则 ...

  3. GO --- 将Reader 或者 ReadCloser 转化为 ReadSeeker

    原因: ReadSeeker 封装了Seek()方法,这个方法要求资源的任何位置都能被定位,例如存储在磁盘里文件,你可以随时读取文件的任意位置.而response.Body 是通过TCP连接从网络中读 ...

  4. es6语法中的arrow function=>

    (x) => x + 相当于 function(x){ ; }; var ids = this.sels.map(item => item.id).join() var ids = thi ...

  5. Java工作笔记:工作中使用JNA调用C++库的一些细节(转载)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/zjutzmh/article/detai ...

  6. leetcode 108. Convert Sorted Array to Binary Search Tree 、109. Convert Sorted List to Binary Search Tree

    108. Convert Sorted Array to Binary Search Tree 这个题使用二分查找,主要要注意边界条件. 如果left > right,就返回NULL.每次更新的 ...

  7. 阶段5 3.微服务项目【学成在线】_day18 用户授权_12-前端集成认证授权-携带JWT授权

    携带JWT授权 登陆后jwt已经存到了sessionStorage里面 当进行微服务的请求就要携带令牌.我们在拦截器里面做文章. 在axios的intercepters拦截器上 手工的给这个课程 造一 ...

  8. 不是springboot项目怎么使用内置tomcat

    不是springboot项目怎么使用内置tomcat   解决方法: 1.pom.xml中添加以下依赖 <properties>  <tomcat.version>8.5.23 ...

  9. PAT 甲级 1031 Hello World for U (20 分)(一开始没看懂题意)

    1031 Hello World for U (20 分)   Given any string of N (≥) characters, you are asked to form the char ...

  10. Cas(02)——部署Cas Server

    部署Cas Server Cas应用都需要有一个Cas Server.Cas Server是基于Java Servlet实现的,其要求部署在Servlet2.4以上版本的Web容器中.在此笔者将其部署 ...