下面的代码“应该”将应用程序(在本例中为VMware视图)带到前台/激活它。
然而,这似乎只在窗口最小化的情况下起作用。如果它被最大化,或者当它被最大化的时候,任何其他窗口都已经被激活,那么它似乎根本没有做任何事情。
# 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)发布于 2018-08-23 12:31:22
您将4作为第二个参数传递给ShowWindowAsync,它的文档指向ShowWindows函数来定义第二个参数。这将4 (SW_SHOWNOACTIVATE)定义为:
显示最新大小和位置的窗口。此值与SW_SHOWNORMAL相似,只是窗口未被激活。
注意最后一个子句。
我想你想要使用SetForegroundWindow。
发布于 2018-08-23 12:53:16
这就是起作用的地方:
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)发布于 2018-08-23 12:43:03
nCmdShow of 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)https://stackoverflow.com/questions/51985708
复制相似问题