2013-08-27 24 views
5

Używam Winapi do obsługi okna dialogowego strony internetowej i nie mam dostępu do Visual Studio lub innych narzędzi, z wyjątkiem edytora excel vba. Ponadto, nie mam dużego doświadczenia z winapi. Chcę kliknąć na przycisk tego okna strony i wpisać tekst.
Używając winapi mogłem znaleźć jego obsługę i wypróbowałem wyliczanie okien potomnych, ale odebrane informacje nie są poprawne.winapi znajdź tytuł okna użytkownika (właściwości) okna dialogowego strony internetowej

' search for child window accept button 
hWndAccept = FindWindowEx(hWndColo, 0, vbNullString, vbNullString) 
Debug.Print hWndAccept 

i

Public Function EnumChildProc(ByVal hWnd As Long, ByVal lParam As Long) As Long 
    Dim slength As Long 
    Dim wintext As String       ' window title text length and buffer 
    Dim retval As Long       ' return value 
    Dim textlen As Long 

Static winnum As Integer      ' counter keeps track of how many windows have been enumerated 
winnum = winnum + 1 

textlen = GetWindowTextLength(hWnd) + 1 
' Make sufficient room in the buffer. 
wintext = Space(textlen) 
' Retrieve the text of window Form1. 
slength = GetWindowText(hWnd, wintext, textlen) 
' Remove the empty space from the string, if any. 
wintext = Left(wintext, slength) 
' Display the result. 
Debug.Print winnum & wintext 

EnumChildProc = 1        ' nonzero return value means continue enumeration 
End Function 

Pierwsza funkcja nie powróci przycisk okna potomne nawet jeśli używam „przycisk” type (typ przycisk html to może być trochę differnt), więc pomyślałem, wyliczając dziecko okno. Robiąc to dostaję 9 okien potomnych, z których otrzymuję tytuł tylko dwóch. tekst getwindows nie wyświetla niczego.

Jak mogę uzyskać właściwości i inne powiązane informacje na temat tych okien podrzędnych? Próbowałem znaleźć w dokumentacji do Winapi, ale bez powodzenia.

+1

Przyciski na stronie internetowej nie są rodzimymi kontrolkami systemu Windows. Do tego scenariusza należy użyć innych technologii, takich jak [Automatyzacja interfejsu użytkownika] (http://msdn.microsoft.com/en-us/library/windows/desktop/ee684009.aspx). Dla stron internetowych w Internet Explorerze patrz [UI Automation for W3C Accessible Rich Internet Applications Specification] (http://msdn.microsoft.com/en-us/library/windows/desktop/ee684013.aspx). – IInspectable

+0

Wygląda na to, że nie możemy go użyć, ponieważ używamy maszyn xp i nie możemy instalować .NET ani żadnego innego SDK. Moją kolejną myślą jest zmiana/manipulacja metodami JS i GET/POST. – msinfo

+0

Manipulowanie JScriptem będzie kłopotliwe do przekradnięcia się przez oprogramowanie antywirusowe. – IInspectable

Odpowiedz

1

Okno przeglądarki IE jest "ciężkim" komponentem, ponieważ jest prawdziwym oknem z hWnd. Treść w oknie przeglądarki (strona internetowa) jest renderowana/malowana i nie istnieje jako rzeczywiste składniki systemu Windows (np. Nie jest to prawdziwy tekst, przycisk, lista itp.), Więc interfejs API systemu Windows nie będzie działać.

Masz kilka opcji.

  1. Utwórz wystąpienie formantu WebBrowser w formie w projekcie (można zobaczyć więcej na temat kontroli w ogólnym here)

  2. połączyć się z istniejącym przy użyciu Windows API podoba Ci can see here ale to szerzy z kwestii, w tym:

    • polityka bezpieczeństwa i grupa IE może wyłączyć możliwość składniki się na białej liście do podłączenia do istniejącego komponentu
    • Jeśli jest to dozwolone, nadal możesz napotkać problemy z blokowaniem AV.
    • Zmiany w układzie okna IE stają się trudne, ponieważ v7 vs v8 mają zmianę, gdzie "ramka" IE (nie element iframe) leży w relacji do "IE". dokument "wewnątrz karty.

Jeśli inicjowanie nawigacji (np otwarte IE, aby przejść do określonej strony internetowej), aby wypełnić formularz oparty na dokumencie następnie Sugerowałbym użyciu formantu WebBrowser albo utworzyć komponent ShDocVw w kod, dzięki czemu możesz bezpośrednio wchodzić w interakcję z DOM. W ten sposób nie musisz "znajdować" elementów HTML w ogóle za pomocą API Windows i pracować bezpośrednio z dokumentem HTML i jego właściwościami.

+0

Tak, zrobiłem to, ale okno, które chcę kontrolować, to okno dialogowe strony internetowej, które pojawia się po kliknięciu łącza na stronie internetowej. Korzystając z componenet Shdocvw, mogę przechodzić przez otwarte okna IE, ale HWND okna dialogowego strony WWW nie pokazuje się (ale przychodzą rodzice). I mam wątpliwości, używając WinApi mogę znaleźć HWND w oknie dialogowym strony WWW, aw Shdocvw istnieje własność HWND. Więc mogę ustawić obiekt IE na okno dialogowe strony sieci Web, za pomocą którego mogę nim sterować. Lub okno dialogowe strony internetowej zachowuje się inaczej niż normalna strona internetowa. Dowolna możliwość/przykład użycia biblioteki SHDOCVW lub MSHTML w oknie dialogowym strony WWW. – msinfo

+1

@msinfo Nie ma urządzenia HWND, które można znaleźć za pomocą szpiega ++. Jednak jeśli próbujesz przechwycić zdarzenie, które monituje okno dialogowe, możesz to zrobić bezpośrednio w elemencie DOM, który go wyzwala (onClick, onMouseDown itd.) [Zobacz tutaj] (http://support.microsoft.com/ kb/311284), aby uzyskać więcej informacji –

Powiązane problemy