我正在编写一个Chrome扩展程序,用于在单击按钮时调整当前窗口的大小并重新定位,它用于重新定位显示窗口的当前监视器上的窗口。它旨在使当前的Chrome窗口填充当前的监视器,但没有最大化。
这是我的代码:
function start(tab) {
// Type: `(tab: tabs.Tab): void`
// `tabs.Tab`: https://developer.chrome.com/extensions/tabs#type-Tab
chrome.windows.getCurrent( getCurrentWindowCallback );
}
function getCurrentWindowCallback( currentWindow ) {
// Type: `(window: Window): void`
// `Window`: https://developer.chrome.com/extensions/windows#type-Window
if( !'id' in currentWindow ) return;
var s = window.screen;
var newState = {
left: s.availLeft,
top: s.availTop,
width: s.width,
height: s.availHeight,
state: "normal"
};
chrome.windows.update(
/*windowId:*/ currentWindow.id,
/*updateInfo: */ newState,
/*callback: */ null
);
}
chrome.browserAction.onClicked.addListener( start );
但是,当我运行此功能时,window.screen
的值始终与我计算机上的第一台显示器相对应,无论当前Chrome浏览器窗口所在的屏幕是什么。
{ availLeft: 0, availTop: 0, width: 1920, availHeight: 1170 }
currentWindow
对象是一个特殊的Chrome扩展程序API对象,不会共享全局screen
对象所具有的window
属性。我怀疑这是因为window
指的是后台脚本执行的隐藏窗口。
是否可以在不需要DOM权限/访问权限的情况下获取当前Chrome浏览器窗口的screen
对象?
答案 0 :(得分:1)
我通过使用chrome.tabs.executeScript
运行一个脚本来解决这个问题,该脚本从当前窗口复制window.screen
对象并将其传递回我的脚本以重新定位并调整窗口大小:
var getScreenScript = `var screenInfo = {
screen: {
availTop : window.screen.availTop,
availLeft : window.screen.availLeft,
availHeight: window.screen.availHeight,
availWidth : window.screen.availWidth,
colorDepth : window.screen.colorDepth,
height : window.screen.height,
left : window.screen.left,
orientation: window.screen.orientation,
pixelDepth : window.screen.pixelDepth,
top : window.screen.top,
width : window.screen.width
},
screenX : window.screenX,
screenY : window.screenY,
screenLeft: window.screenLeft,
screenTop : window.screenTop,
}; screenInfo`;
function start(tab) {
// Type: `(tab: tabs.Tab): void`
// `tabs.Tab`: https://developer.chrome.com/extensions/tabs#type-Tab
if( !'id' in tab ) return;
// Ensure the `tabId` is set, otherwise I got permissions errors.
chrome.tabs.executeScript( /*tabId:*/ tab.id, { code: getScreenScript }, getScreenScriptResultCallback );
}
function getScreenScriptResultCallback( args ) {
var screenInfo = args[0];
chrome.windows.getCurrent( function(currentWindow) {
if( !'id' in currentWindow ) return;
transformWindow( currentWindow, screenInfo );
} );
}
function transformWindow( currentWindow, screenInfo ) {
// Type: `(currentWindow: Window, screenInfo: object): void`
// `Window`: https://developer.chrome.com/extensions/windows#type-Window
var newState = {
left : screenInfo.screen.availLeft, // `availLeft` is the X coordinate of the current screen in the multi-mon workspace.
top : screenInfo.screen.availTop,
width : screenInfo.screen.availWidth,
height: screenInfo.screen.availHeight,
state: "normal"
};
chrome.windows.update( currentWindow.id, newState, /*callback: */ null );
}
chrome.browserAction.onClicked.addListener( start );