Auslesen eines Inhaltes einer anderen Applikation (2)
#11
Hallo Stefan,
Leider fällt mir im Moment keine Lösung ein Sad Ich vermute aber, das es auch mit einem Windows Update zu tun haben könnte, ...
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#12
Vielen Dank, Ich glaube auch, dass momentan nichts zu erreichen ist. 
Als Umgehung dachte ich mir folgendes:
Ich markiere den Text und Kopieren in mit CTRL+C in den Zwischenspeicher.
Ich lese mit VBA den Zwischenspeicher aus.

Wie könnte ich das bewerkstelligen. Irgendwie habe ich immer einen leeren Zwischenspeicher oder den vorherigen Text. Es ist zum Verzweifeln.
Gruss
Stefan
Top
#13
Hallo Stefan,
Wenn Du mit ..c kopierst und mit ..v nicht das gleiche kommt, verhindert deine Anwendung vielleicht das Kopieren. VBA kann Dir dann leider auch nicht helfen. Sad
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#14
Nein, ich war nicht präzise genug. Mit den Tastenkombinationen CTRL+C und CTRL+V geht das manuell in Ordnung. Doch mit VBA gibt es immer wieder Probleme. Wie geht die sicherste Möglichkeit von SendKeys im VBA (inkl. ClipBoard leeren). Selbst wenn ich das ClipBoard leere, ist gelegentlich wieder der vorherige Inhalt beim CTRL + V vorhanden. Das kann ich nicht verstehen. Weiss hier jemand Rat.

Meine Versuche mit:

    If bC = 1 Then
        Application.SendKeys " ", True
        Application.SendKeys "{BACKSPACE}", True
        Application.SendKeys "{ENTER}", True
        If Err.Number > 0 Then Err.Clear
    Else
        '-----------------------------------------------------------
        'ErrorHandler
        On Error GoTo ErrorHandler
       
        '-----------------------------------------------------------
        Application.ScreenUpdating = False
        'ClipBoard/Zwischenspeicher löschen
        OpenClipboard FindWindow("xlMain", vbNullString)
        EmptyClipboard
        CloseClipboard
        'Zwischenspeicher abfüllen
        Set MyData = New DataObject
        If Len(strText) > 0 Then
            With MyData
                .SetText strText
                .PutInClipboard
            End With
        End If
Application.SendKeys "^{v}", True
        Set MyData = Nothing
    End If

Oder dann auch:

        EmptyClipboard
        Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)  'NEU
        Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)    'NEU
        Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)  'NEU
        Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)    'NEU
        Application.SendKeys "^{a}", True                   'NEU
        Application.SendKeys "^{c}", True
        Set MyData = New DataObject
        MyData.GetFromClipboard
        On Error Resume Next
        'Text vbCFText
        If MyData.GetFormat(1) Then
            ClipboardRead = Trim(CStr(MyData.GetText()))   ''MsgBox Split(MyData.GetText, vbCrLf)(1)
        ElseIf MyData.GetFormat(2) Then
            ClipboardRead = False
            MsgBox "Bilder können nicht übernommen werden"
        Else
            MsgBox "Die Daten aus der Zwischenablage können nicht übernommen werden!"
        End If
        Set MyData = Nothing
Top
#15
Hi,
(ohne das alles gelesen zu haben)
soweit mir bekannt, gibt es mit dem DataObject seit Excel 2013 Probleme bzw. das Ding funktioniert nicht mehr.
Geh komplett über die Clipboard API.
Google mal nach 
Terry Kreft clipboard
Da gibt  es eine schöne Klasse.
Top
#16
Danke, Hineinschreiben geht mit dem "Terry Kreft clipboard" jetzt recht sicher und gut.
Doch leider kriege ich den Text damit nicht aus der TextBox gelesen. Bin noch am suchen.
Gruss
Stefan
Schade, dass SendMessage nicht mehr mit "Chrome" funktioniert.
Top
#17
Jetzt habe ich das Auslesen umgestellt, wie folgt:
Es funktioniert beim Ersten Mal gut, dann wieder nicht, dann wieder und dann wieder nicht. Schön abgewechselt?
Bei der Funktion "ClipBoard_GetText" kommt jedes zweite Mal der "alte" Text. Wieso denn das? Weiss hier jemand Rat?
gruss Stefan1 


Public Function ClipboardRead(bC As Byte) As String
Dim tPoint As POINTAPI
Dim n As Long, x As Long, y As Long
    'eff. bC = 1 (AUSSER BETRIEB), 3 = Pseudo (keine Funktion)
    If bC = 3 Then
        ClipboardRead = InOutText(1, "")    'LESEN
    Else
        'Call ClipboardClear
        'Call ClipBoard_SetText("")
        n = GetCursorPos(tPoint)
        x = tPoint.x: y = tPoint.y
        Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
        Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
        n = SetCursorPos(x, y)
        Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
        Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
        n = SetCursorPos(x, y)
        Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
        Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
        Call Warten(100)
        n = SetCursorPos(x, y)
        Application.SendKeys "^{a}", True
        Application.SendKeys "^{c}", True
        ClipboardRead = ClipBoard_GetText
    End If
