Visual studio PowerShell,如何获取子进程的窗口句柄,Visual Studio项目示例
有人知道如何在一开始就处理特定VisualStudio项目的窗口吗 如果我从Powershell运行Visual Studio Project,我会立即处理与我无关的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)"
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。我已经更新了答案,现在排除了这一点。