Clever-Excel-Forum

Normale Version: Auslesen eines Inhaltes einer anderen Applikation (2)
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3
Guten Tag liebe VBA-Spezialisten

Mit Hilfe von Schauan konnte ich mit dem nachfolgenden Code ganz gut den Inhalt einer fremden Applikation auslesen. Vor Kurzem wurde diese Applikation verbessert und nun bekomme ich den Text nicht mehr. Bzw. es kommt nun beim Class zu dem Wert "chrome_renderwidgethosthwnd". Trotz intensiver Recherche bekomme ich es nicht mehr hin, den Wert auszulesen.
Bitte helft mir oder ich muss eine ganz andere Lösung suchen.
Gruss
Stefan1

------ Excel-Modul VBA -----


Code:
Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

Const GC_CLASSNAMEMSFORM = "ThunderDFrame"
Const GWL_STYLE = -16
Const WS_VISIBLE = &H10000000

'Zwischenspeicher
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long        
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) 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 GetParent Lib "user32" (ByVal hwnd As Long) As Long
     
Private Type POINTAPI
  x As Long
  y As Long
End Type
Const WM_SETTEXT = &HC
Const WM_GETTEXT = &HD

Function InOutText() As String

Dim Result&, Handle&, Parent, p As POINTAPI, Buffer$, Class$
    Result = GetCursorPos(p)
    Handle = WindowFromPoint(p.x, p.y)
    Parent = GetParent(Handle)
    Class = SPACE$(128)
    Result = GetClassName(Handle, Class, 128)
    Class = LCase(Left$(Class, Result))  
    
    On Error Resume Next
 
       Buffer = SPACE$(32767)
       Result = SendMessage(Handle, WM_GETTEXT, Len(Buffer), ByVal Buffer)
       InOutText = Left$(Buffer, Result)
       
       If Err.Number > 0 Then
       End If
End Function
Guten Tag miteinander
Muss ich befürchten, dass es zu schwierig ist, das Problem zu lösen?  :22:
Gruss
Stefan1
Hi,
nicht so ungeduldig. Gib Andre die Chance, sichdazu zu äußern. Wird schon was kommen.
Deine Korrespondenz mit schauan am 17.06.2017, 06:01  war eine ganz andere! Bitte lege die Karten offen, wenn Du Hilfe möchtest.

Den Code hast Du da abgekupfert //activevb.de/tipps/vb6tipps/tipp0119.html
Gruss
Guten Tag Helvetier

Manchmal kommt man indirekt zu einer Lösung. So gab Schauan mit dem Hinweis "...SendMessage(hwnd ...)" und dem Link den entscheidenden Hinweis zur damaligen Lösung des Problems. Mit einigem Fleiss und den damit gefundenen Codeschnips kam ich auf den von Dir gezeigten Link und damit zur Lösung. Zuvor haben mir jedoch die entscheidenden Codehinweise gefehlt.

Nun hoffe ich, dass ich wiederum Glück habe und mir jemand den entscheidenden Hinweis gibt, auch wenn es nicht gleich die fertige Lösung ist. Ich verstehe etwas von VBA, aber nicht in der entscheidenden Tiefe. Selbst wenn ich mit Eurer Hilfe das Problem lösen konnte, kann ich noch lange nicht alle Teile des VBA-Codes mir erklären bzw. verstehen  :05:
Vielen Dank für jeden Hinweis.

Grüsse
Stefan1
Hallöchen,

eigentlich kann ich nur eine meiner Fragen wiederholen Sad - die Frage, wie genau Du die Funktion aufrufst und wie Du das hwnd und / oder SendMessage usw. verarbeitet hast.

Hier mal die Links zu den beiden Beiträgen
- der vom Juni
http://www.clever-excel-forum.de/Thread-...likation-2
- und davor im April
http://www.clever-excel-forum.de/Thread-...pplikation
Also, ich versuche es zusammenzustellen (etwas gekürzt):

Auf einer Schaltfläche habe ich folgenden Code:

Zuerst Positioniere ich den Cursor mit der Maus auf dem gewünschten Textfeld in der fremden Applikation und drücke auf die Schaltfläche "cmbInFin" im Excel-File.

------ Excel-Modul VBA -----

Private Sub cmbInFin_Click()
    Call ClipBoardMaker("cmbInFin01")
End Sub

Public Sub cmbInFin01()
Dim s As String
    s = InOutText()
    'Text im "s" wird ab hier ggfs. angepasst
    ThisWorkbook.Worksheets("Test").Cells(1, 1).Value = s    
End Sub

Public Sub ClipBoardMaker(sVBA As String)
    Application.OnTime Now + TimeValue("00:00:03"), sVBA    '3 Sekunden warten!
End Sub

-------------------------------------

Denn Code für "InOutText()" habe ich bereits hier publiziert.

Bis heute hat das ausgezeichnet funktioniert, doch ab sofort akzeptiert die erneuerte und modernisierte Fremd-Applikation (ohne Veränderung der GUI, Siebel Systems) den Zugriff nicht mehr bzw. gibt den bereits beschriebenen Wert (Class: "chrome_renderwidgethosthwnd") zurück. Mit anderen Worten erkennt der mir bekannt Code das Textfeld nicht mehr, kann deren Wert nicht mehr herauslesen. Es scheint mir, als wäre eine modernisierte Technologie eingesetzt worden, die die Textfelder nicht mehr preisgeben. Oder gibt es doch einen Weg dazu?
Was könnte ich da tun?
Hallöchen,

hm, da muss ich mal grübeln Sad Hab aber schon die Jacke an und bin auf dem Sprung ...

im Edge bekomme ich mit Debug.Print für Class und Result
windows.ui.core.corewindow
14
und im Notepad++ bei Suchen & Ersetzen
edit
4
Bleibe ich einfach nur im Excel, bekomme ich
excel7
17

(W10-64 und Exel2016-32)
Guten Tag Schauan

Genauso und bei Siebel eben dieses  :22: "chrome_renderwidgethosthwnd". Bisher hat es funktioniert.
Oh je, ich glaube, es gibt keine Lösung? Oder?  :22:
Seiten: 1 2 3