End Function

Function ClipBoard_GetText() As String
Dim hClipMemory As Long
Dim lpClipMemory As Long
Dim strCBText As String
Dim RetVal As Long
Dim lngSize As Long
    If OpenClipboard(0&) <> 0 Then
        ' Obtain the handle to the global memory
        ' block that is referencing the text.
        hClipMemory = GetClipboardData(CF_TEXT)
        If hClipMemory <> 0 Then
            ' Lock Clipboard memory so we can reference
            ' the actual data string.
            lpClipMemory = GlobalLock(hClipMemory)
            If lpClipMemory <> 0 Then
                lngSize = GlobalSize(lpClipMemory)
                strCBText = SPACE$(lngSize)
                RetVal = lstrcpy(strCBText, lpClipMemory)
                RetVal = GlobalUnlock(hClipMemory)
                ' Peel off the null terminating character.
                strCBText = Left(strCBText, InStr(1, strCBText, Chr$(0), 0) - 1)
            Else
                MsgBox "Could not lock memory to copy string from."
            End If
        End If
        Call CloseClipboard
    End If
    ClipBoard_GetText = strCBText
End Function
Top
#18
Ich habe nun folgenden VBA-Code, der funktioniert. Am Montag werde ich ihn am "Original" testen. "CTRL+A" geht leider nicht, weil das Fremdprogramm es nicht zulässt. Damit ich auch mehrzeilige TextBoxen auslesen kann, habe ich mit "Home" und "Shift+End" gearbeitet. Das Problem mit der unregelmässigen Textzugänglichkeit im ClipBoard (Zwischenspeicher) konnte ich mit etwa Wartezeit beheben. Gibt es ein VBA-Code für die Aktualisierung (eine Art Refresh) vom ClipBoard?

Die Praxis wird es zeigen, ob es auch funktioniert. Ich hoffe immer noch, das der "alte" Code wieder lauffähig bekomme (in Zukunft), weil der einfach genial und einfach anwendbar war.

Public Function ClipboardRead(bC As Byte) As String
Dim tPoint As POINTAPI
Dim n As Long, x As Long, y As Long
    'eff. bC = 1 (AUSSER BETRIEB), 3 = Pseudo (keine Funktion)
    If bC = 3 Then
        ClipboardRead = InOutText(1, "")    'LESEN
    Else
        n = GetCursorPos(tPoint)
        x = tPoint.x: y = tPoint.y
        Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
        Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
        Call Warten(100)
        n = SetCursorPos(x, y)
        'Application.SendKeys "^{a}", True
        Application.SendKeys "^{HOME}", True
        Application.SendKeys "^+{END}", True
        Application.SendKeys "^{c}", True
        Call Warten(100)
        ClipboardRead = ClipBoard_GetText
    End If
End Function
Top
#19
Hallo Stefan,

einen Refresh kenne ich nicht. Du müsstest das Clipboard z.B. mit den API's leeren und dann wieder füllen.

PHP-Code:
Public Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long 
Public Declare Function EmptyClipboard Lib "user32" () As Long 
Public Declare Function CloseClipboard Lib "user32" () As Long 

Public Function ClearClipboard() 
    OpenClipboard (0&) 
    EmptyClipboard 
    CloseClipboard 
End 
Function 
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#20
Guten Tag Schauan

Vielen Dank für Deinen Hinweis. Genau das habe ich auch versucht, doch das Resultat war dann ein leeres Clipboard beim Auslesen. Nur das "Warten" um eine Zeiteinheit hat das Problem einigermassen zuverlässig gelöst. Doch so zuversichtlich ist mir dabei nicht. Es scheint, dass das Clipboard nicht gerade sehr schnell den eingelesenen Wert zur Verfügung stellt. Darauf bin ich gekommen, als ich den Code Schritt für Schritt durchlaufen und bei fehlendem Resultat beim Auslesen händisch gleich nochmals das Clipboard ausgelesen habe und dann den Wert wie aus dem nichts plötzlich zur Verfügung stand. Ich kenne mich nicht so gut damit aus, was ein verzögertes Ablegen der eingelesenen Werte verursacht. Vielleicht einfach ein zu langsamer Rechner.  :s
Doch wenn es wieder funktioniert (am Montag werde ich testen), dann bin einigermassen zufrieden, obwohl mit die "alte Lösung" viel besser zugesagt hat. Bis dahin vielen Dank für Eure Unterstützung und tatkräftigen Hinweise.

Gruss
Stefan
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste