Rückgabewert von GetWindowRect ist 0

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von flash.

    Rückgabewert von GetWindowRect ist 0

    Hallo.

    Ich hatte bisher noch nie das Vergnügen, eine fremde Anwendung fernsteuern zu müssen, und ich habe auch kein Problem das umzusetzen. Fast alles funktioniert auch bestens, mit einer kleinen aber wichtigen Ausnahme: um die Fensterposition einer bestimmten Anwendungsinstanz herauszufinden verwende ich GetWindowRect(), allerdings ist der Rückgabewert dabei stets 0. Mit dem korrekten Anwendungshandle kann ich die Fensterposition selbst setzen (SetWindowPos()) oder den Prozess töten (.Kill()), nur mit dem Auslesen habe ich Probleme. Ich glaube auch nicht, dass mein Code einen Fehler enthält, aber natürlich lasse ich mich gerne eines besseren belehren. Hier jedenfalls der auf das Wesentliche gekürzte Quellcode, mit dem Ergebnis, dass xc.Left, .Top, .Bottom und .Right jeweils eine 0 enthalten:

    VB.NET-Quellcode

    1. Private Declare Function GetWindowRect Lib "user32" Alias "GetWindowRect" (ByVal hwnd As IntPtr, ByVal lpRect As RECT) As Integer
    2. Structure RECT
    3. Public Left As Integer
    4. Public Top As Integer
    5. Public Right As Integer
    6. Public Bottom As Integer
    7. End Structure
    8. Dim xapp() As Process = Process.GetProcessesByName("calc")
    9. Dim xc As RECT
    10. GetWindowRect(xapp(0).MainWindowHandle, xc)


    Ich habe übrigens auch mehrere verschiedene Programme getestet, nicht nur das von mir fernzusteuernde sondern auch weitere wie den Windows Rechner, das Notepad und einige weitere mit demselben Ergebnis.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „flash“ () aus folgendem Grund: Ein Tippfehler hatte sich in den Quellcode eingeschlichen.

    Gehe ich Recht in der Annahme, dass Du das andere Programm NICHT mit

    VB.NET-Quellcode

    1. Dim pr As Process = Process.Start(NAME)
    startest?

    Probier mal ByRef lpRect As RECT

    VB.NET-Quellcode

    1. Private Declare Function GetWindowRect Lib "user32" Alias "GetWindowRect" (ByVal hwnd As IntPtr, ByRef lpRect As RECT) As Integer
    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!
    Richtig, bei der externen Anwendung handelt es sich um ein Programm, welches bereits vor dem Start meines Tools läuft und auch danach noch geöffnet bleiben soll. Ich möchte lediglich mehrere zeitintensive Anwendungsschritte automatisieren, das Programm aber nicht vollständig fernsteuern.

    Am fehlerhaften ByVal in der Deklaration hat es auch gelegen, nun funktioniert die Positionserkennung perfekt und ich muss das Programm nicht immer an eine vorgegebene Bildschirmposition verschieben. Vielen Dank :D