windows - Åbn faneblade i IE8 ved hjælp af SendMessage () C #

Indlæg af Hanne Mølgaard Plasc

Problem



I denne nedenstående kode er hWnd 'URL Handle' i Spy ++:


'WorkerW -> ReBarWindow32 -> Address Band Root -> Edit' 


URL'en er, hvad jeg vil åbne.


Jeg bruger den samme metode til at åbne faner i IE7 og sende hWnd passende. Jeg ser, at det fungerer fint for IE7 og ikke for IE8. I IE8 åbnes det kun 4 faner, og derefter stopper IE8 med at modtage SendMessage-anmodningen. Jeg kan dog stadig trykke på CTRL+T ELLER ALT+Enter for at åbne nye faner i IE8 (så IE8 er stadig lydhør).


/**
 * Open URL in IE (open new tab when newTab is true)
 * hWnd is found at runtime 
 **/
private void LaunchURLinIE(IntPtr hWnd, String url, bool newTab = false)
{
    StringBuilder ob = new StringBuilder(url);
    // Type text in the URL window
    SendMessage(hWnd, WM\_SETTEXT, 0, ob);
    if (!newTab)
    {   // Press Enter
        SendMessage(hWnd, WM\_KEYDOWN, VK\_RETURN, 1);
    }
    else
    {   // Press ALT Enter to open new tab
        SendMessage(hWnd, WM\_SYSKEYDOWN, VK\_RETURN, 1 << 29);
    }
}


Mit miljø er: Windows XP Service Pack 3 [[32-bit OS]], IE8 version 8.0.6001.18702


Så er det IE8 eller noget jeg mangler?


UPDATE - 1
Jeg har opdateret kommentarer til koden, så det er klart, hvad kode gør. Ovenstående kode fungerer perfekt fint til IE7 (testet op til 15 faner), men med IE8 åbner den kun op til 4 faner.



Opdatering - 2
Jeg kunne sove dette ved at bruge PostMessage i stedet for SendMessage.


   private void LaunchURLinIE(IntPtr hWnd, String url, bool newTab = false)
    {
        StringBuilder ob = new StringBuilder(url);
        // Type text in the URL window
        SendMessage(hWnd, WM\_SETTEXT, 0, ob);
        if (!newTab)
        {   // Press Enter
            PostMessage(hWnd, WM\_KEYDOWN, VK\_RETURN, 1);
        }
        else
        {   // Press ALT Enter to open new tab
            PostMessage(hWnd, WM\_SYSKEYDOWN, VK\_RETURN, 1 

Bedste reference


Du vil måske prøve at bruge den COM, der er eksponeret af ShDocVw-objektet, som kan findes som en .dll navngivet Interop.ShDocVw.dll, der indeholder en InternetExplorerClass-grænseflade, som giver dig mulighed for at gøre det meste af IE-automationen pålideligt.


Jeg er en bidragyder til SWAT http://sourceforge.net/projects/ulti-swat/, hvis du gerne vil have nogle gode eksempler, er du velkommen til at bruge vores kilde til IE-automatisering i SWAT.Core/InternetExplorer.cs [10]]]


Der er mange problemer med din kode faktisk, vindueshåndtag er hardcoded (hvorfor?) Også du kun sender en nøgle ned, programmet forventer normalt en keydown/keyup combo eller nogle gange en keydown/tastetryk/keyup sekvens for at det kan være gyldig. Din ansøgning gør det til at virke som om du holder nede de nøgler, du sender. Du vil muligvis bruge FindWindow Windows API-opkaldet, som kan hjælpe dig med at finde vindueshåndtaget på runtime for det vindue, du vil sende beskederne til.

Andre referencer 1


Skal du heller ikke sende WM\_KEYUP?


VK\_RETURN? Ikke sikker på hvad det gør. Ville det være bedre at sende CTRL + T tastetryk i stedet?



  • KEYDOWN CTRL

  • KEYDOWN T

  • KEYUP T

  • KEYUP CTRL



Du kan finde nøglekoder med KeyInterop.VirtualKeyFromKey.


Jeg tror også, du skal bruge PostMessage:


[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
private static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

private const UInt32 WM\_KEYDOWN = 0x0100;
private const UInt32 WM\_KEYUP = 0x0101;

public static void IENewTab(IntPtr HWnd)
{
    PostMessage(HWnd, WM\_KEYDOWN, KeyInterop.VirtualKeyFromKey(System.Windows.Input.Key.LeftCtrl), 0);
    PostMessage(HWnd, WM\_KEYDOWN, KeyInterop.VirtualKeyFromKey(System.Windows.Input.Key.T), 0);
    PostMessage(HWnd, WM\_KEYUP, KeyInterop.VirtualKeyFromKey(System.Windows.Input.Key.T), 0);
    PostMessage(HWnd, WM\_KEYUP, KeyInterop.VirtualKeyFromKey(System.Windows.Input.Key.LeftCtrl), 0);
}