3

PoSh セッションのバックグラウンドでFileSystemWatcherインスタンスを実行して、テキスト ファイルの変更を監視しています。PoSh イベント サブスクライバーはこのイベントにアタッチされ、起動されるとStart-Processを呼び出してコンソール プログラムを起動します。このプログラムは、現在のフォアグラウンド ウィンドウ (私の PoSh コンソール) からフォーカスを奪います。PoSh イベント サブスクライバーからSetForegroundWindowを呼び出して、フォーカスを PoSh コンソールに戻すことができません。ほとんどの場合、SwitchToThisWindowは機能しますが、MSDN のドキュメントによると、使用すべきではありません。

この状況でStart-Processがフォーカスを盗むのを防止したり、イベント サブスクライバーからこのイベントが発生する前にフォーカスを持っていたウィンドウに戻すことはできますか?

4

3 に答える 3

13

私にとって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 のドキュメントから抜粋および変更された例

于 2010-04-01T13:05:18.797 に答える
1

フォーカスを失う前にフォーカスを設定したため、機能しなかったようです。

仕事を通してフォーカスを設定してみましたか?コンソールの使用中はバックグラウンドで実行されます。

このようなものが機能する可能性があります、それはイベント後10秒間あなたの焦点を保ちます

Start-Job -ScriptBlock {
    1..100 | %{
        sleep -Milliseconds 100
        #Set focus back
    }
}

GetForegroundWindowでミックスする場合は、フォーカスが失われるまで待ってから、元に戻すことができます

http://www.leeholmes.com/blog/MorePInvokeInPowerShell.aspx

于 2010-08-05T19:27:39.303 に答える