私にとってSetForegroundWindow
はうまくいきます。このコードを確認してください:
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class Tricks {
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
}
"@
sleep -sec 2
$h = (Get-Process firefox).MainWindowHandle
[void] [Tricks]::SetForegroundWindow($h)
sleep -sec 2
$h = (Get-Process -id $pid).MainWindowHandle
[void] [Tricks]::SetForegroundWindow($h)
ただし、PowerShell をホストするか、たとえばコンソール ( http://sourceforge.net/projects/console/ ) を使用する場合、MainWindowHandle はホスト プログラムのハンドルであることに注意してください。したがって、代わりに(Get-Process -id $pid).MainWindowHandle
が必要になります[tricks]::SetForegroundWindow((Get-Process console).MainWindowHandle)
。
タイマー イベントの例:
$timer = New-Object Timers.Timer
$timer.Interval = 5000
$h = (Get-Process -id $pid).MainWindowHandle
$action = {
notepad;
sleep -sec 1; # wait until the program starts (very simple approach)
[Tricks]::SetForegroundWindow($h) }
Register-ObjectEvent $timer Elapsed -Action $action
$timer.Start()
それ以外の場合、ウィンドウが非表示になっているプロセスを実行すると、問題が解決する可能性があります。
$ps = new-object system.diagnostics.processstartinfo 'notepad'
$ps.windowStyle = 'hidden'
[system.diagnostics.process]::Start($ps)
Processクラスに関する msdn のドキュメントから抜粋および変更された例