Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
964to968
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
964to968
964to968
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

aus hwnd die Url ermitteln

aus hwnd die Url ermitteln
06.04.2008 11:36:00
Reinhard
Hallo Wissende,
mit nachfolgendem Code erhalte ich die Hwnd eines Fensters, z.B. das von Hans.
Nun habe ich mehrere Codes um den Inhalt einer Internetseite auszulesen, nur da muß ich immer die exakte Url kennen und mitgeben.
Wie erhalte ich denn nun aufgrund der Hwnd die komplette Url einer Seite ?
Die Url benötige ich weil ich von da aus Unterwebseiten auslesen will und in der Url ist ein SessionId-Passwort enthalten, was ich kennen muss.
Das mit dem Session-Id Passwort ist nichts Illegales, da es sowieso beim IE oben in der Adresszeile angezeigt wird, ich glaube beim Firefox nicht, aber da steht es im Quelltext der Seite.
Wenn ich also eine Url manuell incl. SessionId zusammensetze kann ich die jeweilige Seite auslesen.
Danke ^ Gruß
Reinhard

Option Explicit
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As  _
Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long,  _
ByVal wIndx As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal  _
hWnd As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long,  _
ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, _
ByVal lpWindowName As Long) As Long
Const GW_HWNDFIRST = 0
Const GW_HWNDNEXT = 2
Const GWL_STYLE = (-16)
Const WS_VISIBLE = &H10000000
Const WS_BORDER = &H800000
Sub HoleHwnd()
MsgBox GetWindowList("Herber")
End Sub
Public Function GetWindowList(Suchwort As String)
Dim hWnd As Long, sTitle As String, lStyle As Long, Task_name() As String
Dim count As Integer, index As Integer, gefunden As Boolean
hWnd = FindWindow(ByVal 0&, ByVal 0&)
hWnd = GetWindow(hWnd, GW_HWNDFIRST)
Do
lStyle = GetWindowLong(hWnd, GWL_STYLE)
lStyle = lStyle And (WS_VISIBLE Or WS_BORDER)
sTitle = GetWindowTitle(hWnd)
'If Trim(sTitle)  "" And InStr(LCase(sTitle), Suchwort)  0 Then MsgBox sTitle & hWnd
If Trim(sTitle)  "" And InStr(LCase(sTitle), LCase(Suchwort))  0 Then GetWindowList =  _
hWnd
hWnd = GetWindow(hWnd, GW_HWNDNEXT)
Loop Until hWnd = 0
End Function
Private Function GetWindowTitle(ByVal hWnd As Long) As String
Dim lResult As Long, sTemp As String
lResult = GetWindowTextLength(hWnd) + 1
sTemp = Space(lResult)
lResult = GetWindowText(hWnd, sTemp, lResult)
GetWindowTitle = Left(sTemp, Len(sTemp) - 1)
End Function


24
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: aus hwnd die Url ermitteln
06.04.2008 19:22:18
Reinhard
Hallo Rainer,
dankeschön für den Link, klappt hervorragend, den Code kann ich sehr gut gebrauchen :-)
Aus, ja, mit aus politischen Gründen, surfe ich lieber mit Firefox. Wenn ich nun eine Seite auslesen will nehme ich halt den Code von dir und benutze den IE, für mich okay.
Aber, das Makro was ich basteln möchte, soll eine Liste erstellen welche Browser laufen und deren aktuelle Url notieren.
Dann diese Liste durchgehen und die Fenstertitel, ggfs. die Url prüfen ob es die richtige ist, dann diese Seite auslesen.
Vielleicht wird ersichtlicher was ich will wenn ich den Hintergrund erleuchte.
In einem anderen Excelforum gibts auch ein Archiv, wenn man da was gefunden hat, sieht man die damalige Beitragsfolge, und kann nacheinander alle Beiträge anklicken und lesen.
Aber die Option, diese Beitragsfolge auszudrucken oder abzuspeichern als txt-datei gibt es nicht.
Dies möchte ich allen anderen erlauben durch mein Makro.
Und die surfen mit was weiß ich für Browsern.
@ Karl-Heinz auch dir danke, ich muß aber erst schauen was ich mit deinem Code machen kann und, der Code vom Link vom Rainer läuft in Excel Vba, verstehe also auch nicht was du sagtest.
Danke allen
Gruß
Reinhard

Anzeige
hwnd Firefox
06.04.2008 20:01:38
MichaV
Hi Reinhard,
besorg Dir mal einen Api-Spy. Dann wirst Du sehen, daß Du an die Kind- Elemente des Firefox- Browsers nicht über API rankommst. Das Ding wurde wohl nicht mit MS- Mitteln programmiert :o)
Gruß- Micha

Download...
06.04.2008 20:15:17
Ramses
Hallo Micha
Kannst du die Datei downloaden ?
Gruss Rainer

