Я пытаюсь найти процесс для Internet Explorer com-объекта, приведенный ниже код работает, когда IE com-объект перемещается по URL-адресу, напримерgoogle.nl, но при переходе к локальному html-файлу это не так.
Некоторая информация о функции:
- создает новый com-объект ieplorer
- изменяет некоторые свойства для com-объекта iexporer.
- использует функцию навигации из com-объекта ieplorer с указанным URL-адресом
- , возвращает объект процесса для этого com-объекта.объект, основанный на HWND.
Проблема существует на шаге 4, это простая логика, где:
Get-Process -Name iexplore | Where-Object {$_.MainWindowHandle -eq $ie.HWND}
Я пробовал несколько вещей, даже построение с задержкой, но как-то этоне работает.Если попробовать логику извне функции, напрямую указав HWND, она работает, например:
PS C:\> Start-IELockedDown localhost
HWND = 659256
HWND Type = int
IE Processes:
@{Name=iexplore; MainWindowHandle=919956}
@{Name=iexplore; MainWindowHandle=397090}
@{Name=iexplore; MainWindowHandle=659256} #matching Entry
@{Name=iexplore; MainWindowHandle=0}
@{Name=iexplore; MainWindowHandle=69090}
@{Name=iexplore; MainWindowHandle=0}
IE with correct HWND
#Nothing?
After this comes the RETURN:
#Also Nothing!
PS C:\> Get-Process -Name iexplore | Where-Object {$_.MainWindowHandle -eq 659256}
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
582 42 9656 30940 0,50 10260 2 iexplore
Примеры отладки:
1 Когда я запускаю команду с внешним и работающим веб-сайтом, подобным этомуStart-IELockedDown google.nl
это на самом деле работает:
HWND = 921524
IE Processes:
@{Name=iexplore; MainWindowHandle=921524} #Matching entry
@{Name=iexplore; MainWindowHandle=724706}
@{Name=iexplore; MainWindowHandle=69090}
@{Name=iexplore; MainWindowHandle=0}
IE with correct HWND
@{Name=iexplore; MainWindowHandle=921524} #Logic works
After this comes the RETURN:
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
480 31 7092 26848 0,22 18912 2 iexplore
2 Когда я использую путь к файлу вместо внешнего веб-сайта, как это Start-IELockedDown (Get-Item .\blank-page.html | Select-Object -ExpandProperty FullName)
логика кажется сломанной:
HWND = 3015698
IE Processes:
@{Name=iexplore; MainWindowHandle=0}
@{Name=iexplore; MainWindowHandle=3015698} #Matching Entry
@{Name=iexplore; MainWindowHandle=1248958}
@{Name=iexplore; MainWindowHandle=69090}
@{Name=iexplore; MainWindowHandle=0}
IE with correct HWND
#Nothing?
After this comes the RETURN:
#Also nothing!
3 Когда я запускаюэто против localhost, который не отвечает, так как у меня нет локального веб-сервера, работающего как этот Start-IELockedDown LocalHost
, это дает мне ту же проблему:
HWND = 986890
IE Processes:
@{Name=iexplore; MainWindowHandle=986890} #Matching Entry
@{Name=iexplore; MainWindowHandle=1051034}
@{Name=iexplore; MainWindowHandle=69090}
@{Name=iexplore; MainWindowHandle=2361678}
@{Name=iexplore; MainWindowHandle=0}
IE with correct HWND
#Nothing?
After this comes the RETURN:
#Also Nothing!
Полный код:
function Start-IELockedDown {
<#
.SYNOPSIS
Open IE without navigation controlls.
.DESCRIPTION
Long description
.EXAMPLE
PS C:\> Invoke-IELockedDown -URL "http://localhost:8080/"
Opens a Internet Explorer browser window without navigational controlls that navigates to the specified URL.
.INPUTS
None
.OUTPUTS
InternetExplorer Process Object.
.NOTES
General notes
#>
[CmdletBinding()]
param (
[string] $URL
)
# Create IE com object
$ie = New-Object -com InternetExplorer.Application
# Turns off the unnecessary menus and tools and sets the window as resizable
$ie.AddressBar = $false
$ie.MenuBar = $false
$ie.ToolBar = $false
$ie.Resizable = $true
$ie.StatusBar = $false
# Sets the size of the window and make it visible
$ie.Top = 20
$ie.Left = 20
$ie.Width = 1280
$ie.Height = 1024
$ie.Visible = $true
## Navigate the browser to the specified URL.
$ie.Navigate($URL)
# For Debugging / the StackOverflow Guru's
Write-host "HWND = $($ie.HWND)"
Write-Host "IE Processes:"
Get-Process -Name iexplore | Select-Object Name, MainWindowHandle | Write-host
Write-Host "IE with correct HWND"
Get-Process -Name iexplore | Select-Object Name, MainWindowHandle | Where-Object {$_.MainWindowHandle -eq $ie.HWND} | Write-Host
Write-Host "After this comes the RETURN:"
# Return the Process Object for the IE Com Object
return Get-Process -Name iexplore | Where-Object {$_.MainWindowHandle -eq $ie.HWND}
}