我的代码中有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
给了我同样的错误。
如何让它们弹出顶部?
答案 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
修改它 - 属性。