gpt4 book ai didi

powershell - 如何执行Powershell脚本而不会失去重点?

转载 作者:行者123 更新时间:2023-12-02 22:12:15 25 4
gpt4 key购买 nike

我制作了一个Powershell脚本,该脚本使用GetForegroundWindow()来确定哪个窗口是当前聚焦的窗口。不幸的是,当执行Powershell脚本(通过Windows Task Scheduler或热键)时,该脚本会窃取当前前景应用程序的焦点;不正确地将Powershell窗口本身用作前景应用程序,而不是预期的前景应用程序。

我什至尝试使用PS2EXE“-noconsole”设置创建EXE;但是,该脚本仍然无法正常工作。

有人可以建议一种在不更改当前前景窗口焦点的情况下执行此脚本的方法吗?

我的脚本代码在测试过程中起作用(仅当我添加“Start-Sleep -s 5”时才有效;并且,使用alt-tab手动窃取焦点以使脚本识别正确的前景窗口。

Add-Type @"
using System;
using System.Runtime.InteropServices;
public class Tricks {
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
}
"@


function Set-WindowStyle {
param(
[Parameter()]
[ValidateSet('FORCEMINIMIZE', 'HIDE', 'MAXIMIZE', 'MINIMIZE', 'RESTORE',
'SHOW', 'SHOWDEFAULT', 'SHOWMAXIMIZED', 'SHOWMINIMIZED',
'SHOWMINNOACTIVE', 'SHOWNA', 'SHOWNOACTIVATE', 'SHOWNORMAL')]
$Style = 'SHOW',
[Parameter()]
$MainWindowHandle = (Get-Process -Id $pid).MainWindowHandle
)
$WindowStates = @{
FORCEMINIMIZE = 11; HIDE = 0
MAXIMIZE = 3; MINIMIZE = 6
RESTORE = 9; SHOW = 5
SHOWDEFAULT = 10; SHOWMAXIMIZED = 3
SHOWMINIMIZED = 2; SHOWMINNOACTIVE = 7
SHOWNA = 8; SHOWNOACTIVATE = 4
SHOWNORMAL = 1
}
Write-Verbose ("Set Window Style {1} on handle {0}" -f $MainWindowHandle, $($WindowStates[$style]))

$Win32ShowWindowAsync = Add-Type -memberDefinition @"
[DllImport("user32.dll")]
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
"@ -name "Win32ShowWindowAsync" -namespace Win32Functions -passThru

$Win32ShowWindowAsync::ShowWindowAsync($MainWindowHandle, $WindowStates[$Style]) | Out-Null
}


$a = [tricks]::GetForegroundWindow()

$title = get-process | ? { $_.mainwindowhandle -eq $a }
$title2 = $title | select -ExpandProperty ProcessName

if ($title2 -eq 'Kodi'){

Set-WindowStyle MINIMIZE $a;
if (Get-Process -Name Yatse2) {(Get-Process -Name Yatse2).MainWindowHandle | foreach { Set-WindowStyle MINIMIZE $_ }}

} ELSE {

$title.CloseMainWindow()
}

最佳答案

我知道这个问题很老,但是我花了很多时间试图弄清楚如何从当前窗口中脱颖而出,并找到了一些信息,因此希望这对以后的读者有所帮助。

最简单的解决方案是从Powershell脚本中逐字模拟Alt+Tab按键,而不必自己完成。以下代码来自this StackOverflow answer:

[void][System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
[System.Windows.Forms.SendKeys]::SendWait("%{TAB}")
# Retrieve the window handles...

...其中 %表示 Alt修饰符,而 {TAB}解释为Tab键。

关于powershell - 如何执行Powershell脚本而不会失去重点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29496172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com