bei FindWindowEx bekomme ich kein Handle VB2010 Win7 64 Bit

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Marschel.

    bei FindWindowEx bekomme ich kein Handle VB2010 Win7 64 Bit

    Hallo,

    Ich bin am verzweifeln. Ich versuche seit geraumer Zeit aus eine Anwendung das Handle auszulesen, nur mit Teilerfolg. Ich denke ich mache das an ein Beispiel fest.

    Ich möchte einfach aus dem geöffneten Notepad den Textinhalt auslesen.

    Hier mein Code:

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    4. Public Shared Function FindWindow( _ByVal hWndP As String, _
    5. ByVal zero As String) As IntPtr
    6. End Function
    7. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    8. Private Shared Function FindWindowEx( _ByVal hWndP As IntPtr, _
    9. ByRef hWndC As IntPtr, _ByVal lpclassName As String, _
    10. ByVal windowTitel As String) As IntPtr
    11. End Function
    12. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    13. Private Shared Function GetWindowTextLength(ByVal hwnd3 As IntPtr) As Integer
    14. End Function
    15. Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    16. Dim hWndP As IntPtr
    17. Dim hWndC As IntPtr
    18. hWndP = FindWindow("Notepad", Nothing)
    19. hWndC = FindWindowEx(hWndP, 0, "Edit", vbNullString) 'vbNullsting
    20. Text1.Text = hWndP
    21. Text2.Text = hWndC '
    22. End SubEnd Class


    das Handle vom Parent "Notepad" (FindWindow) bekomme ich ohne weiteres, das klappt,

    aber das von FindWindowEx (Zeile 20) bekomme ich nicht hin. Als ChildAfter und Windowstext habe Null,IntPtr.Zero, 0,"",Nothing Versucht, ohne Erfolg.
    Was mache ich falsch?

    Ich habe einige Foren durchstöbert auch Toturials angeschaut. Ich bin immernoch sehr stuzig wie die schreibweise bei VB2010 aussieht!

    1) um die User32.DLL zu Impotieren, ist es in meinem geposteten Code richtig, oder ist die

    Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" ... richtig ?

    2) die Handle Variablen sind InTPtr? das sollte passen, aber ganz sicher bin ich mir nach den X-Foren, Infos etc. die ich gefunden habe, auch nicht mehr.

    über Spy++ habe ich mir die Infos "rausgesucht" wie das Handle und die Klassen.

    Bitte um Hilfe

    Vielen Dank im Voraus

    Marschel
    Hi.

    Hier sind die Deklarationen, wie ich sie häufig verwende:

    VB.NET-Quellcode

    1. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    2. Shared Function FindWindowEx(ByVal parentHandle As IntPtr, ByVal childAfter As IntPtr, _
    3. ByVal lclassName As String, ByVal windowTitle As String) As IntPtr
    4. End Function
    5. 'Declare Auto Function FindWindowEx(...) As IntPtr ist äquivalent, nur mit weniger Einstellmöglichkeiten.
    6. 'Ich empfehle DllImport.
    7. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    8. Shared Function FindWindow(<MarshalAs(UnmanagedType.LPTStr), [In]()> ByVal lpClassName As String, _
    9. <MarshalAs(UnmanagedType.LPTStr), [In]()> ByVal lpWindowName As String) As IntPtr
    10. End Function

    Die Handles bekommst du so:

    VB.NET-Quellcode

    1. Dim hNP As IntPtr = NativeMethods.FindWindow(Nothing, "Untitled - Notepad")
    2. Dim hEdit As IntPtr = NativeMethods.FindWindowEx(hNP, IntPtr.Zero, "Edit", Nothing)


    Zu GetWindowTextLength lies bitte den letzten Satz im einleitenden Text: msdn.microsoft.com/en-us/libra…s633521%28v=vs.85%29.aspx
    Das bedeutet, dass du die Funktion für deinen Zweck nicht verwenden kannst. Aber es geht anders:

    VB.NET-Quellcode

    1. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    2. Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInt32, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
    3. End Function

    Sende mit dieser Funktion die Nachrichten WM_GETTEXTLENGTH und WM_GETTEXT an das Handle des Edit-Controls. Die Werte der Konstanten und erforderliche Angaben in wParam und lParam findest du im MSDN.

    Die erste Nachricht liefert dir die Länge des Textes im Control (Rückgabewert). Das weitere Vorgehen ist in etwa so:
    - Länge = Länge + 1, weil GETTEXTLENGTH das abschließende NULL-Byte nicht mitzählt
    - Speicher mit Marshal.AllocHGlobal anfordern (Länge mal Marshal.SystemDefaultCharSize)
    - WM_GETTEXT senden (zusammen mit Länge und Speicherzeiger), Rückgabewert = Anzahl kopierter Zeichen
    - Marshal.PtrToStringUni() aufrufen, String erhalten
    - Speicher freigeben (Marshal.FreeHGlobal)
    Gruß
    hal2000

    schreib Fehler!!

    nicht ByRef sondern ByVal, bei der FindWindowEx Deklaration, es klappt!
    *Grund und Boden Schäm*

    es geht mit deiner Deklaration!

    Vielen Dank

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marschel“ ()

    Die Verwendung von NativeMethods ist lediglich ein freundlicher Hinweis der Entwicklungsumgebung, saubereren Code zu schreiben.
    Reduziere mal Dein Problem auf ca. 5 bis 10 Zeilen Code, und die poste dann noch mal.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hey,

    probier mal das hier:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Runtime.InteropServices
    3. Module Module1
    4. <DllImport("User32.Dll", SetLastError:=True, CharSet:=CharSet.Auto)> Private Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    5. End Function
    6. <DllImport("User32.Dll", SetLastError:=True, CharSet:=CharSet.Auto)> Private Function FindWindowEx(ByVal parentHandle As IntPtr, ByVal childAfter As IntPtr, ByVal lclassName As String, ByVal windowTitle As String) As IntPtr
    7. End Function
    8. Sub Main()
    9. Dim name As Process = Process.GetProcesses.Single(Function(d) d.ProcessName = "notepad")
    10. Dim Hwnd As IntPtr = FindWindow("notepad", name.MainWindowTitle)
    11. Hwnd = FindWindowEx(Hwnd, IntPtr.Zero, "Edit", String.Empty)
    12. Console.WriteLine(Hwnd)
    13. Console.ReadLine()
    14. End Sub
    15. End Module

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kevin Hombre“ ()

    Mach doch gleich eine WinmdowsForm-Anwendung draus. In einer Console hat das keinen Sinn, nicht mal zum Testen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!