Я создал функцию Open-InternetExplorer
которая создает COM-объект IE, перемещается по URL-адресу, устанавливает IE в качестве окна переднего плана и, при необходимости, в полноэкранный режим.
Следует отметить, что когда используется ключ -InForeground
вызывается нативный API-интерфейс Win32 SetForegroundWindow . В некоторых ситуациях эта функция не изменит окно переднего плана. Эти ситуации описаны в документации MSDN для этой функции.
function Add-NativeHelperType
{
$nativeHelperTypeDefinition =
@"
using System;
using System.Runtime.InteropServices;
public static class NativeHelper
{
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetForegroundWindow(IntPtr hWnd);
public static bool SetForeground(IntPtr windowHandle)
{
return NativeHelper.SetForegroundWindow(windowHandle);
}
}
"@
if(-not ([System.Management.Automation.PSTypeName] "NativeHelper").Type)
{
Add-Type -TypeDefinition $nativeHelperTypeDefinition
}
}
function Open-InternetExplorer
{
Param
(
[Parameter(Mandatory=$true)]
[string] $Url,
[switch] $InForeground,
[switch] $FullScreen
)
if($InForeground)
{
Add-NativeHelperType
}
$internetExplorer = new-object -com "InternetExplorer.Application"
$internetExplorer.navigate($Url)
$internetExplorer.Visible = $true
$internetExplorer.FullScreen = $FullScreen
if($InForeground)
{
[NativeHelper]::SetForeground($internetExplorer.HWND)
}
return $internetExplorer
}
Хотя предоставленный сценарий должен работать, существуют некоторые потенциальные проблемы, связанные с управлением ресурсами.
Я не уверен, что мне нужно сделать что-то конкретное в отношении возврата COM-объекта. Вполне возможно, что .NET или PowerShell сами справятся с этим, но в противном случае существует вероятность утечки ресурса.
Я также не уверен, что я должен делать (если что-нибудь), чтобы убедиться, что InternetExplorer.HWND
действителен перед передачей в SetForegroundWindow
Пример использования:
. .\Open-InternetExplorer.ps1
Open-InternetExplorer -Url www.example.com -FullScreen -InForeground