Я хотел бы знать, используя PowerShell, если окно Windows верхнего уровня (переднего плана) или фона. Как я могу это сделать?
Я хотел бы знать, используя PowerShell, если окно Windows верхнего уровня (переднего плана) или фона. Как я могу это сделать?
Ответы:
Чего вы пытаетесь достичь или почему?
Вы не говорите, что вы пытались, или показывать это, и какие ошибки вы получаете. Все, что работает в вашей системе, имеет имя и идентификатор процесса, и вы можете сказать, получить время запуска, и то, что более позднее, потенциально является тем, что активно.
# get all object members of a process
get-process | Select * -First 1 | Get-Member
Name : aesm_service
Id : 19420
PriorityClass : Normal
FileVersion : 2.0.101.44237
HandleCount : 169
WorkingSet : 8597504
PagedMemorySize : 2203648
PrivateMemorySize : 2203648
VirtualMemorySize : 87666688
TotalProcessorTime : 00:00:00.1250000
SI : 0
Handles : 169
VM : 4382633984
WS : 8597504
PM : 2203648
NPM : 2189736
Path : C:\WINDOWS\System32...aesm_service.exe
Company : Intel Corporation
CPU : 0.125
ProductVersion : 2.0.101.44237
Description : Intel® SGX Application Enclave Services Manager
Product : Intel® Software Guard Extensions
__NounName : Process
BasePriority : 8
ExitCode :
HasExited : False
ExitTime :
Handle : 6280
SafeHandle : Microsoft.Win32.SafeHandles.SafeProcessHandle
MachineName : .
MainWindowHandle : 0
MainWindowTitle :
MainModule : System.Diagnostics.ProcessModule (aesm_service.exe)
MaxWorkingSet : 1413120
MinWorkingSet : 204800
Modules : {System.Diagnostics....
NonpagedSystemMemorySize : 2189736
NonpagedSystemMemorySize64 : 2189736
PagedMemorySize64 : 2203648
PagedSystemMemorySize : 102120
PagedSystemMemorySize64 : 102120
PeakPagedMemorySize : 3158016
PeakPagedMemorySize64 : 3158016
PeakWorkingSet : 9588736
PeakWorkingSet64 : 9588736
PeakVirtualMemorySize : 99708928
PeakVirtualMemorySize64 : 4394676224
PriorityBoostEnabled : True
PrivateMemorySize64 : 2203648
PrivilegedProcessorTime : 00:00:00.0937500
ProcessName : aesm_service
ProcessorAffinity : 255
Responding : True
SessionId : 0
StartInfo : System.Diagnostics.ProcessStartInfo
StartTime : 9/7/2018 1:16:52 PM
SynchronizingObject :
Threads : {12776, 19072}
UserProcessorTime : 00:00:00.0312500
VirtualMemorySize64 : 4382633984
EnableRaisingEvents : False
StandardInput :
StandardOutput :
StandardError :
WorkingSet64 : 8597504
Site :
Container :
get-process |
Select StartTime,ProcessName |
Sort-Object StartTime |
Format-Table -AutoSize
StartTime ProcessName
--------- -----------
Idle
9/7/2018 1:14:17 PM Secure System
9/7/2018 1:14:17 PM Registry
….
Теперь, если вы скажете, что вы пытаетесь сделать это на удаленном хосте, это совсем другая проблема, поскольку потенциально не имеет значения, какой процесс был самым последним, пользователь будет использовать то, чем он является.
Вы не говорите, что вы искали и пытались, и если это работает для вас, нет. В различных местах в Интернете есть несколько примеров, в которых говорится о похожих случаях использования.
Смотрите эти обсуждения и ответы, и, как вы заметите, для этого требуется вызов кода C и библиотек Windows.
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class Tricks {
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
}
"@
$a = [tricks]::GetForegroundWindow()
get-process | ? { $_.mainwindowhandle -eq $a }
https://techibee.com/powershell/get-active-window-on-desktop-using-powershell/2178
[CmdletBinding()]
Param(
)
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class UserWindows {
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
}
"@
try {
$ActiveHandle = [Windows]::GetForegroundWindow()
$Process = Get-Process | ? {$_.MainWindowHandle -eq $activeHandle}
$Process | Select ProcessName, @{Name="AppTitle";Expression= {($_.MainWindowTitle)}}
} catch {
Write-Error "Failed to get active Window details. More Info: $_"
}
Это изменит выход при выборе разных окон. Делать Вдовы достаточно малы, чтобы вы могли смотреть вывод, как вы выбираете новое окно.
Если у вас два монитора, установите PS на втором мониторе и выберите окна на другой.
$code = @'
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
'@
Add-Type $code -Name Utils -Namespace Win32
while(1){
$hwnd = [Win32.Utils]::GetForegroundWindow()
Get-Process |
Where-Object { $_.mainWindowHandle -eq $hwnd } |
Select-Object processName, MainWindowTItle, MainWindowHandle
sleep -Milliseconds 200
}
Или купите этот модуль ...
https://www.vexasoft.com/pages/get-window
Get-Window
Synopsis
Gets the application windows that are open on the local desktop.
Syntax
• Get-Window [-Process] [-ShowBackgroundWindows]
• Get-Window [-Title] [-ShowBackgroundWindows]
• Get-Window [-ProcessID] [-ShowBackgroundWindows]
Description
The Get-Window cmdlet gets the application windows that are open on the local desktop.