Delete / Löschen

Zugriff auf den Inhalt eines Fensters eines fremden Programm

unknown (MSG-ID logged)
28.02.2009 - 10:07
Hi,

ich möchte gerne an den Inhalt eines Fensters eines fremden Programmes
gelangen. Der Programmierer hat die Entnahme aus dem Fenster über die
Zwischenablage verhindert. Aber irgendwie im Speicher muss der Inhalt des
Fensters ja schlieߟlich vorhanden sein. Wie kann man dies also mittels VBA
hinbekommen ?

Gruߟ Kowalski !

unknown (MSG-ID logged)
01.03.2009 - 13:43


"Kowalski" schrieb:

Hi,

ich möchte gerne an den Inhalt eines Fensters eines fremden Programmes
gelangen. Der Programmierer hat die Entnahme aus dem Fenster über die
Zwischenablage verhindert. Aber irgendwie im Speicher muss der Inhalt des
Fensters ja schlieߟlich vorhanden sein. Wie kann man dies also mittels VBA
hinbekommen ?

Gruߟ Kowalski !

Hi,

ich habe mal ein wenig im Internet gesucht und folgendes Code-Beispiel
gefunden mit dem man den Text aus einem geöffneten Nodepad-Fenster
einlesen und zur Anzeige bringen kann.
Das Beispiel funktioniert bei mir auch, aber wenn ich den Code umschreibe
und auf meine Anwendung beziehe dann funktioniert es nicht.
Kann der Programmierer die Entnahme des Textes für sein Fenster verhindern ?
Irgendwie muss man doch aber rankommen können, schlieߟlich steht doch der
Test irgendwo im Speicher.

Kann jemand weiterhelfen ??

Gruߟ Kowalski !


Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal
lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA"
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2
As String) 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 parentHWND As Long
Private ChildHWND
Private text As String
Private textlength As Long

Private Const WM_GETTEXT = &HD
Private Const WM_GETTEXTLENGTH = &HE

Private Sub Main()

parentHWND = FindWindow("Notepad", vbNullString)
ChildHWND = FindWindowEx(parentHWND, 0&, "edit", vbNullString)
textlength = SendMessage(ChildHWND, WM_GETTEXTLENGTH, 0&, 0&)
text = String$(textlength, vbNullChar)
Call SendMessage(ChildHWND, WM_GETTEXT, textlength + 1, ByVal text)
MsgBox text

end sub

unknown (MSG-ID logged)
02.03.2009 - 06:21
Hi,

ich möchte gerne an den Inhalt eines Fensters eines fremden Programmes
gelangen. Der Programmierer hat die Entnahme aus dem Fenster über die
Zwischenablage verhindert.

Welche Methoden hast du denn probiert den "Inhalt" in die
Zwischenablage zu bekommen? Und was verstehst du unter
"Inhalt"? Mit einem Screenshot z.B. bekommst du den Inhalt
eines beliebigen Fensters immer in die Zwischenablage.

Dein in deinem Ingrid-Posting beschriebenes Beispiel
funktioniert so nicht, du muߟt erst mal in der Lage sein
die Anwendung selbst ansprechen zu können, dann
das entsprechende Fenster dieser Anwendung und
dann das entsprechende Steuerelement dieses Fensters.
Weiterhin dann auf den dort ausgewählten Text
zugreifen zu können, und dann erst kannst du diesen
selbst in die Zwischenablage kopieren.

Aber berichte doch erst mal um welche Anwendung
es sich handelt und was alles gesperrt ist. Nur die
rechte Maustaste zu sperren oder im Menü ein
Bearbeiten / kopieren nicht zu haben hindert nicht.
Geht das denn auch nicht per Tastenkombination?
Kann man in der Anwendung überhaupt einen
Text auswählen?

Aber irgendwie im Speicher muss der Inhalt
des Fensters ja schlieߟlich vorhanden sein. Wie kann man dies also
mittels VBA hinbekommen ?

Im Arbeitsspeicher ist der natürlich vorhanden, aber das ist ja
nicht die Zwischenablage von Windows, da muss der erst mal rein.

Btw, wenn sich der Programmierer der Anwendung dazu
entschieden hat einen "Kopierschutz" einzubauen wird
er sich evtl. etwas sinnvolles dabei gedacht haben. Aber
dazu kann man nichts sagen wenn man die Anwendung
nicht kennt.

Gruߟ,
Frank


unknown (MSG-ID logged)
02.03.2009 - 08:14
Hallo Frank,

