Powershell New-Object -comobject InternetExplorer.Application带来了前沿

时间:2014-12-24 00:26:08

标签: windows internet-explorer powershell

我搜索过,但没有找到任何专门解决这个问题的内容。

考虑代码,可以在所有其他打开的窗口前创建新的IE窗口吗? VBScript提供了Run Method (Windows Script Host) intWindowStyle 可选的。整数值,表示程序窗口的外观。请注意,并非所有程序都使用此信息。

Powershell的新com对象有类似之处吗?

Param(
[Parameter(Mandatory=$false)]
[string]$svr,
[Parameter(Mandatory=$false)]
[string]$last,
[Parameter(Mandatory=$false)]
[string]$desc,
[Parameter(Mandatory=$false)]
[string]$date)
$ie = new-object -comobject InternetExplorer.Application
$ie.navigate("http://www.stackoverflow.com")
# Wait for the page to finish loading
 do {sleep 1} until (-not ($ie.Busy))
$doc = $ie.document
$link = $doc.getElementById("Sym_Msg").Value = "$svr"
$link = $doc.getElementById("Lname").Value = "$last"
$link = $doc.getElementById("Desc").Value = "$desc"
$link = $doc.getElementById("Date_Ent").Value = "$date"
$button = $doc.getElementById("submit1")
$ie.Visible = $true
$button.click();
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ie) | Out-Null

4 个答案:

答案 0 :(得分:2)

不幸的是,我不认为这是“新对象”的一部分。有几个PowerShell扩展将其实现为cmdlet(例如http://pscx.codeplex.com/“Set-ForegroundWindow”)。

实现此方法的方法是调用“user32.dll”。

在您的代码中,这应该有效:

#Load DLL
$pinvoke = '[DllImport("user32.dll")] public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow)'   
Add-Type -MemberDefinition $pinvoke -name NativeMethods -namespace Win32

#Get WindowHandle of the COM Object
$hwnd = $ie.HWND

# Minimize window
[Win32.NativeMethods]::ShowWindowAsync($hwnd, 2)

# Restore window
[Win32.NativeMethods]::ShowWindowAsync($hwnd, 4)

- 编辑添加'在nCmdShow之后'

答案 1 :(得分:1)

这对我非常有帮助。我需要使用Windows窗体,而不是IE,所以我需要做一些调整。我从互联网上的其他人那里借用了表单创建代码。

当SCCM客户端执行基于脚本的安装程序时,这非常有用。

特别是我必须在最后添加以下内容,并调整其他一些内容:

$appContext = New-Object System.Windows.Forms.ApplicationContext 
[void][System.Windows.Forms.Application]::Run($appContext)

这是我使用的代码:

Add-Type -AssemblyName PresentationFramework, System.Drawing, System.Windows.Forms, WindowsFormsIntegration

    $objForm = New-Object System.Windows.Forms.Form 
    $objForm.Text = "Test"
    $objForm.Size = New-Object System.Drawing.Size(400,200) 
    $objForm.StartPosition = "CenterScreen"
    $objform.icon = "$StrInstDir\source\favicon.ico"

    $objForm.KeyPreview = $True
    $objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
        {$output = "OK";$objForm.Close()}})
    $objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
        {$output = "Cancel";$objForm.Close()}})

    $OKButton = New-Object System.Windows.Forms.Button
    $OKButton.Location = New-Object System.Drawing.Size(105,120)
    $OKButton.Size = New-Object System.Drawing.Size(75,23)
    $OKButton.Text = "OK"
    $OKButton.Add_Click({$global:output="OK";$objForm.Close()})
    $objForm.Controls.Add($OKButton)

    $CancelButton = New-Object System.Windows.Forms.Button
    $CancelButton.Location = New-Object System.Drawing.Size(220,120)
    $CancelButton.Size = New-Object System.Drawing.Size(75,23)
    $CancelButton.Text = "Cancel"
    $CancelButton.Add_Click({$global:output = "Cancel";$objForm.Close()})
    $objForm.Controls.Add($CancelButton)

    $objform.Add_Closing({[System.Windows.Forms.Application]::Exit()})

    $objLabel = New-Object System.Windows.Forms.Label
    $objLabel.Location = New-Object System.Drawing.Size(60,20) 
    $objLabel.Size = New-Object System.Drawing.Size(280,200) 
    $objLabel.Text = "Test Text"
    $objForm.Controls.Add($objLabel) 


    [void] $objForm.Show()
    $objForm.Add_Shown({$objForm.Activate()})



    $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);
    }
"@
    $hWnd = $objform.handle
    $app = Add-Type -MemberDefinition $signature -Name Win32Window -Namespace ScriptFanatic.WinAPI -ReferencedAssemblies System.Windows.Forms -Using System.Windows.Forms -PassThru
    $null = $app::MakeTopMost($hWnd)
    $objform.Visible = $true

    $appContext = New-Object System.Windows.Forms.ApplicationContext 
    [void][System.Windows.Forms.Application]::Run($appContext)

答案 2 :(得分:0)

为了将来参考,使窗口最顶层的唯一方法是将一些P / Invoke挖掘到Win32 API中。有趣的东西,特别是来自PowerShell!

Add-Type -Namespace PInvoke -Name SWP '[DllImport("user32.dll", SetLastError=true)] public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);'
[PInvoke.SWP]::SetWindowPos($hWnd, -1, 0, 0, 0, 0, 3)

此代码是从this answerLee Holmes' old blog post on P/Invoke in PoShpinvoke.net / MSDN docs拼凑而成的。

答案 3 :(得分:0)

最后,在@Nathan Tuggy的指针下,我发现this page最终效果很好。创建新的IE窗口,然后将其带到所有打开的窗口的前面。

PowerShell中的代码摘要,用于创建新的IE ComObject并将其置于最前面。

$ie = New-Object -ComObject InternetExplorer.Application
$ie.navigate("http://www.stackoverflow.com")
do {sleep 1} until (-not ($ie.Busy))
$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);
}
"@
$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)
$ie.Visible = $true
$button.click();
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ie) | Out-Null