Visual studio PowerShell,如何获取子进程的窗口句柄,Visual Studio项目示例

Visual studio PowerShell,如何获取子进程的窗口句柄,Visual Studio项目示例,visual-studio,powershell,process,Visual Studio,Powershell,Process,有人知道如何在一开始就处理特定VisualStudio项目的窗口吗 如果我从Powershell运行Visual Studio Project,我会立即处理与我无关的VSLauncher过程: $p = Start-Process -FilePath "C:\Projects\ConsoleApplication.sln" -PassThru Write-Output $p Write-Output "`$p.MainWindowHandle: $($p.MainWindowHandle)"

有人知道如何在一开始就处理特定VisualStudio项目的窗口吗

如果我从Powershell运行Visual Studio Project,我会立即处理与我无关的
VSLauncher
过程:

$p = Start-Process -FilePath "C:\Projects\ConsoleApplication.sln" -PassThru
Write-Output $p
Write-Output "`$p.MainWindowHandle: $($p.MainWindowHandle)"
输出:

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName                                                  
-------  ------    -----      ----- -----   ------     -- -----------                                                  
     28       6     3144       3396    48     0.02  15584 VSLauncher 

$p.MainWindowHandle: 0
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName                                                  
-------  ------    -----      ----- -----   ------     -- -----------                                                  
     91       8     1392       4772 ...28     0.02  21516 notepad                                                      

$p.MainWindowHandle: 1836724
与记事本相比,它一切正常:

$p = Start-Process -FilePath "notepad" -PassThru
Write-Output $p
Write-Output "`$p.MainWindowHandle: $($p.MainWindowHandle)"
输出:

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName                                                  
-------  ------    -----      ----- -----   ------     -- -----------                                                  
     28       6     3144       3396    48     0.02  15584 VSLauncher 

$p.MainWindowHandle: 0
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName                                                  
-------  ------    -----      ----- -----   ------     -- -----------                                                  
     91       8     1392       4772 ...28     0.02  21516 notepad                                                      

$p.MainWindowHandle: 1836724

Visual Studio
devenv.exe
作为
VSLauncher.exe
的子进程启动。您可以使用这些知识查找子项并检索它的
MainWindowsHandle

$parent = Start-Process -FilePath "C:\Projects\ConsoleApplication.sln" -PassThru

#Wait for devenv.exe (child process) to launch.
while (($p = Get-WmiObject -Class win32_process -Filter "Name = 'devenv.exe' AND ParentProcessID = '$($parent.Id)'") -eq $null) { Start-Sleep -Milliseconds 100 }

#Wait for devenv.exe to get Title (main window has handle)
while (($windowhandle = Get-Process -Id $p.ProcessId | Where-Object { $_.MainWindowTitle } | Select-Object -ExpandProperty MainWindowHandle) -eq $null) { Start-Sleep -Milliseconds 100 }

#Output MainWindowHandle
Write-Output "MainWindowHandle: $windowhandle"

Visual Studio
devenv.exe
作为
VSLauncher.exe
的子进程启动。您可以使用这些知识查找子项并检索它的
MainWindowsHandle

$parent = Start-Process -FilePath "C:\Projects\ConsoleApplication.sln" -PassThru

#Wait for devenv.exe (child process) to launch.
while (($p = Get-WmiObject -Class win32_process -Filter "Name = 'devenv.exe' AND ParentProcessID = '$($parent.Id)'") -eq $null) { Start-Sleep -Milliseconds 100 }

#Wait for devenv.exe to get Title (main window has handle)
while (($windowhandle = Get-Process -Id $p.ProcessId | Where-Object { $_.MainWindowTitle } | Select-Object -ExpandProperty MainWindowHandle) -eq $null) { Start-Sleep -Milliseconds 100 }

#Output MainWindowHandle
Write-Output "MainWindowHandle: $windowhandle"

在您的示例中,我以某种方式接收到一个句柄,它与通过简单地编写
$h=(Get Process-Name devenv).MainWindowHandle
接收到的句柄不同。这个
$h
我可以很容易地操作,而我不能用你的
$windowhandle
做任何事情。这就是我提到的需要调整睡眠值的问题。您将收到启动屏幕的MainWindowHandle。我已经更新了答案,现在排除了这个问题。在您的示例中,我不知何故收到了一个句柄,它不同于我通过简单地编写
$h=(Get Process-Name devenv).MainWindowHandle
收到的句柄。这个
$h
我可以很容易地操作,而我不能用你的
$windowhandle
做任何事情。这就是我提到的需要调整睡眠值的问题。您将收到启动屏幕的MainWindowHandle。我已经更新了答案,现在排除了这一点。