首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >窗口到前台的正确方式

窗口到前台的正确方式
EN

Stack Overflow用户
提问于 2018-08-23 12:21:27
回答 3查看 4.7K关注 0票数 1

下面的代码“应该”将应用程序(在本例中为VMware视图)带到前台/激活它。

然而,这似乎只在窗口最小化的情况下起作用。如果它被最大化,或者当它被最大化的时候,任何其他窗口都已经被激活,那么它似乎根本没有做任何事情。

代码语言:javascript
复制
# 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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-23 12:31:22

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

显示最新大小和位置的窗口。此值与SW_SHOWNORMAL相似,只是窗口未被激活。

注意最后一个子句。

我想你想要使用SetForegroundWindow

票数 2
EN

Stack Overflow用户

发布于 2018-08-23 12:53:16

这就是起作用的地方:

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2018-08-23 12:43:03

nCmdShow of 4 (SW_SHOWNOACTIVATE)的定义是:

显示最新大小和位置的窗口。此值与SW_SHOWNORMAL相似,只是窗口未被激活。

而且AFAIK所有其他nCmdShow类型都不会在顶部放置任何窗口。

我会使用SetWindowPos来代替:

代码语言:javascript
复制
$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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51985708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档