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.