AW: Download...
06.04.2008 20:35:36
MichaV
Hallo Rainer,
ja, hab ich vorhin ja gemacht. Ich habe eigentlich einen nicht kompilierten VB- Spy (Mouse'n Enum). Weil ich aber nicht weiß, ob Reinhard VB kompilieren kann, habe ich schnell nach einer exe gegoogelt und -um kurz anzutesten- runtergeladen.
Soll ich Dir die Zip schicken?
Gruß- Micha

Anzeige
AW: Download...
06.04.2008 20:52:00
Ramses
Hallo Micha
Ja gerne,... ich komme mit dem IE oder FF immer nur auf eine Fehlerseite.
ramses (at) gmxpro Punkt net
Gruss Raine

AW: hwnd Firefox
07.04.2008 12:35:00
Reinhard
Hallo Micha,
ich grüble seit gestern was ich denn mit diesem "Api Spy" machen soll wenn ich es denn mal hätte.
Mir ist leider unklar was ich mir da eigentlich herunterladen soll. :-(
Dieses "Ads Google" schreckt mich schon mal ab. Und Rainer spricht von "einer" Datei, welche denn genau?
Zum Kompilieren, ich habe VB 5.0, aber noch nie installiert.
Auf den Seiten deines Links habe ich rumgestöbert, scheinbar gibt es tolle Sachen zum Runterladen, aber mir fehlt es schon am Englischen geschweige denn am Fachwissen um was es da jeweils geht :-(
Ich stelle die Frage auf noch offen, obwohl du mir die leicht Hoffnung geraubt hast daß es da eine Vba Lösung gibt.
Gruß
Reinhard

Anzeige
AW: hwnd Firefox
07.04.2008 20:58:50
Volti
Hallo Reinhard,
ich weiß zwar nicht, was ein API-Spy ist, laut Beschreibung Micha scheint es jedoch die Auflistung der Kindfenster eines Hauptfensters (Programm) zu sein.
Ich melde mich deswegen jetzt doch noch mal mit dem anliegenden Script, welches genau dieses auch macht und zwar mit VBA-Code. Da ich es für Dein erstes Problem erstellt hatte, arbeitet es jetzt auch im Grunde so.
Also in Variable "Parentpiece" einen Teilstring des gewünschten, offenen Fensters eingeben und starten. Es werden alle gefundenen Childs mit ein paar Parameter aufgelistet. Kann natürlich noch um etliche Parameter erweitert werden, wie Position, Größe usw.

Option Explicit
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As  _
Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long,  _
ByVal wIndx As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal  _
hWnd As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long,  _
ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, _
_
ByVal lpWindowName As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, _
ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal  _
lpEnumFunc _
As Long, ByVal lParam As Long) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long,  _
ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long
Private Const GW_HWNDFIRST = 0
Private Const GW_HWNDNEXT = 2
Private Const GW_CHILD = 5
Private Const GWL_STYLE = -16
Private Const GWL_ID = -12
Private Const WM_GETTEXT = &HD
Public Child() As Long
Sub API_Spy()
'Sub ermittelt den Fenstertext eines Controls anhand eines Teilstrings
Dim hWnd As Long, hWnd2 As Long, lResult As Long, sTemp As String, ZL As Integer
Dim Parentpiece As String                                  'Hier Suchbegriff eingeben
ReDim Child(0 To 0)
Parentpiece = "ZipCheck"
hWnd = GetWindowList(0, Parentpiece, GW_HWNDFIRST)         'Handle des Suchfensters ermitteln
ErmittleKinderParameterEx hWnd                             'Alle Kinder anzeigen
End Sub
Public Function GetWindowList(ByVal hWnd As Long, Suchwort As String, Art As Long)
'Function ermittelt das Fenster, das das Suchwort enthält
Dim lResult As Long, sTemp As String
If hWnd = 0 Then hWnd = FindWindow(ByVal 0&, ByVal 0&)    'Startfenster festlegen
hWnd = GetWindow(hWnd, Art)                               'Erstes relevante Fenster holen
Do
sTemp = Space(255)
lResult = GetWindowText(hWnd, sTemp, 255)                'Fenstertext holen
If InStr(LCase$(sTemp), LCase$(Suchwort)) Then GetWindowList = hWnd: Exit Function
hWnd = GetWindow(hWnd, GW_HWNDNEXT)                      'Nächstes Fenster
Loop Until hWnd = 0
GetWindowList = 0
End Function
Sub ErmittleKinderParameterEx(hWnd As Long)
'Sub ermittelt alle zu den Controls eines Fensters gehörenden Parameter
Dim lResult As Long, sTemp As String, lStyle As Long, ZL As Integer
ReDim Child(0 To 0)
Cells.Clear
Call EnumChildWindows(hWnd, AddrOf("EnumChilds"), 0)
If UBound(Child) > 0 Then
For ZL = 0 To UBound(Child) - 1
hWnd = Child(ZL)
lStyle = GetWindowLong(hWnd, GWL_STYLE)
Cells(ZL + 2, 1) = Str$(GetParent(hWnd))           'Parentfenster
sTemp = Space(255)
GetClassName hWnd, sTemp, 128
If UCase$(Left$(sTemp, 6)) = "BUTTON" Then
Select Case GetWindowLong(hWnd, GWL_STYLE) And &HF
Case 2, 3: sTemp = "Checkbox"
Case 3, 4: sTemp = "Radiobutton"
Case 0, 1: sTemp = "Pushbutton"
Case 7: sTemp = "Groupbox"
Case 11: sTemp = "OwnerDraw"
End Select
End If
Cells(ZL + 2, 2) = sTemp                           'Klassenname
Cells(ZL + 2, 3) = Str$(lStyle)
Cells(ZL + 2, 4) = Str$(GetWindowLong(hWnd, GWL_ID)) 'ID des Controls
sTemp = Space(255)
SendMessage hWnd, WM_GETTEXT, 255, ByVal sTemp
'     lResult = GetWindowText(hwnd, sTemp, 255)
Cells(ZL + 2, 5) = sTemp                           'Controltext
Next ZL
End If
Cells(1, 1) = "Elternfenster"
Cells(1, 2) = "KLasse"
Cells(1, 3) = "Style"
Cells(1, 4) = "ID"
Cells(1, 5) = "Controltext"
End Sub
Public Function EnumChilds(ByVal ChWnd&, ByVal lParam&) As Long
'Function schafft alle Childwindows in ein Array
Child(UBound(Child)) = ChWnd
ReDim Preserve Child(0 To UBound(Child) + 1)
EnumChilds = 1
End Function


Das ist jetzt auch nicht mehr auf IE begrenzt, sondern solte mit allen Programmen funktionieren.
viele Grüße
Karl-Heinz

Anzeige
AW: hwnd Firefox
07.04.2008 22:08:00
Reinhard
Hallo Karl-Heinz,
dankeschön, werde ich gleich nachher testen, wäre schon chic wenn es das ist was brauche.
Für mich allein würde ja der Code von Rainer dicke reichen, der aber leider auf den IE beschränkt ist, ähem, der Code nicht Rainer :-)), aber Hintergrund des Ganzen ist, in einem anderen Forum gibt es das wie hier mit dem Archivthread nicht, zumindest nicht im dortigen Archiv.
D.h. man sieht nur die Betreffs aufgelistet und muß sich durchklicken.
Jetzt wollte ich halt etwas basteln, daß zumindest Excelbesitzer die ganze Beitragsfolge ausdrucken können oder am Stück lesen.
Da ich dies dann allen anderen zur Verfügung stellen will so kommt halt das Problem daß ich nicht weiß welcher Browser benutzt wird. Ich weiß nur den Namen der Seite, danach kann ich ja in den Fenstertiteln suchen.
Wenn ich dann das entsprechende Fenster gefunden habe, so kann ich dann den Text filtern nach den Adressen der angezeigten Beiträge.
Diese wiederum kann ich dann nacheinander auch auslesen aber dazu brauche ich die Ausgangsurl wegen dieser mistigen SessId.
Dann das Ganze in Excel darstellen unter Berücksichtigung evtl. Einrückungen der Betreffs, also da gibts noch viel zu tun :-)
Aus diesen Gründen benötige ich halt unbedingt die Url, egal welcher Browser.
So, jetzt gehe ich mal schauen ob dein Code meine Hoffnungen erfüllt, so oder so, dankeschön.
Gruß
Reinhard

