顶部的Powershell ISE弹出窗口

时间:2016-06-05 19:36:39

标签: powershell

我的代码中有3种窗口我需要强制它们显示在顶部,我该怎么做?

以下是弹出窗口1的代码:

Add-Type -AssemblyName System.Windows.Forms
$FolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog -Property @{SelectedPath = 'c:\Users\Administrator\Documents\’}

[void]$FolderBrowser.ShowDialog()
$outputfolderpath = $FolderBrowser.SelectedPath

$outputfolder = "$outputfolderpath$slash"
[void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')

我试过$FolderBrowser.Topmost = $true但我得错误说:

物业'最顶层'在这个对象上找不到;确保它存在并且可以设置。

弹出窗口2:

$messagebox = [System.Windows.Forms.MessageBox]::Show("Some Messge" , "Status" , 4)

对于这一个$messagebox.Topmost = $true给了我同样的错误。

如何让它们弹出顶部?

2 个答案:

答案 0 :(得分:1)

当我使用$ie = New-Object -ComObject InternetExplorer.Application创建新的Internet Explorer窗口时,我可以使用它的句柄轻触User32.dll并将该窗口设置为TopMost。

如果您能够获取表单或窗口句柄,则此代码可能很有用。

$signature = @"

[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);  

public static IntPtr FindWindow(string windowName){
    return FindWindow(null,windowName);
}

[DllImport("user32.dll")]
public static extern bool SetWindowPos(IntPtr hWnd,
IntPtr hWndInsertAfter, int X,int Y, int cx, int cy, uint uFlags);

[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);

const UInt32 SWP_NOSIZE = 0x0001;
const UInt32 SWP_NOMOVE = 0x0002;

const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;

public static void MakeTopMost (IntPtr fHandle)
{
    SetWindowPos(fHandle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);
}

public static void MakeNormal (IntPtr fHandle)
{
    SetWindowPos(fHandle, HWND_NOTOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);
}
"@

然后我使用ComObject的句柄使其成为TopMost然后是Normal。

$hWnd = $ie.HWND
$app = Add-Type -MemberDefinition $signature -Name Win32Window -Namespace ScriptFanatic.WinAPI -ReferencedAssemblies System.Windows.Forms -Using System.Windows.Forms -PassThru
$null = $app::MakeTopMost($hWnd)
$null = $app::MakeNormal($hWnd)

答案 1 :(得分:0)

这些类都不支持TopMost - 属性,但都将对话框/弹出窗口显示为应用程序的最顶层窗口(PowerShell ISE)。 MessageBox也会从另一个活跃的应用程序中窃取焦点。

[System.Windows.Forms.MessageBox]::Show()没有返回messagebox-object,它会将结果作为DialogResult - 对象返回,因此您无法使用$messagebox修改它 - 属性。