我试图将我的power
shell控制台放在前面,即使它被最小化.
我找到了以下代码:
我找到了以下代码:
function Show-Process($Process,[Switch]$Maximize) { $sig = ' [DllImport("user32.dll")] public static extern bool ShowWindowAsync(IntPtr hWnd,int nCmdShow); [DllImport("user32.dll")] public static extern int SetForegroundWindow(IntPtr hwnd); ' if ($Maximize) { $Mode = 3 } else { $Mode = 4 } $type = Add-Type -MemberDefinition $sig -Name WindowAPI -PassThru $hwnd = $process.MainWindowHandle $null = $type::ShowWindowAsync($hwnd,$Mode) $null = $type::SetForegroundWindow($hwnd) } Show-Process -Process (Get-Process -Id $pid)
它工作正常,但当我从Button Click事件调用该函数时,控制台不会显示.
问题是什么?有没有办法在使用WinForms GUI时将powershell控制台置于前面?
以下是示例GUI代码:
function Show-Process($Process,$Mode) $null = $type::SetForegroundWindow($hwnd) } Add-Type -AssemblyName System.Windows.Forms [System.Windows.Forms.Application]::EnableVisualStyles() $Form = New-Object system.Windows.Forms.Form $Form.ClientSize = '446,266' $Form.text = "Form" $Form.TopMost = $false $Button1 = New-Object system.Windows.Forms.Button $Button1.text = "button" $Button1.width = 60 $Button1.height = 30 $Button1.location = New-Object System.Drawing.Point(75,29) $Button1.Font = 'Microsoft Sans Serif,10' $Button1.Add_Click({ Show-Process -Process (Get-Process -Id $pid) }) $Form.controls.AddRange(@($Button1)) [void]$Form.ShowDialog()
感谢@ iRon的回答,我能够弄明白,我想要它.
对于任何好奇的人来说,问题是,只要没有调用ShowDialog,你就只能获得主窗口MainwindowHandle.
所以我将控制台Handle保存在一个变量中,我使用Form_Shown事件来获取Form WindowHandle,因为Form_Load仍然返回控制台句柄.
对于任何好奇的人来说,问题是,只要没有调用ShowDialog,你就只能获得主窗口MainwindowHandle.
所以我将控制台Handle保存在一个变量中,我使用Form_Shown事件来获取Form WindowHandle,因为Form_Load仍然返回控制台句柄.
$sig = ' [DllImport("user32.dll")] public static extern bool ShowWindowAsync(IntPtr hWnd,int nCmdShow); [DllImport("user32.dll")] public static extern int SetForegroundWindow(IntPtr hwnd);' $type = Add-Type -MemberDefinition $sig -Name WindowAPI -PassThru [IntPtr]$handleConsole = (Get-Process -Id $pid).MainWindowHandle [void]$type::ShowWindowAsync($handleConsole,4);[void]$type::SetForegroundWindow($handleConsole) Add-Type -AssemblyName System.Windows.Forms [System.Windows.Forms.Application]::EnableVisualStyles() $Form = New-Object system.Windows.Forms.Form $Form.ClientSize = '446,266' $Form.text = "Form" $Form.TopMost = $false $Form.Add_Shown({ $global:handleForm = (Get-Process -Id $pid).MainWindowHandle }) $Button1 = New-Object system.Windows.Forms.Button $Button1.text = "Clone ad-USer" $Button1.width = 60 $Button1.height = 30 $Button1.location = New-Object System.Drawing.Point(75,10' $Button1.Add_Click({ [void]$type::ShowWindowAsync($handleConsole,4);[void]$type::SetForegroundWindow($handleConsole) Read-Host -Prompt "Please Enter a Value" [void]$type::ShowWindowAsync($global:handleForm,4);[void]$type::SetForegroundWindow($global:handleForm) }) $Form.controls.AddRange(@($Button1)) [void]$Form.ShowDialog()