Anzeige
AW: hwnd Firefox
07.04.2008 23:07:56
Reinhard
Hallo Karl-Heinz,
der Debugger bemängelt die Zeile (genauer das AddrOf) in:
Call EnumChildWindows(hWnd, AddrOf("EnumChilds"), 0)
jetzt weiß ich nicht ob das an XL97 liegt (Xl2000 installiere ich erst morgen, hatte die Festplatte formatiert usw.) oder ob da eine Sub/Function fehlt.
Ich weiß daß XL97 kein Enum kennt, may be daran liegt es.
Gruß
Reinhard

AW: hwnd Firefox
08.04.2008 08:23:19
volti
Hallo Reinhard,
bitte setze ab Excel2000 folgenden code ein:

Call EnumChildWindows(hWnd, GetFuncAddress(AddressOf EnumChilds), 0)


und diese Function noch dazutun:

Private Function GetFuncAddress(ByVal Address As Long) As Long
GetFuncAddress = Address
End Function)


Hintergrund ist, dass Windows angewiesen wird, nach Ermittlung jedes Kindes die angegebene Function EnumChilds aufzurufen; deswegen muss diese auch public sein.
Unter XL97 funktioniert dieses AddressOf noch nicht; deswegen habe ich eine mir von Nepumuk zur Verfügung gestellte Ersatzfunction AddrOf() eingesetzt und die habe ich vergessen mit hochzuladen. Sorry
Noch mal zum code: Er bietet, in Anlehnung an API-Spy, die Möglichkeit, alle Kinder eines Programms aufzulisten. Ob damit jetzt allerdings die Url von Firefox ermittelt werden kann, wenn dieser nicht regulär mit Childs arbeitet, wage ich zu bezweifeln.
Ich weiß daß XL97 kein Enum kennt, may be daran liegt es.
Das hat damit nichts zu tun. Die Enumerierung erladigt ja Windows und nicht Excel.
viele Grüße
KH

Anzeige
AW: mit hwnd Seite auslesen
08.04.2008 11:03:35
Reinhard
Hallo Karl-Heinz,
danke, jetzt klappt es in XL2000. Am Code von nepumuk für AddrOf und XL97 bin ich ntürlich interessiert :-)
ich habe noch zusätzlich zuunterst in der ZL-Schleife eingebaut:
Cells(ZL + 2, 6) = hWnd
Somit müßte ich ja wolhl auch die Hwnd-Nummer haben.
Nur, mir fehlt ja immer noch die Url des jeweiligen Browserfebnsters!?
Wenn das mit der Url nicht gehen sollte, wie lese ich denn dann den Quelltext eines Internetfensters aus, von dem ich die hwnd habe, sowie den Fenstertitel usw. ?
Frage noch offen.
Gruß
Reinhard

AW: mit hwnd Seite auslesen
08.04.2008 16:21:00
volti
Hallo Reinhard,
schön, dass es jetzt klappt. Den hWnd, als wichtiges Arbeitselement, habe ich auch noch nachgeschoben, aber den hast Du ja jetzt selbst. Mit den diversen API-Funktionen kann man noch Position, Größe usw. bekommen.
Bei Deinem Hauptproblem kann ich Dir derzeit leider nicht helfen. Da der IE, und ich nehme an Firefox auch, kein Kind dafür hat, geht der Inhalt nicht auszulesen. Könnte mir zwar vorstellen, dass der Textbereich als Unterunterkind implementiert ist (z.B. im Workercontrol), aber daran, das rauszufinden bin ich schon früher gescheitert.
Die Funktion AddrOf für XL97 von Nepumuk findest Du im Archiv Stichwort "Das Wort zum Sonntag", oder ich lad es heute abend noch mal hier hoch.
Den Fenstertitel liest Du mit GetText aus, so wie die einzelnen Controlls auch. Hier kannst Du mit dem Parenthandle arbeiten, das ist doch das handle für das Hauptfenster.

