2016-06-05 4 views
0

У меня есть 3 вида окон в моем коде, мне нужно заставить их отображаться сверху, как я могу это сделать?всплывающее окно Powershell ISE сверху

Вот код для всплывающего окна 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 Но я получаю ошибку говоря:

Свойство «Topmost» не может быть найден на этом объекте; убедитесь, что он существует и настраивается.

Всплывающее окно 2:

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

Для этого один $messagebox.Topmost = $true дал мне ту же ошибку.

Как я могу заставить их всплывать сверху?

ответ

0

Ни один из этих классов не поддерживает TopMost -property, но оба показывают диалог/всплывающее окно как самое верхнее окно приложения (PowerShell ISE). MessageBox также украл фокус из другого активного приложения.

[System.Windows.Forms.MessageBox]::Show() не возвращает объект-сообщение, он возвращает результат как DialogResult -объект, поэтому вы не можете его изменить, используя свой $messagebox -property.

+0

Я бы не стал просить помощи, если бы эти всплывающие окна отображались сверху, вы говорите, что это так, но они не работают, когда я запускаю их в своем коде. –

+0

Я понимаю, но я не могу воспроизвести вашу проблему, используя ваш пример кода ... Они оба фокусируются. Пробовали ли вы другой компьютер? –

+0

Нет, поскольку мне нужно всего лишь запустить его на моем VPS, единственное окно, охватывающее всплывающее окно, - это сама powershell, есть ли команда, которая бы минимизировала окно powershell перед появлением всплывающего окна? –

1

Когда я создаю новое окно Internet Explorer с помощью $ie = New-Object -ComObject InternetExplorer.Application, я могу подключиться к 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) 
Смежные вопросы