gui*_*ooo 3 powershell events winapi window-management
我有一个在我的PoSh会话后台运行的FileSystemWatcher实例,用于监视文本文件的更改.PoSh事件订阅者附加到此事件,并在触发时通过调用Start-Process启动控制台程序.该程序从当前前景窗口(我的PoSh控制台)窃取焦点.从PoSh事件订阅者调用SetForegroundWindow将焦点返回到我的PoSh控制台不起作用.SwitchToThisWindow 大部分时间都可以工作,但根据MSDN文档,它不能被使用.
我是否可以阻止Start-Process在这种情况下窃取焦点,或者在事件触发之前将其从事件订阅者设置回到具有该事件的窗口?
ste*_*tej 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)
Run Code Online (Sandbox Code Playgroud)
但请注意,如果您托管PowerShell或使用例如Console(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()
Run Code Online (Sandbox Code Playgroud)
否则,如果您运行隐藏窗口的进程,它可以解决您的问题.
$ps = new-object system.diagnostics.processstartinfo 'notepad'
$ps.windowStyle = 'hidden'
[system.diagnostics.process]::Start($ps)
Run Code Online (Sandbox Code Playgroud)
从关于Process类的msdn文档中获取和更改的示例
| 归档时间: |
|
| 查看次数: |
23418 次 |
| 最近记录: |