sTemp = Space(255)
SendMessage hWnd, WM_GETTEXT, 255, ByVal sTemp


Frage lass ich auch offen. Vielleicht hat ja jemand noch eine Idee.
viele Grüße aus Hessen
Karl-Heinz

Anzeige
AW: mit hwnd Seite auslesen
08.04.2008 16:34:14
Reinhard
Hallo Karl-Heinz,
ich habe mir AddrOf von Nepumuk für XL97 runtergeladen, danke dir und natürlich Nepumuk :-)
Trotzdem Frage noch offen.
Gruß
Reinhard

AW: mit hwnd Seite auslesen
08.04.2008 19:11:00
MichaV
Hallo Reinhard,
ich habs Dir oben schon gesagt, es geht bei Firefox nicht, mittels API irgendwas auszulesen.
Alles, was Du auslesen kannst, zeigt Dir so ein API- Spy. Du startest es und fährst dann mit der Maus auf dem Bildschirm rum. Jeder Handle jedes Elementes wird Dir angezeigt, zusätzlich noch der Code, mit dem Du diese Angaben mit VB(A) ausliest. Das beantwortet alle Deine Fragen.
Wenn Du Angst davor hast, sowas zu installieren, kann ich Dir nicht helfen. Aber dann mußt Du mir auch glauben :o) Außer den handle des Firefox- Fensters gibt es nichts zu lesen. Und der Text des Firefox- Fensters (schau mal ganz nach oben) zeigt nicht die URL an, sondern den Titel des aktiven Fensters.
Du kannst höchstens Firefox aktivieren und mit Sendkeys die URL markieren und kopieren. Aber so ein Programm würde ich mir dann nicht installieren :o)
Gruß- Micha
PS: Rückmeldung wäre nett.

Anzeige
AW: mit hwnd Seite auslesen
08.04.2008 20:18:59
Reinhard
Hallo Micha,
ach, das also macht das Api-Spy, war mir nicht klar, dann ist es zwar äußerst brauchbar wenn ich mit dem IE etwas mache aber nicht bei anderen Browsern, zumindest nicht beim Firefox.
Und ich frage auch gar nicht warum die da bei Mozilla nicht mal so paar Apis programmieren und mir geben :-) würde die Antwort wahrscheinlich fachlich sowieso nicht verstehen.
Gut, dann muß halt jeder den IE benutzen. dazu habe ich jetzt genügend Code gesammelt, muß das nur noch zusammenwürfeln.
Danke dir und allen anderen für die Unterstützung
Gruß
Reinhard

AW: mit hwnd Seite auslesen
08.04.2008 20:49:13
MichaV
Hallo Reinhard,
wer suchet, der...
vielleicht hilft Dir das hier etwas weiter http://www.vbarchiv.net/tipps/details.php?id=937
Gruß- Micha

