如果我理解正确的话,这段代码应该捕获活动窗口并使其保持焦点。concent.exe是进程名。如何根据进程名使窗口保持焦点?
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class UserWindows {
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
}
"@
try {
$ActiveHandle = [UserWindows]::GetForegroundWindow()
$Process = Get-Process | ? {$_.MainWindowHandle -eq $activeHandle}
$Process | Select ProcessName, @{Name="concentr.exe";Expression= {($_.MainWindowTitle)}}
} catch {
Write-Error "Failed to get active Window details. More Info: $_"
}
我也试过
param([string] $proc="Citrix Connection Manager", [string]$adm)
cls
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class WinAp {
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
}
"@
$p = Get-Process |where {$_.mainWindowTItle }|where {$_.Name -like "$proc"}
if (($p -eq $null) -and ($adm -ne ""))
{
Start-Process "$proc" -Verb runAs
}
elseif (($p -eq $null) -and ($adm -eq ""))
{
Start-Process "$proc" #-Verb runAs
}
else
{
$h = $p.MainWindowHandle
[void] [WinAp]::SetForegroundWindow($h)
[void] [WinAp]::ShowWindow($h,3);
}
4条答案
按热度按时间bpsygsoo1#
我找到了:
3pvhb19x2#
你有没有想过使用窗口名称?我发现这段代码工作得很好,不会占用很多空间:
此外,如果您需要只按Alt-Tab键返回到最后运行的内容(即:你需要焦点来返回到脚本窗口后,发射的东西关闭)试试这个:
tpxzln5u3#
注意事项:
·这个答案部分使用了与现有答案相同的技术,但也引入了一种新技术,旨在以集中的方式对比这些方法。
·只有下面的最后一个解决方案--需要通过
Add-Member
按需编译C#代码--在窗口恰好被“最小化”时才能正确激活窗口。·所有解决方案都使用PSv 4+语法。
重要:
除非您的代码在 * 当前前台窗口*中运行,否则Windows * 默认情况下会阻止 * 其他进程窗口 * 的编程激活**:而不是 * 激活 * 目标窗口,其 * 任务栏图标 Flink *。
*启用 * 无条件 * 编程激活需要额外的工作,通过每个会话的P/Invoke调用-参见this answer。
基于**
WScript.Shell
COM对象的.AppActivate()
方法**(Inventologist's answer对此进行了提示),可能有一个更简单的解决方案,不需要Add-Type
和WinAPI P/Invoke签名:备注:
如果目标窗口恰好最小化,也可以恢复目标窗口的解决方案需要**
Add-Type
和WinAPI P/Invoke声明**:备注:
smtd7mpg4#
我用这个脚本来做这个。根据你的需要修改...
例如,默认变量
$ProcessNameRegEx
和$WindowTitleRegEx
将移动新的记事本窗口(只需启动其中的几个窗口,而无需指定文件)。您可以将不同的正则表达式传递给脚本。根据您的需要进行编辑。
Show-WindowByName