also erst mal zum Grund meines Vorhabens.
Ich möchte gerne das Ergebnis eines fremden Programmes in Word
weiterverarbeiten (deshalb auch die Anfrage hier im Word-Forum). Der Anbieter
des fremden Programmes bietet das Ergebnis aber lediglich als PDF-Datei oder
aber am Bildschirm in einer Listbox. Da sich PDF-Dateien bekanntlich schwer
weiterverarbeiten lassen, möchte ich gerne an den Inhalt dieser Listbox
kommen.

Das mit dem Screenshot scheidet aus, da in der Listbox immer nur ein Teil
des Ergebnisses sichtbar ist. Man müsste also mehrere Screenshots machen und
das Erbenis mühsam zusammenpusseln - viel zu kompliziert und zeitaufwendig
für den Normalanwender.

Das mit der Zwischenablage funktioniert auch nicht, es ist nicht nur die
rechte Maustaste gesperrt sondern die Tastenkombinationen
Strg+A, Strg+C, Strg+V
funktionieren auch nicht .

Mit folgendem Code ist es mir immerhin schon gelungen die Listbox
anzusprechen. Es wird die korrekte Anzahl von Zeilen zurückgegeben, das
Handle des Fensters muss also korrekt ermittelt worden sein.

Bei der Ermittlung der Zeilenlänge mittels LB_GETTEXTLEN wird dann jedoch
fälschlicherweise immer 4 ermittelt (Länge eines Pointers ?).
Auch das Auslesen der einzelnen Zeile mit LB_GETTEXT bringt kein korrektes
Ergebnis.
Habe schon einen halben Tag im Netz rumgesucht, aber komme momentan nicht
weiter.

Gruߟ und vielen Dank schon mal

Kowalski !


Option Explicit

Private Declare Function FindWindow Lib "user32" _
Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

Private Declare Function FindWindowEx Lib "user32" _
Alias "FindWindowExA" ( _
ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long

Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

Private Declare Function SendMessageStr Lib "user32" _
Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As String) As Long

Private Const LB_GETCOUNT = &H18B
Private Const LB_GETTEXT = &H189
Private Const LB_GETTEXTLEN = &H18A
Private parentHWND As Long

Private Sub Main()
Dim nCount As Long
Dim i As Long
Dim sText As String
Dim nLen As Long
Dim hwndListBox As Long

parentHWND = FindWindow(vbNullString, "ߜberschrift des Hautfensters")
hwndListBox = FindWindowEx(parentHWND, 0&, "listbox", vbNullString)

' Anzahl der ListBox-Einträge ermitteln
nCount = SendMessage(hwndListBox, LB_GETCOUNT, 0, CLng(0))

' alle Einträge durchlaufen
For i = 0 To nCount - 1
' Textlänge des ListBox-Eintrags ermitteln
' hier wird fäschlicherweise immer nur "4" ermittelt
nLen = SendMessage(hwndListBox, LB_GETTEXTLEN, i, 0)
If nLen > 0 Then
' Text des ListBox-Eintrags auslesen
sText = String$(nLen, 0)
' sText enthät nur 4 Zeichen, diese stimmen auch nicht
SendMessageStr hwndListBox, LB_GETTEXT, i, sText

End If
Next i

End Sub


Thomas Braun
02.03.2009 - 08:48
Kowalski wrote:

Mit folgendem Code ist es mir immerhin schon gelungen die Listbox
anzusprechen. Es wird die korrekte Anzahl von Zeilen zurückgegeben, das
Handle des Fensters muss also korrekt ermittelt worden sein.

Funktioniert evtl. das hier:

http://www.activevb.de/tipps/vb6tipps/tipp0079.html

Dort gibt es auch ein Forum, kann nicht schaden dort auch nachzufragen.

grüße
thomas

unknown (MSG-ID logged)
02.03.2009 - 09:26

Funktioniert evtl. das hier:

http://www.activevb.de/tipps/vb6tipps/tipp0079.html

Dort gibt es auch ein Forum, kann nicht schaden dort auch nachzufragen.

grüߟe
thomas

Hallo Thomas,

nein der Code entspricht ja meinem Code und auf diese Seite war ich auch
schon gestoߟen.
Aber der Tip mit dem Forum ist vielleicht ganz gut, denn eigentlich betrifft
ja meine Frage nichts typisches für "Word Programming"

Vielen Dank

Kowalski




Share/Bookmark