Anzeige
klappt nicht bei Firefox :-(
09.04.2008 13:44:00
Reinhard
Hallo Micha,
ich habe den VB-Code aber leider nicht zum richtigen Funktionieren gebracht.
IE-Browser-Fenster werden korrekt ausgelesen, aber bei Firefox klappt nix denn der Code geht bei
der Funktion GetURLFromMozilla bei
On Error GoTo GUBErrHandler
CallingForm.txtDDE.LinkTopic = Browser & "|WWW_GetWindowInfo"
' tell Browser to send us name and title of the last active window or frame
CallingForm.txtDDE.LinkItem = &HFFFFFFFF
CallingForm.txtDDE.LinkMode = 2
CallingForm.txtDDE.LinkRequest
immer in die Fehlerroutine bei jedem Firefox-Fenster (Browser="Firefox"), denn LinkTopic, LinkItem usw. gibt es wohl in VBA nicht.
Dafür gibt es wohl etwas entsprechendes wie DDEInitiate, DDEExecute usw., was auch in der Vba-Hilfe
beschrieben wird.
Aber ich kriege es leider nicht hin, dies von VB nach Vba umzusetzen :-(
Eine Beispieldatei mit nachfolgendem Code: https://www.herber.de/bbs/user/51373.xls
Gruß
Reinhard
Folgender Code stammt von http://www.vbarchiv.net/tipps/details.php?id=937 und war für VB.
Ich habe eine Userform (Userform1) angelegt, mir einer TextBox namens txtDDE mit folgendem Code:
Private Sub UserForm_Initialize()
Dim sViewedURL As String
sViewedURL = GetURLList(Me)
MsgBox "Folgende Webaddressen werden gerade besucht: " & vbCrLf & sViewedURL
End Sub
und 2 Verweise im Code auf "Form" auf "Userform" geändert.
*******************************************************************************

'Wie man die URL der gerade besuchten Website mit DDE sehr einfach ermitteln kann,
'lässt sich bereits mit  diesem Tipp entnehmen. Das hat aber zwei entscheidende Nachteile:
'    * Erstens ist DDE nicht sehr schnell und recht fehleranfällig. Auch Microsoft selbst  _
scheint davon nicht mehr viel zu halten. In VB.NET beispielsweise wird DDE bereits nicht mehr unterstützt.
'    * Zweitens stösst man spätestens dann an die Grenzen, wenn mehrere Browserfenster  _
gleichzeitig geöffnet sind und man ALLE geöffneten URL's abfragen möchte.
In diesem Fall hilft folgender Tipp, der sich anstelle von DDE schamlos der Windows-API bedient  _
;).
'Das Prinzip dahinter ist folgendes: es werden der Reihe nach alle Top-Level-Fenster abgefragt,
'ob es sich dabei um Browserfenster handelt.
'Erkannt werden Opera, Netscape und Mozilla Firefox daran, dass sie einen bestimmten
'Fenstertitel besitzen, sowie der Microsoft Internet Explorer und darauf
'basierende Browser dadurch, dass ihr Klassenname "IEFrame" lautet.
'Wird ein solches Browserfenster gefunden, dann werden solange alle Child-Objekte durchsucht,
'bis eines vom Typ "Edit" gefunden wurde - dies ist nämlich dann das Feld, in dem die URL steht. _
'Dessen Text können wir nun via SendMessage und WM_GETTEXT auslesen
'Update vom 10.02.05:
'Da inwzischen auch Firefox als Browser weit verbreitet ist, wurde der Tipp erweitert,
'so dass sich auch damit besuchte Seiten auflisten lassen. Dies funktioniert allerdings
'nur mittels DDE und daher mit den oben beschriebenen Nachteilen.
'Grund dafür ist, dass Mozilla Firefox keine benannten Fensterklassen benutzt und es
'daher auf beschriebene Art und Weise unmöglich ist, herauszufinden, in welchem Feld
'die richtige URL steht.
'Nun zum Quellcode:
'Zuerst mal die Deklartionen... (unbedingt in ein Modul einfügen)
Option Explicit
' Verweis auf ein Formular, das eine Textbox "txtDDE" enthält!
'Private CallingForm As Form
Private CallingForm As UserForm
' Benötigte API-Deklarationen
Private Declare Function EnumWindows Lib "user32" ( _
ByVal lpEnumFunc As Any, _
ByVal lParam As Long) As Long
Private Declare Function GetWindowText Lib "user32" _
Alias "GetWindowTextA" ( _
ByVal hwnd As Long, _
ByVal lpString As String, _
ByVal cch As Long) As Long
Private Declare Function GetWindow Lib "user32" ( _
ByVal hwnd As Long, _
ByVal wCmd As Long) As Long
Private Declare Function GetClassName Lib "user32" _
Alias "GetClassNameA" ( _
ByVal hwnd As Long, _
ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Private Declare Function IsValidURL Lib "URLMON.DLL" ( _
ByVal pbc As Long, _
ByVal szURL As String, _
ByVal dwReserved As Long) As Long
Private Const WM_GETTEXT = &HD
Private Const WM_GETTEXTLENGTH = &HE
Private Const GW_CHILD = 5
Private Const GW_HWNDNEXT = 2
' String, der mit den einzelnen URL's
' gefüllt wird
Private sURLList As String
'So, nun kommen wir gleich zur Hauptfunktion. Diese deklarieren als "Public", '
'damit wir später von ausserhalb des Moduls darauf zugreifen können.
'Der Rückgabewert ist ein String, der die einzelnen URL's, getrennt durch Kommas, enthält.
'Mit noch etwas Feintuning könnte man natürlich auch ein Array zurückgeben,
'aber das soll ja nicht der Sinn dieses Tipps sein...
' Hilfsfunktion
Public Function IsGoodURL(ByVal sURL As String) As Boolean
sURL = StrConv(sURL, vbUnicode)
IsGoodURL = (IsValidURL(ByVal 0&, sURL, 0) = 0)
End Function
Sub Starten()
UserForm1.Show 0
End Sub
Public Function GetURLList(frm As UserForm) As String
sURLList = ""
' Verweis auf Formular, das die Textbox "txtDDE" enthält
Set CallingForm = frm
' Alle geöffneten Windows durchlaufen
EnumWindows AddressOf EnumerateProc, 0
If Len(sURLList) > 0 Then
' Abtrennen des führenden ","
sURLList = Mid(sURLList, 2)
End If
GetURLList = sURLList
sURLList = ""
End Function
'Die Function "EnumerateProc" hat die Aufgabe sich durch alle laufenden Top-Level
'Windows zu kämpfen...
Private Function EnumerateProc( _
ByVal app_hwnd As Long, _
ByVal lParam As Long) As Boolean
Dim buf As String * 1024
Dim title As String
Dim length As Long
' Fenstertitel auslesen.
length = GetWindowText(app_hwnd, buf, Len(buf))
title = Left$(buf, length)
' zusätzlich Name der Fensterklasse bestimmen
' ist es ein Internet Explorer Fenster, so lautet der Klassenname "IEFrame"
length = 256
buf = Space$(length - 1)
length = GetClassName(app_hwnd, buf, length)
buf = Left$(buf, length)
' enthält der Fenstertitel den Namen eines Browsers?
' 1. Internet Explorer (und darauf basierende Browser), Opera, Netscape
'If Len(title) > 0 Then MsgBox title
If InStr(1, title, "Opera", 1) Or _
InStr(1, title, "Netscape", 1) Or _
Trim(buf) = "IEFrame" Then
' Juhuu, ein Browser wurde entdeckt - die URL
' kann (wahrscheinlich) ausgelesen werden
' das Ergebnis des Auslesens wird zur Liste hinzugefügt
sURLList = sURLList & "," & getURL(app_hwnd)
' Firefox, Mozilla: Titel des Fensters überprüfen und ggf. URL mit DDE auslesen
ElseIf Right$(title, 7) = "Firefox" Then
sURLList = sURLList & "," & GetURLFromMozilla("Firefox")
ElseIf InStr(1, title, "Mozilla", 1) Then
sURLList = sURLList & "," & GetURLFromMozilla("Mozilla")
End If
' Weitersuchen...
EnumerateProc = 1
End Function
'Die Funktion zum Ermitteln der Child-Objekte, bis eine Edit-Klasse gefunden wird,
'sieht so aus:
Private Function getURL(window_hwnd As Long) As String
Dim txt As String
Dim buf As String
Dim buflen As Long
Dim child_hwnd As Long
Dim children() As Long
Dim num_children As Integer
Dim i As Integer
Dim sURL As String
' Klassennamen ermitteln --> wir wollen "Edit"
buflen = 256
buf = Space$(buflen - 1)
buflen = GetClassName(window_hwnd, buf, buflen)
buf = Left$(buf, buflen)
' Edit-Klasse gefunden ?
If buf = "Edit" Then
' ja, d.h. wir brauchen nur noch den
' Text auslesen
sURL = ReadText(window_hwnd)
If IsGoodURL(sURL) Then
getURL = sURL
Exit Function
End If
End If
' kein Edit-Objekt oder ungültige URL :(
' wir müssen die (weiteren) Childs
' durchsuchen (rekursiv)
num_children = 0
child_hwnd = GetWindow(window_hwnd, GW_CHILD)
Do While child_hwnd  0
num_children = num_children + 1
ReDim Preserve children(1 To num_children)
children(num_children) = child_hwnd
child_hwnd = GetWindow(child_hwnd, GW_HWNDNEXT)
Loop
' wir untersuchen wiederrum die Child's,
' ob sie vom Typ Edit sind
For i = 1 To num_children
txt = getURL(children(i))
If txt  "" Then Exit For
Next i
getURL = txt
End Function
'Jetzt fehlt uns nur noch die Funktion, die den Text ausliest, wenn wir auf ein Edit-Objekt
'stoßen. Voilà:
Private Function ReadText(window_hwnd As Long) As String
Dim txtlen As Long
Dim txt As String
ReadText = ""
If window_hwnd = 0 Then Exit Function
txtlen = SendMessage(window_hwnd, WM_GETTEXTLENGTH, 0, 0)
If txtlen = 0 Then Exit Function
txtlen = txtlen + 1
txt = Space$(txtlen)
txtlen = SendMessage(window_hwnd, WM_GETTEXT, txtlen, ByVal txt)
ReadText = Left$(txt, txtlen)
End Function
' Funktion zum Auslesen der URL von Mozilla Browsern mittels DDE
' Autor: Jörg von Busekist, http://www.programatrix.de
_
Private Function GetURLFromMozilla(ByVal Browser As String) As String
Dim TheUrl As String
Dim i As Integer
Dim CC As Long, parms(3) As String, quoting As Boolean
Dim thisParm As Integer, p As Long, c As Byte
On Error GoTo GUBErrHandler
'  CallingForm.txtDDE.LinkTopic = Browser & "|WWW_GetWindowInfo"
'  ' tell Browser to send us name and title of the last active window or frame
'  CallingForm.txtDDE.LinkItem = &HFFFFFFFF
'  CallingForm.txtDDE.LinkMode = 2
'  CallingForm.txtDDE.LinkRequest
'CallingForm.txtDDE.DDEInitiate Browser & "|WWW_GetWindowInfo", txtDDE
CallingForm.txtDDE.DDEInitiate Browser, txtDDE
'  deutsch englisch
'DDEKanalÖffnen DDEInitiate
'DDEAusführen DDEExecute
'DDEKanalSchliessen DDETerminate
'DDEAbfragen DDERequest
'DDESenden DDEPoke
'VISUAL BASIC 3.0:
'engl.
'LinkTopic, LinkMode props
'LinkExecute Method
'LinkMode prop
'LinkItem prop, LinkRequest method
'LinkItem prop, LinkPoke method
'  parse out info given to us by the Browser in callinform.txtDDE.Text; should be in the form
'  "URL","Page title","FrameName"
thisParm = 1
quoting = False
For i = 1 To Len(CallingForm.txtDDE)
c = Asc(Mid(CallingForm.txtDDE, i, 1))
Select Case c
Case 34     ' quotation mark
quoting = Not quoting
Case 44     ' comma
If Not quoting Then
thisParm = thisParm + 1
If thisParm > 3 Then Exit For
End If
Case Else
If quoting Then
parms(thisParm) = parms(thisParm) & Chr(c)
End If
End Select
Next i
GetURLFromMozilla = parms(1)
CallingForm.txtDDE.Text = ""
Exit Function
GUBErrHandler:
' skip process if any errors occur, i.e., Netscape did not respond to DDE initiate event
MsgBox "Fehler"
GetURLFromMozilla = ""
On Error GoTo 0
End Function
'Das war 's dann auch schon.
'Beim Aufruf der Funktion muss unbedingt der Verweis auf ein Formular übergeben werden,
'dass eine TextBox mit dem Namen "txtDDE" enthält.
'Die Textbox ist für den DDE erforderlich und kann auch unsichtbar sein.
' Beim nachstehenden, komisch keine Sub drumrum, muß wahrscheinlich in die UF
'Dim sViewedURL As String
'sViewedURL = GetURLList(Me)
'MsgBox "Folgende Webaddressen werden gerade besucht: " & _
'  vbCrLf & sViewedURL


AW: klappt nicht bei Firefox :-(
09.04.2008 19:47:43
MichaV
Hi,
ich habs mit DDE in VBA auch nicht hingekriegt.
Aber vielleicht für Dich als schwacher Trost: Auch wenn Du den Code in VB laufen lässt, funzt das Auslesen des Firefox nicht richtig. Aber es wird ja auch oft darauf hingewiesen, daß DDE für diesen Zweck eher eine Notlösung ist.
Gruß- Micha

AW: klappt nicht bei Firefox :-(
09.04.2008 20:17:00
Reinhard
Hallo Micha,
naja, Trost kann mans nicht nennen, habe schon meine VB5 Cd rausgekramt um irgendwie über VB... :-)
Okay, kann man irgendwie nichts machen.
Danke dir für deine sehr tatkräftige Unterstützung/Hilfe
Gruß
Reinhard

AW: aus hwnd die Url ermitteln
06.04.2008 17:36:42
Volti
Hallo Reinhard,
meines Erachtens gibt es keinen direkten Zusammenhang zwischen Win-handle und URL. Kenne auch keine API-Funktion.
Die Url kann aber bei offenem IE-Fenster aus dem Combobox/Edit-Control ausgelesen werden. Ramses hat ja dazu einen Link geschickt, der aber, da in anderer Programiersprache, äußerst schwierig umzusetzen ist. Aber vielleicht hilft Dir der ja schon.
Hier ist die Zusammesetzung "meines" IE mal dargestellt. Ich hatte mir mal ein Ermittlungsprogramm (andere Programmiersprache) hierfür geschrieben.

Komponentenliste für das Fenster "Herbers Excel-Forum - ExcelMeetingPoint - Microsoft Internet Explorer"
Nr. Art Position ID Handle Text
1 WorkerA x:48 y:25 40965 3780 ""
2 ReBarWindow32 x:48 y:25 40965 3784 ""
3 ToolbarWindow32 x:980 y:79 0 3844 ""
4 ComboBoxEx32 x:101 y:79 41477 3800 "https://www.herber.de/forum/" title="Auf der Suche nach einer Lösung für deine Excel-Probleme? Dann bist du beim Excel-Forum xlforum.herber.de genau richtig! Unser Forum bietet dir eine breite Palette an Expertenwissen, Tipps und Tricks rund um das Thema Excel. Egal, ob du ein Anfänger bist oder bereits Erfahrung hast, unsere Community steht dir jederzeit mit Rat und Tat zur Seite. Du möchtest mehr über die neuesten Excel-Features erfahren? Oder brauchst du Hilfe bei der Erstellung komplexer Formeln? Kein Problem! In unserem Forum findest du eine Vielzahl von Beiträgen, die dir dabei helfen, deine Excel-Kenntnisse zu verbessern. Und das Beste: Das Excel-Forum xlforum.herber.de ist komplett kostenlos! Melde dich noch heute an und werde Teil unserer wachsenden Community von Excel-Enthusiasten. Wir freuen uns darauf, dich kennenzulernen und dir dabei zu helfen, das Beste aus Excel herauszuholen!">
5 ToolbarWindow32 x:847 y:79 0 3816 ""
6 ComboBox x:101 y:79 41477 3804 ""
7 Edit x:124 y:84 41477 3812
"https://www.herber.de/forum/" title="Auf der Suche nach einer Lösung für deine Excel-Probleme? Dann bist du beim Excel-Forum xlforum.herber.de genau richtig! Unser Forum bietet dir eine breite Palette an Expertenwissen, Tipps und Tricks rund um das Thema Excel. Egal, ob du ein Anfänger bist oder bereits Erfahrung hast, unsere Community steht dir jederzeit mit Rat und Tat zur Seite. Du möchtest mehr über die neuesten Excel-Features erfahren? Oder brauchst du Hilfe bei der Erstellung komplexer Formeln? Kein Problem! In unserem Forum findest du eine Vielzahl von Beiträgen, die dir dabei helfen, deine Excel-Kenntnisse zu verbessern. Und das Beste: Das Excel-Forum xlforum.herber.de ist komplett kostenlos! Melde dich noch heute an und werde Teil unserer wachsenden Community von Excel-Enthusiasten. Wir freuen uns darauf, dich kennenzulernen und dir dabei zu helfen, das Beste aus Excel herauszuholen!">
8 ToolbarWindow32 x:59 y:55 40960 3796 ""
9 WorkerA x:954 y:27 0 3792 ""
10 ToolbarWindow32 x:59 y:29 0 3788 ""
11 WorkerA x:48 y:25 9999 3848 ""
12 msctls_statusbar32 x:48 y:716 40961 3852 ""
13 msctls_progress32 x:741 y:720 1 3868 ""
14 Shell DocObject View x:48 y:106 0 3312 ""
15 Internet Explorer_Se x:48 y:106 0 3316 ""

Vorgehenweise grundsätzlich also - Hauptfenster ermitteln - Kinderfenster nach ComboBoxEx32/Edit durchsuchen - Controltext ermitteln. Das Handle kann auch über die ID, hier 41477 ermittelt werden.
Hier mal ein Ansatz:

Option Explicit
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As  _
Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long,  _
ByVal wIndx As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal  _
hWnd As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long,  _
ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, _
_
ByVal lpWindowName As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, _
ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Public Declare Function GetDlgItem Lib "user32" (ByVal hDlg As Long, ByVal nIDDlgItem As Long)  _
As Long
Private Const GW_HWNDFIRST = 0
Private Const GW_HWNDNEXT = 2
Private Const GW_CHILD = 5
Private Const GWL_STYLE = -16
Private Const GWL_ID = -12
Sub HoleControltext()
'Sub ermittelt den Fenstertext eines Controls anhand eines Teilstrings
Dim hWnd As Long, hWnd2 As Long, lResult As Long, sTemp As String
Dim Parentpiece As String, Childpiece As String
Parentpiece = "Herber": Childpiece = "http"
hWnd = GetWindowList(0, Parentpiece, GW_HWNDFIRST)         'Handle des Suchfensters ermitteln
REM ErmittleKinderParameter hWnd
hWnd = GetWindowList(hWnd, Childpiece, GW_CHILD)           'Jetzt die Kinder durchsuchen
sTemp = Space(255)
lResult = GetWindowText(hWnd, sTemp, 255)                  'FensterText ermitteln
MsgBox sTemp
End Sub
Public Function GetWindowList(ByVal hWnd As Long, Suchwort As String, Art As Long)
'Function ermittelt das Fenster, das das Suchwort enthält
Dim lResult As Long, sTemp As String
If hWnd = 0 Then hWnd = FindWindow(ByVal 0&, ByVal 0&)    'Startfenster festlegen
hWnd = GetWindow(hWnd, Art)                               'Erstes relevante Fenster holen
Do
sTemp = Space(255)
lResult = GetWindowText(hWnd, sTemp, 255)                'Fenstertext holen
If InStr(LCase$(sTemp), LCase$(Suchwort)) Then GetWindowList = hWnd: Exit Function
hWnd = GetWindow(hWnd, GW_HWNDNEXT)                      'Nächstes Fenster
Loop Until hWnd = 0
GetWindowList = 0
End Function
Sub ErmittleKinderParameter(hWnd As Long)
'Sub ermittelt alle zu einem Control gehörenden Paramter
Dim lResult As Long, sTemp As String, lStyle As Long, Zl As Integer
hWnd = GetWindow(hWnd, GW_CHILD)
Do
lStyle = GetWindowLong(hWnd, GWL_STYLE)
Zl = Zl + 1
Cells(Zl, 1) = Str$(GetParent(hWnd))             'Parentfenster
sTemp = Space(255)
GetClassName hWnd, sTemp, 128
If UCase$(Left$(sTemp, 6)) = "BUTTON" Then
Select Case GetWindowLong(hWnd, GWL_STYLE) And &HF
Case 2, 3: sTemp = "Checkbox"
Case 3, 4: sTemp = "Radiobutton"
Case 0, 1: sTemp = "Pushbutton"
Case 7: sTemp = "Groupbox"
Case 11: sTemp = "OwnerDraw"
End Select
End If
Cells(Zl, 2) = sTemp                             'Klassenname
Cells(Zl, 3) = Str$(lStyle)
Cells(Zl, 4) = Str$(GetWindowLong(hWnd, GWL_ID)) 'ID des Controls
sTemp = Space(255)
lResult = GetWindowText(hWnd, sTemp, 255)
Cells(Zl, 5) = sTemp                             'Controltext
hWnd = GetWindow(hWnd, GW_HWNDNEXT)
Loop Until hWnd = 0
End Sub


Das Control´wird über zwei Suchbegriffe "Herber" und http:" ermittelt.
PS: Die SUB "ErmittleKinderParameter" gehört nicht dazu. Da habe ich Dir nur mal eine Möglichkeit aufgezeigt, wie man alle Childs eines Elternfensters auflisten kann.
Leider musste ich jedoch feststellen, dass diese Methode (klappt in Grunde sehr gut) für den IE nicht alle Child aufgelistet hat, so auch nicht die Combobox.
Möglicherweise muss hier doch mit EnumChilds gearbeitet werden. Da habe ich aber jetzt erst mal keine Zeit mehr für, um das rauszufinden. Deshalb lasse ich die Frage mal offen.
@Ramses: War das nur eine Linkweitergabe, oder kennst Du Dich auch bestens aus?
viele Grüße aus Hessen
Karl-Heinz

AW: aus hwnd die Url ermitteln
06.04.2008 18:43:07
Renee
Hi Volti,
der aber, da in anderer Programiersprache, äußerst schwierig umzusetzen ist.
Ich seh nur VB oder bin ich taub ? oder sehe ich nicht was ich denke?
GreetZ Renée

AW: aus hwnd die Url ermitteln
06.04.2008 19:53:08
Ramses
Hallo
"...oder kennst Du Dich auch bestens aus..."
Keine Ahnung. Ich denke ich bin eher eine Null in VBA-Programmierung.
Mit solchen Sachen beschäftige ich mich nur, wenn ich sie brauche. Habe genügend anderes zu tun :-)
Allerdings kann ich den Code schon lesen,... sonst hätte ich den Link nicht geschickt :-)
Der läuft übrigens perfekt unter VBA, mit seeehr wenigen Anpassungen, weil eigentlich für ACCESS geschrieben.
Gruss Rainer

AW: aus hwnd die Url ermitteln
06.04.2008 20:19:00
Volti
Hallo Renee, Ramses,
da habe ich mich wohl von der Textüberschrift "Access" und den Deklarationen wie "api..." blenden lassen, weil das 'nen Haufen Zeugs war und ich ehrlich gesagt das nicht alles komplett gelesen habe.
'Tschuldigung". Das mit dem Auskennen war natürlich auch nur in Bezug auf ACCESS gemeint, weil ich kenne mich da nicht so aus. :-)
viele Grüße
KH

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige