2016-03-18 30 views
0

開始時に特定のVisual Studioプロジェクトのウィンドウにハンドルを取得する方法を知っている人は誰ですか?PowerShell、子プロセスのウィンドウハンドルを取得する方法、Visual Studioプロジェクトの例

$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 

メモ帳と比較、すべてがそれでokです私はPowerShellのからVisual Studioのプロジェクトを実行した場合

私はすぐに私のために無関係ですVSLauncherプロセスへのハンドルを取得します:

$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             
------- ------ -----  ----- ----- ------  -- -----------             
    91  8  1392  4772 ...28  0.02 21516 notepad              

$p.MainWindowHandle: 1836724 

答えて

1

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" 
+0

あなたの例では、私は何とか '$ h =(Get-Process -Name devenv).MainWindowHandle'と書くだけで、何とかハンドルを受け取っています。この '$ h'は簡単に操作できますが、あなたの' $ windowhandle 'で何もできません。 – Bad

+0

それは私が睡眠の値を調整する必要があると述べた問題です。スプラッシュ画面用のMainWindowHandleを受け取ります。私は今それを除外する答えを更新しました。 –

関連する問題