下面有我的代码,用于“将”应用程序(在本例中为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)
答案 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)