Welches Fenster ist gerade unter dem Mauscursor ?



  • Hallo !

    Gibt es eine Möglichkeit zu ermitteln, welches Fenster sich gerade unter dem Mauscursor befindet ?
    Es soll auch möglich sein, die Fenster zu indentifizieren, welche nicht zu dem eigenen Prozess/Thread gehören.

    Gruß



  • HWND Handle;
    POINT curpos;
    GetCursorPos(&curpos);		// Mausposition ermitteln
    Handle = WindowFromPoint(curpos);  // Window holen
    

    so dürfte es gehen

    aber ACHTUNG: dabei handelt es sich um das Window und nicht unbedingt das ParentWindow ! Also wenn du den Mauszeiger über ein Editfeld hällst bekommst du sofort den Handle zum Editfenster ! Dieses Problem dürfte sich mit GetParent erledigen...

    mfG noha



  • Danke erstmal für die Antwort. Die Funktion WindowFromPoint hab ich auch schon gefunden. Das Problem hier ist, das Fenster kann auch inaktiv sein, dann funktioniert das nicht mehr.



  • Da gibts dann keine Möglichkeit, vllt hilft Dir ja EnumChildWindows bzw. EnumWindows ?! 🙂



  • CodeFinder schrieb:

    Da gibts dann keine Möglichkeit, vllt hilft Dir ja EnumChildWindows bzw. EnumWindows ?! 🙂

    Dann frage ich mich, wie das die VNC-Software macht.

    Ich habe nämlich vor so etwas zu programmieren.



  • Nun dafür gibts n mögliches Workaround: Wenn der Cursor beispielsweise über einem deaktivierten Button ist, bekommst Du den Handle des darunter liegenden Parents. Mit dem Handle und der Funktion EnumChildWindows, kannst Du prüfen, ob sich an der Stelle auch ein Child befindet (müsste sowohl mit deaktiven als auch mit aktiven funktionieren).

    Funktionen die Du (mglw.) brauchst sind: EnumChildWindows, PtInRect, ScreenToClient, GetWindowRect IsParent, IsChild, ...



  • Zausel schrieb:

    Dann frage ich mich, wie das die VNC-Software macht.
    Ich habe nämlich vor so etwas zu programmieren.

    du könntest dir den quellcode von VNC herunterladen...
    🙂



  • Ich wollte ganz clever sein und habe folgendes probiert:

    hWndDesktop = GetDesktopWindow();
    	GetCursorPos(&curpos);       
    	SendMessage( hWndDesktop, WM_MBUTTONDBLCLK , 0, MAKELPARAM(curpos.x, curpos.y) );
    

    Wo auch immer sich der Mauscursor befindet, es tut sich leider nichts.
    Ich hätte mir gewünscht, das z.B. eine Applikation startet, wenn sich der Mauscursor über einem Desktop-Exe-Symbol befindet, oder das ein Verzeichnis geöffnet wird, wenn der Cursor über einem Desktop-Verzeichnis-Symbol ist.

    Gibt es eine Möglichkeit einen Mausklick oder Doppelklick an Windows so zu schicken, das Windows 'automatisch' erkennt, ob der Mauscursor gerade über einem Applikationsfenster, oder Desktopfenster ist, etc. ?

    Undertaker schrieb:

    du könntest dir den quellcode von VNC herunterladen...
    🙂

    Ja, habe ich gemacht. Die arbeiten viel mit Hooks und ich frage micht, ob es nicht einfachere Mittel gibt, so etwas zu realisieren.



  • Zausel schrieb:

    Ich wollte ganz clever sein und habe folgendes probiert:

    hWndDesktop = GetDesktopWindow();
    	GetCursorPos(&curpos);       
    	SendMessage( hWndDesktop, WM_MBUTTONDBLCLK , 0, MAKELPARAM(curpos.x, curpos.y) );
    

    Wo auch immer sich der Mauscursor befindet, es tut sich leider nichts.

    verwende die SendInput- oder mouse_event-funktion, dann brauchste das HWND nicht.

    Zausel schrieb:

    Undertaker schrieb:

    du könntest dir den quellcode von VNC herunterladen...
    🙂

    Ja, habe ich gemacht. Die arbeiten viel mit Hooks und ich frage micht, ob es nicht einfachere Mittel gibt, so etwas zu realisieren.

    naja, die wollen wohl nicht pollen, deshalb die hooks.
    🙂



  • Undertaker schrieb:

    verwende die SendInput- oder mouse_event-funktion, dann brauchste das HWND nicht.

    Super !
    Die mouse_event Funktion funktioniert sogar über den Desktop-Symbolen. 🙂

    Undertaker schrieb:

    naja, die wollen wohl nicht pollen, deshalb die hooks.

    Ich will auch nicht pollen.
    Weiss noch nicht genau, ob das geht aber:
    Ich lasse nur dann ein neues Bild schicken, wenn z.B. ein neues Fenster aufgeht, oder wenn sich die Position endgültig geändert hat ( WM_LBUTTONUP ) usw.

    🙂



  • such' mal im internet nach 'mirror driver'. die gibt's seit win2k und man kann damit sämtliche grafikoperationen abfangen. sowas ist, meiner meinung nach, für einen vnc-clone bestens geeignet.
    🙂



  • Ja, ich werd mal gucken, was es mit dem 'mirror-driver' auf sich hat.

    Im grunde sollen aber keine Grafikoperationen abgefangen werden. Sie werden erzeugt :
    Server startet, und schickt Bildschirminhalt an den Client.
    Client klickt z.B. auf ein Applikation-Desktopsymbol, Server startet die Applikation und erzeugt einen neuen Bildschirminhalt und schickt diesen an den Client, usw.
    🙂



  • Zausel schrieb:

    Server startet, und schickt Bildschirminhalt an den Client.
    Client klickt z.B. auf ein Applikation-Desktopsymbol, Server startet die Applikation und erzeugt einen neuen Bildschirminhalt und schickt diesen an den Client, usw.

    na, wenn relativ viel zeit dazwischen liegt (mehrere sekunden oder so) dann brauchst du bestimmt weder hooks noch mirror driver. einfach nur den ganzen bildschirminhalt in eine 'dibsection' blitten und die pixeldaten abschicken.
    🙂



  • Undertaker schrieb:

    na, wenn relativ viel zeit dazwischen liegt (mehrere sekunden oder so) dann brauchst du bestimmt weder hooks noch mirror driver. einfach nur den ganzen bildschirminhalt in eine 'dibsection' blitten und die pixeldaten abschicken.

    Ja, es liegt relativ viel Zeit dazwischen. Der Zugang zum anderen Rechner erfolgt über eine 56k Modem Internetverbindung.
    Ich werd den Bildschirminhalt dann noch durch die libpng und zlib Bibliotheken schicken, um den TCP/IP Transfer zu beschleunigen.

    🙂



  • Zuletzt bearbeitet von pale dog am 22:09:31 03.08.2007, insgesamt 1-mal bearbeitet

    Warum hast du das als Singatur anhängen, damit man dich als ehemaligen pale dog erkennt ? 🙂



  • Zausel schrieb:

    Ja, es liegt relativ viel Zeit dazwischen. Der Zugang zum anderen Rechner erfolgt über eine 56k Modem Internetverbindung.
    Ich werd den Bildschirminhalt dann noch durch die libpng und zlib Bibliotheken schicken, um den TCP/IP Transfer zu beschleunigen.

    klar, komprimieren sollte man dann schon. ein desktop-image lässt sich wunderbar zusammenstauchen, wenn man nicht gerade eine hochauflösende grafik als hintergrund gewählt hat. du könntest z.b. die farbtiefe reduzieren und eine verlustbehaftete kompression verwenden (wie in jpeg oder über wavelets etc.)
    🙂



  • Ich habe jetzt ein Testbild vom Desktop erstellt.
    Im BMP Format sind das ca. 1.37 MB
    Wenn ich das Bild mit der Zlib-Bibliothek komprimiere, dann bekomme ich eine 337 Kilobyte Datei.
    Das ist natürlich schon ein riesen Unterschied.

    Für eine Modemverbindung ist das aber immer noch ne ganze Menge, von daher scheint mir deine Idee mit der Farbtiefe-Rezudierung eine sehr gute Lösung zu sein.

    Ich weiss, wie man einen 24 Bit Screenshot erstellt, aber wie geht das mit der Farbreduzierung ? Da tappe ich noch im Dunkeln.


Anmelden zum Antworten