正确的方法将窗口置于前景

时间:2018-08-23 12:21:28

标签: powershell

下面有我的代码,用于“将”应用程序(在本例中为VMware View)带到前台/激活它。

但是,这仅在窗口最小化时才起作用。如果最大化,或者最大化时已经激活了任何其他窗口,那么它似乎根本不做任何事情。

# Restore VMware View window
$sig = '[DllImport("user32.dll")] public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);'
Add-Type -MemberDefinition $sig -Name NativeMethods -Namespace Win32
Get-Process -Name vmware-view
$hwnd = @(Get-Process vmware-view)[0].MainWindowHandle
[Win32.NativeMethods]::ShowWindowAsync($hwnd, 4)

3 个答案:

答案 0 :(得分:1)

您要将4作为第二个参数传递给ShowWindowAsync,其文档指向ShowWindows函数以定义第二个参数。这将4(SW_SHOWNOACTIVATE)定义为:

  

以最近的大小和位置显示窗口。此值与SW_SHOWNORMAL相似,不同之处在于该窗口未激活。

请注意最后一个子句。

我认为您想使用SetForegroundWindow

答案 1 :(得分:0)

nCmdShow 的定义为4(SW_SHOWNOACTIVATE)是:

  

以最近的大小和位置显示窗口。这个值是   与SW_SHOWNORMAL相似,不同之处在于未激活窗口。

AFAIK和所有其他 nCmdShow 类型都将任何窗口置于顶部。

我改用SetWindowPos

$User32 = Add-Type -Debug:$False -MemberDefinition '
    [DllImport("user32.dll")] public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X,int Y, int cx, int cy, uint uFlags);
' -Name "User32Functions" -namespace User32Functions -PassThru

[Void]$User32::SetWindowPos($hwnd, -1, 0, 0, 0, 0, 0x53)

答案 2 :(得分:0)

这是可行的:

Add-Type @"
using System;
using System.Runtime.InteropServices;
public class SFW {
 [DllImport("user32.dll")]
 [return: MarshalAs(UnmanagedType.Bool)]
 public static extern bool SetForegroundWindow(IntPtr hWnd);
}
"@

$fw =  (get-process vmware-view).MainWindowHandle
[SFW]::SetForegroundWindow($fw)