Проверьте, работает ли какое-либо системное приложение в полноэкранном режиме nodeJS

Я делаю этот виджет в электронном виде, который появляется на экране, когда вы нажимаете Ctrl+Пробел. Я хочу, чтобы виджет отображался только тогда, когда ни одно приложение не работает в полноэкранном режиме.

Я пробовал использовать PowerShell, но, похоже, это не работает

const { exec } = require('child_process')
function isFullscreenAppRunning() {
    return new Promise((resolve, reject) => {
        const script = `
        function Is-AppFullScreen {
                param(
                [Parameter(Mandatory = $true)]
                [string] $ProcessName
                )
            
                # Get main screen resolution
                $screenWidth = (Get-Screen).WorkingArea.Width
                $screenHeight = (Get-Screen).WorkingArea.Height
            
                # Get window of the process
                $window = Get-Process -Name $ProcessName | Where-Object {$_.MainWindowTitle -ne $null} | Select-Object -ExpandProperty MainWindowHandle
            
                if ($window) {
                # Get window dimensions (accounting for borders)
                $windowRect = [System.Drawing.Rectangle]::FromLTRB((Get-Window -Handle $window).Left, (Get-Window -Handle $window).Top, (Get-Window -Handle $window).Right, (Get-Window -Handle $window).Bottom)
                $windowWidth = $windowRect.Width - (Get-Window -Handle $window).BorderWidth
                $windowHeight = $windowRect.Height - (Get-Window -Handle $window).BorderHeight
            
                # Check if window dimensions match screen resolution (considering potential rounding errors)
                return ($windowWidth -eq $screenWidth -and $windowHeight -eq $screenHeight)
                } else {
                # Process not found or no main window
                return $false
                }
            }
            
            # Check all processes with a main window title
            $isAnyAppFullScreen = $false
            Get-Process | Where-Object {$_.MainWindowTitle -ne $null} | ForEach-Object {
                $processName = $_.Name
                if (Is-AppFullScreen -ProcessName $processName) {
                $isAnyAppFullScreen = $true
                # Exit loop once a fullscreen app is found (optional for performance)
                break
                }
            }
            
            # Return true if any app is fullscreen, false otherwise
            return $isAnyAppFullScreen
            `
        
        exec(`powershell -command "${script}"`, (err, stdout, stderr) => {
            if (err) {
            reject(err)
            return
            }
            resolve(stdout.trim() === 'True')
        })
    })
}

Существует полноэкранный псевдоселектор, так что, возможно, вы сможете :not() его посмотреть :fullscreen

zero298 23.05.2024 21:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
56
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это работа JS, а не node.js...

// Detect when a frame/window is in/out of full screen

W.contentWindow.visualViewport.onresize=function(e){

 if ((W.offsetWidth*W.offsetHeight)==(screen.availWidth*screen.availHeight)){

  // gone full screen    

 } else {

  // exited full screen

 }

};

NB: «W» — это фрейм/окно, с которым вы работаете. Чтобы использовать этот код в своем документе, замените «W.contentWindow» просто «window».

Дополнительная информация о VisualViewport...

https://developer.mozilla.org/en-US/docs/Web/API/VisualViewport

Но разве это не просто проверка, работает ли мое электронное окно в полноэкранном режиме? Я этого не хочу, думаю, вы неправильно поняли мой вопрос.

ivox 24.05.2024 18:44

Вы также можете попробовать этот код

Add-Type @"
    using System;
    using System.Runtime.InteropServices;

    public class Win32 {
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

        [StructLayout(LayoutKind.Sequential)]
        public struct RECT {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }
    }
"@

