Bypass Multiple Screen Detection
- Published on
- 4 mins read
Bypass Multiple Screen Detection with Tampermonkey Script
Install the Tampermonkey extension in your browser and create a new script with the following code:
// ==UserScript==
// @name Override Screen Detection
// @namespace http://tampermonkey.net/
// @version 2025-06-13
// @description Override multiple screen detection
// @author 7dpk
// @match https://subdomain.yousite.com/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=yoursite.com
// @grant none
// @run-at document-start
// ==/UserScript==
;(function () {
'use strict'
console.log('Screen override script loaded')
// Try 1: Immediate override if API exists
function overrideScreenAPI() {
if (window.getScreenDetails) {
console.log('Found getScreenDetails, overriding...')
const originalGetScreenDetails = window.getScreenDetails
window.getScreenDetails = async function () {
console.log('getScreenDetails called, returning single screen')
try {
const originalDetails = await originalGetScreenDetails.call(this)
console.log('Original details:', originalDetails)
const modifiedDetails = {
...originalDetails,
screens: [originalDetails.screens[0]],
currentScreen: originalDetails.screens[0],
}
console.log('Modified details:', modifiedDetails)
return modifiedDetails
} catch (error) {
console.error('Error in getScreenDetails override:', error)
// Fallback to mock data
return {
screens: [
{
availHeight: 1080,
availWidth: 1920,
colorDepth: 24,
height: 1080,
width: 1920,
pixelDepth: 24,
left: 0,
top: 0,
isPrimary: true,
isInternal: true,
},
],
currentScreen: {
availHeight: 1080,
availWidth: 1920,
colorDepth: 24,
height: 1080,
width: 1920,
pixelDepth: 24,
left: 0,
top: 0,
isPrimary: true,
isInternal: true,
},
}
}
}
}
}
// Try 2: Intercept when API gets defined
let originalDescriptor = Object.getOwnPropertyDescriptor(window, 'getScreenDetails')
Object.defineProperty(window, 'getScreenDetails', {
configurable: true,
enumerable: true,
set: function (value) {
console.log('getScreenDetails being set, intercepting...')
const wrappedFunction = async function () {
console.log('Wrapped getScreenDetails called')
try {
const originalDetails = await value.call(this)
console.log('Original screen details:', originalDetails)
return {
...originalDetails,
screens: [originalDetails.screens[0]],
currentScreen: originalDetails.screens[0],
}
} catch (error) {
console.error('Error in wrapped getScreenDetails:', error)
return {
screens: [
{
availHeight: 1080,
availWidth: 1920,
colorDepth: 24,
height: 1080,
width: 1920,
pixelDepth: 24,
left: 0,
top: 0,
isPrimary: true,
isInternal: true,
},
],
currentScreen: {
availHeight: 1080,
availWidth: 1920,
colorDepth: 24,
height: 1080,
width: 1920,
pixelDepth: 24,
left: 0,
top: 0,
isPrimary: true,
isInternal: true,
},
}
}
}
// Store the wrapped function
this._getScreenDetails = wrappedFunction
},
get: function () {
return this._getScreenDetails || originalDescriptor?.value
},
})
// Try 3: Try to override immediately
overrideScreenAPI()
// Try 4: Try again when DOM is ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', overrideScreenAPI)
} else {
overrideScreenAPI()
}
// Try 5: Periodic check for the API
let checkCount = 0
const checkInterval = setInterval(() => {
checkCount++
console.log(`Checking for getScreenDetails (attempt ${checkCount})`)
if (window.getScreenDetails && typeof window.getScreenDetails === 'function') {
console.log('Found getScreenDetails via periodic check')
overrideScreenAPI()
clearInterval(checkInterval)
}
if (checkCount > 50) {
// Stop after 5 seconds
clearInterval(checkInterval)
}
}, 100)
})()
This script overrides the getScreenDetails function to return a single screen's details, effectively bypassing multiple screen detection. It includes several strategies to ensure the override works, including immediate override, interception of property setting, and periodic checks.