none
Informationen aus einer andern Application übernehmen RRS feed

  • Frage

  • Hallo,

    ich möchte gerne Information aus einer anderen Application in meine Application übernehmen.

    Es sollen 3 Felder ausgelesen werden. Feld1 und Feld2 enthalten je eine TelefonNummer, Feld3 enthält ein Datum

    Es gibt eine Lösung als 3-Zeiler in Autoit gelöst. Es sollte aber in einer VB-Application mit weitern Funktionen ebenfalls verwendet werden.

    Autoit-Code:

    $wert1=ControlGetText ("[Class:AfxMDIFrame80u]","","[CLASS:Edit; INSTANCE:6]")
    
    $wert2=ControlGetText ("[Class:AfxMDIFrame80u]","","[CLASS:Edit; INSTANCE:7]")
    
    $wert3=ControlGetText ("[Class:AfxMDIFrame80u]","","[CLASS:Edit; INSTANCE:26]")

    VB-Code:

    Dim hwnd As IntPtr
    hwnd = FindWindow("AfxMDIFrame80u", Nothing)
    If hwnd = 0 Then
         MsgBox("Windows not found")
    Else
        MsgBox("Windows found")
        MsgBox(hwnd, MsgBoxStyle.Information, "O-Fenster")
        hwnd = FinddWindowEx(Nothing, Nothing,  "AfxFrameOrView80u", Nothing)
        MsgBox(hwnd, MsgBoxStyle.Information, "Neues-Fenster")
        Dim HandleT As IntPtr = Marshal.AllocHGlobal(100)
        Dim NumText As Integer = SendMessage(hwnd, WM_GETTEXT, 1400, HandleT)
        Dim Text As String = Marshal.PtrToStringUni(HandleT)
        MsgBox(Text, MsgBoxStyle.Information, "Gelesen")
     
    End If

    Leider wird schon kein darunter liegendes Window unter<AfxMDIFrame80u>   mehr gefunden.

    Vielen Dank für Hilfe schon im Voraus.

    Wolfgang


    Dienstag, 28. Juli 2015 19:21

Antworten

  • Hallo Jens,

    klar das ist ein Tippfehler der mir bei der Übertragung passiert ist.

    Im Programm gibt es diese "d" natürlich nicht.

    Nachfolgend die Deklarationen.

    Vielen Dank für Deine Hilfe

    Grüße

    Wolfgang

    Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    
    Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Int32) As IntPtr
    
    Private Declare Function SetFocus Lib "user32.dll" (ByVal hwnd As Int32) As Int32
    
    Private Const WM_GETTEXT As Integer = &HD
    
    Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr


    Mittwoch, 29. Juli 2015 17:49

Alle Antworten

  • Hallo Wolfgang,

    ist das hier ein Schreibfehler ? Bei FindWindowEx ist doch ein d zuviel, was aber der Compiler eigentlich anmeckern müsste. Zeige bitte auch mal die Deklarationen von FindWindow, FindWindowEx und SendMessage, da werden die häufigsten Fehler gemacht.

    hwnd = FinddWindowEx(Nothing, Nothing,  "AfxFrameOrView80u", Nothing)

    hwnd ist hier wahrscheinlich schon IntPtr.Zero oder ?

    Vielleicht ist das hier auch eine Anregung

    Gruß



    Jens Gerber

    Dienstag, 28. Juli 2015 20:12
  • Hallo,

    du kannst mal versuchen über die Klassen von System.Windows.Automation auf die Daten zuzugreifen. Damit sparst du dir den unmanaged Code und der Zugriff funktioniert relativ einfach. Etwas mehr schreiben wirst du wohl aber müssen, da die .NET Sprachen nicht gerade für solche Zugriffe angedacht waren. Der oben genannte Namespace enthält aber trotzdem alles wichtige.

    Für VB.NET habe ich gerade kein Beispiel zur Hand, für C# findest du aber hier etwas. In meiner Signatur findest du auch noch einen Konverter wenn du etwas nicht verstehst.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Dienstag, 28. Juli 2015 20:13
    Moderator
  • Hallo Tom,

    sehr interessante Sache mit System.Windows.Automation... kannte ich noch gar nicht. Das hat jetzt nichts direkt mit seiner Frage zu tun... aber wie findet man denn damit die RootElemente eines Fensters einer fremden nativen Anwendung die bspw. in C++ geschrieben wurde ? Kann man die Elemente auflisten und prüfen ob man das richtige gefunden hat ? Ich habe lange nix mit Zugriff auf andere Anwendungen gemacht, aber das ging damals ziemlich gut über FindWindow und FindWindowEx. Mittels Spy++ hat man recht gut die Handles und Controlnamen gefunden. Ich werde das mit System.Windows.Automation bei Gelegenheit selber mal testen -> sehr interessant.

    Gruß


    Jens Gerber

    Dienstag, 28. Juli 2015 21:30
  • Hallo Jens,

    ich vergas auf das dazu passende Tool des Windows SDKs zu verweisen. Inspect.exe guckt was unter dem Cursor liegt und klappt die TreeView in seinem Fenster entsprechend aus. Interessant dabei ist das wirklich fast alles dort drin zu finden ist, selbst die einzelnen Elemente einer Webseite und Control-Template-Teile etc. kommen zum Vorschein. 

    Über die aufgelisteten Eigenschaften kann man dann recht einfach durch den Baum navigieren oder eine der anderen Zahlreichen Möglichkeiten nutzen um auf ein einzelnes Element zu kommen.

    Windows benutzt das ganze übrigens u.A. für die Vorlesen-Funktion der erleichterten Bedienung.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Dienstag, 28. Juli 2015 21:38
    Moderator
  • Hallo Tom,

    dankeschön, auch wenn ich das im Moment nicht unbedingt benötige -> trotzdem sehr interessant und hilfreich als modernere Alternative für solche Belange. Möglicherweise der bessere Ansatz für den Fragensteller. Man lernt hier nie aus und das ist auch gut so :-)

    Gruß


    Jens Gerber


    Dienstag, 28. Juli 2015 22:46
  • Hallo Jens,

    klar das ist ein Tippfehler der mir bei der Übertragung passiert ist.

    Im Programm gibt es diese "d" natürlich nicht.

    Nachfolgend die Deklarationen.

    Vielen Dank für Deine Hilfe

    Grüße

    Wolfgang

    Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    
    Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Int32) As IntPtr
    
    Private Declare Function SetFocus Lib "user32.dll" (ByVal hwnd As Int32) As Int32
    
    Private Const WM_GETTEXT As Integer = &HD
    
    Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr


    Mittwoch, 29. Juli 2015 17:49
  • Hallo Tom,

    vielen Dank für die Hilfe.

    Um das mehr schreiben von mehr oder weniger Code geht es eigentlich nicht, der Reiz liegt natürlich in der Freude am programmieren und Dinge zu lösen.

    Vor allem dann,   wenn dadurch Kollegen das Leben einfacher gemacht werden kann.

    Diese Namenspace werde ich mir mal näher betrachten, vielleicht gelingt mir damit eine Lösung, die hier natürlich zu finden sein wird.

    Viele Grüße

    Wolfgang

    Mittwoch, 29. Juli 2015 17:57