function IsAppFullScreen {
    param (
        [Parameter(Mandatory = $true)]
        [string] $ProcessName
    )

    $processes = Get-Process | Where-Object { $_.MainWindowTitle -ne "" }

    foreach ($process in $processes) {
        $handle = $process.MainWindowHandle
        $rect = New-Object Win32.RECT

        if (-not [Win32]::GetWindowRect($handle, [ref]$rect)) {
            continue
        }

        $width = $rect.Right - $rect.Left
        $height = $rect.Bottom - $rect.Top

        $screenWidth = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds.Width
        $screenHeight = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds.Height

        if ($width -eq $screenWidth -and $height -eq $screenHeight) {
            return $true
        }
    }

    return $false
}

# Check if any app is fullscreen
$isAnyAppFullScreen = $false
$isAnyAppFullScreen = IsAppFullScreen

# Return true if any app is fullscreen, false otherwise
$isAnyAppFullScreen

и NodeJ

const { exec } = require('child_process');

function isFullscreenAppRunning() {
    return new Promise((resolve, reject) => {
        const script = `
            function Is-AppFullScreen {
                param(
                    [Parameter(Mandatory = $true)]
                    [string] $ProcessName
                )
                
                # Get main screen resolution
                $screenWidth = (Get-WmiObject Win32_DesktopMonitor).ScreenWidth
                $screenHeight = (Get-WmiObject Win32_DesktopMonitor).ScreenHeight
                
                # Get window of the process
                $window = Get-Process -Name $ProcessName | Where-Object {$_.MainWindowTitle -ne $null} | Select-Object -ExpandProperty MainWindowHandle
                
                if ($window) {
                    # Get window dimensions (accounting for borders)
                    $windowRect = [System.Drawing.Rectangle]::FromLTRB((Get-Window -Handle $window).Left, (Get-Window -Handle $window).Top, (Get-Window -Handle $window).Right, (Get-Window -Handle $window).Bottom)
                    $windowWidth = $windowRect.Width - (Get-Window -Handle $window).BorderWidth
                    $windowHeight = $windowRect.Height - (Get-Window -Handle $window).BorderHeight
                    
                    # Check if window dimensions match screen resolution (considering potential rounding errors)
                    return ($windowWidth -eq $screenWidth -and $windowHeight -eq $screenHeight)
                } else {
                    # Process not found or no main window
                    return $false
                }
            }
            
            # Check all processes with a main window title
            $isAnyAppFullScreen = $false
            Get-Process | Where-Object {$_.MainWindowTitle -ne $null} | ForEach-Object {
                $processName = $_.Name
                if (Is-AppFullScreen -ProcessName $processName) {
                    $isAnyAppFullScreen = $true
                    # Exit loop once a fullscreen app is found (optional for performance)
                    break
                }
            }
            
            # Return true if any app is fullscreen, false otherwise
            return $isAnyAppFullScreen
        `;
        
        exec(`powershell -command "${script}"`, (err, stdout, stderr) => {
            if (err) {
                reject(err);
                return;
            }
            resolve(stdout.trim() === 'True');
        });
    });
}

// Usage
isFullscreenAppRunning().then(result => {
    console.info('Is any app running in fullscreen?', result);
}).catch(error => {
    console.error('Error:', error);
});

Какой это язык? Исходный вопрос для электрона/узла

Phix 24.05.2024 00:01

Предоставленный вами код PowerShell, в котором изначально использовались библиотеки PowerShell и C#, был изменен и теперь включает Node.js.

marcus 24.05.2024 00:33

Сценарий powershell, которым вы поделились, запрашивает имя процесса, мне это не нужно. Я просто хочу, чтобы сценарий прошел через все приложения, которые в данный момент открыты у пользователя, и если одно из этих приложений запущено в полноэкранном режиме, что означает, что панель задач не видна, тогда я хочу, чтобы мой виджет не отображался.

ivox 24.05.2024 18:42
Ответ принят как подходящий

Решается запуском дискретного сценария C#, который возвращает значение True или False. в зависимости от того, работает ли сфокусированное окно в полноэкранном режиме.

Функция в NodeJS запускает этот сценарий и прослушивает вывод данных из файла (checkFullscreen.exe).

Другие вопросы по теме