Я делаю этот виджет в электронном виде, который появляется на экране, когда вы нажимаете 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')
})
})
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это работа 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
Как сейчас написано, ваш ответ неясен. Пожалуйста, отредактируйте , чтобы добавить дополнительную информацию, которая поможет другим понять, как это относится к заданному вопросу. Более подробную информацию о том, как писать хорошие ответы, вы можете найти в справочном центре.
Но разве это не просто проверка, работает ли мое электронное окно в полноэкранном режиме? Я этого не хочу, думаю, вы неправильно поняли мой вопрос.
Вы также можете попробовать этот код
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);
});
Какой это язык? Исходный вопрос для электрона/узла
Предоставленный вами код PowerShell, в котором изначально использовались библиотеки PowerShell и C#, был изменен и теперь включает Node.js.
Как сейчас написано, ваш ответ неясен. Пожалуйста, отредактируйте , чтобы добавить дополнительную информацию, которая поможет другим понять, как это относится к заданному вопросу. Более подробную информацию о том, как писать хорошие ответы, вы можете найти в справочном центре.
Сценарий powershell, которым вы поделились, запрашивает имя процесса, мне это не нужно. Я просто хочу, чтобы сценарий прошел через все приложения, которые в данный момент открыты у пользователя, и если одно из этих приложений запущено в полноэкранном режиме, что означает, что панель задач не видна, тогда я хочу, чтобы мой виджет не отображался.
Решается запуском дискретного сценария C#, который возвращает значение True или False. в зависимости от того, работает ли сфокусированное окно в полноэкранном режиме.
Функция в NodeJS запускает этот сценарий и прослушивает вывод данных из файла (checkFullscreen.exe).
Существует полноэкранный псевдоселектор, так что, возможно, вы сможете
:not()его посмотреть :fullscreen