Mausklick außerhalb des Fensterbereichs abfangen



  • Stimmt. Ich hab das anders gemacht, aber so gehts natürlich auch 🙂
    Danke!



  • Nochmals danke. Ich habe jetzt das nächste Problem, dass ich einen Mausklick abfangen möchte. Gibt's dafür denn auch so eine einfache Lösung?

    Danke


  • Administrator

    1. Der C++ Standard hat keine Ahnung was eine Maus ist. -> Falsches Forum -> WinAPI Forum wäre korrekt.
    2. Pro Problem ein Thread.
    3. Im WinAPI Forum suchen, oder in der FAQ. Die Frage kam bestimmt schon einmal.
    4. Zusätzliche Stichwörter: Hook, Mousehook

    Grüssli



  • Ich denke Dravere hat recht und da gibts nicht grad eine einfache Lösung. Am besten gehste mal in das WinApi Forum oder googlest mal paar Minuten.



  • Doch, die gibt es - ich hab sie schon 1000mal benutzt 😉

    GetAsyncKeyState macht genau das, was du brauchst - naemlich einen Mausklick - unabhaengig von einem geoeffneten Fenster - abfangen.
    Parameter koennen die Konstanten fuer die Mausbuttons VK_LBUTTON (linke Maustaste), VK_RBUTTON (rechte) oder VK_MBUTTON (mittler Maustaste - i.d.R. also das Mausrad) sein oder auch eine Taste von der Tastatur kann abgefragt werden. GetASyncKeyState beachtet auch die Laendereinstellungen der Tastatur, sodass man z.B. bei der y-Konstante (kenn grad de Konstanennamen nicht mehr) immer die y-Taste druecken muss, egal ob man eine deutsche oder amerikanische Tastatur o.a. hat.

    Gruss
    Cartman


  • Administrator

    Problem ist allerdings, dass du mit GetAsyncKeyState keine Garantien bekommst und auch keine Events hast, sondern immer wieder eine Abfrage durchführen musst. Dies ist meistens "polling", bzw. "aktives Warten", was sehr unschön ist, da man das System unnötig belastet.
    Zudem hat man eben keine Garantie, dass heisst, wenn ein anderes Programm nach dem Drücken der Maustaste ein GetAsyncKeyState macht und danach dein Programm, liefert die Funktion in deinem Programm ein FALSE zurück, soweit ich das verstanden habe.
    Auch noch ein Problem ist, dass die physikalischen Knöpfe verwendet werden und nicht die logischen. Wenn der User somit seine Knöpfe anders zugeordnet hat, dann kann GetAsyncKeyState dies nicht erkennen. Dein länderspezifisch gilt nur für die Tastatur!

    Korrekte herangehensweise ist in meinen Augen in so einem Fall immer noch einen Hook.

    Grüssli



  • Dravere schrieb:

    Problem ist allerdings, dass du mit GetAsyncKeyState keine Garantien bekommst und auch keine Events hast, sondern immer wieder eine Abfrage durchführen musst. Dies ist meistens "polling", bzw. "aktives Warten", was sehr unschön ist, da man das System unnötig belastet.

    Dito, aber es sollte sowieso bei so einem Warten noch ein Sleep benutzt werden - eine Millisekunde reicht dabei schon.
    Es gaebe da eventuell noch eine Moeglichkeit das ganze per Nachrichten zu loesen, da das ganze aber Fensterspezifisch ist, muesste man das eben mit dem Desktop-Fensterhandle loesen (Stichwort GetDesktopWindow) - habe jedoch keine Erfahrungen damit.

    Dravere schrieb:

    Zudem hat man eben keine Garantie, dass heisst, wenn ein anderes Programm nach dem Drücken der Maustaste ein GetAsyncKeyState macht und danach dein Programm, liefert die Funktion in deinem Programm ein FALSE zurück, soweit ich das verstanden habe.

    Nein, denn gottseidank ist Windows ein Multitasking-System. GetAsyncKeyState liefert immer true, wenn die entsprechende Taste gedrueckt wird - egal ob ein anderes Programm diesselbe Abfrage durchfuehrt.

    Dravere schrieb:

    Auch noch ein Problem ist, dass die physikalischen Knöpfe verwendet werden und nicht die logischen. Wenn der User somit seine Knöpfe anders zugeordnet hat, dann kann GetAsyncKeyState dies nicht erkennen. Dein länderspezifisch gilt nur für die Tastatur!

    Ja das stimmt, fuer die Maus ist das aber kein Nachteil. Wenn ich in meinem Programm angebe, dass die linke Maustaste benutzt werden muss, dann wird der Benutzer auch die linke Maustaste druecken, egal welche Einstellungen er hat. Ich empfinde das also nicht unbedingt als Nachteil 😉

    gruss
    Cartman


  • Administrator

    Eric Cartman schrieb:

    Dito, aber es sollte sowieso bei so einem Warten noch ein Sleep benutzt werden - eine Millisekunde reicht dabei schon.

    Ganz schlechte Lösung, es ist immer noch ein aktives Warten. Dringend davon abzuraten.

    Eric Cartman schrieb:

    Es gaebe da eventuell noch eine Moeglichkeit das ganze per Nachrichten zu loesen, da das ganze aber Fensterspezifisch ist, muesste man das eben mit dem Desktop-Fensterhandle loesen (Stichwort GetDesktopWindow) - habe jedoch keine Erfahrungen damit.

    Nachrichten müssen nicht über ein Fenster gehen. Nachrichten können auch an einen Thread geschickt werden. Zudem funktionieren Hooks eben mit Nachrichten. Man fängt die Mouse Event Nachrichten ab.

    Eric Cartman schrieb:

    Nein, denn gottseidank ist Windows ein Multitasking-System. GetAsyncKeyState liefert immer true, wenn die entsprechende Taste gedrueckt wird - egal ob ein anderes Programm diesselbe Abfrage durchfuehrt.

    Was um alles in der Welt hat dies mit Multitasking zu tun?
    So wie ich die Dokumentation in der MSDN verstanden habe, ist dem nicht gewährleistet.

    Eric Cartman schrieb:

    Ja das stimmt, fuer die Maus ist das aber kein Nachteil. Wenn ich in meinem Programm angebe, dass die linke Maustaste benutzt werden muss, dann wird der Benutzer auch die linke Maustaste druecken, egal welche Einstellungen er hat. Ich empfinde das also nicht unbedingt als Nachteil 😉

    Dir ist schon aufgefallen, dass heutzutage viele Mäuse mit eigener Software kommen, wo man die Tasten selber konfigurieren kann. Dann kann man zum Beispiel die linke Maustaste auf eine andere Taste transferieren. Ich meine, wenn es jemanden gefällt.
    Als User fände ich eine solche Einschränkung grauenhaft und es würde für mich für miserable Produktqualität sprechen.
    Eben, statt die korrekten Funktionen zu benutzen, welche eigentlich dafür gedacht sind, probiert man es irgendwie andersherum zu "hacken".

    Grüssli



  • Dravere schrieb:

    Ganz schlechte Lösung, es ist immer noch ein aktives Warten. Dringend davon abzuraten.

    Nunja, wenn man mit GetAsyncKeyState arbeiten will bleibt einem wohl nichts anderes uebrig, ansonsten muesste man das eben ueber Nachrichten loesen, was meiner Meinung nach etwas umstaendlicher ist. Die Erwaehnung der Funktion Sleep war nicht grundlos. Die CPU-Belastung steigt beim aktiven Warten tatsaechlich bei bis zu 50%. Durch die Verwendung von Sleep(1) (wie gesagt reicht eine Millisekunde schon) ist kein Unterschied feststellbar, d.h. dass es kaum CPU-Belastung gibt. Damit bietest du anderen Programmen noc genuegend Freiraum. Gerade bei Spiele wird das haeufig so gemacht. Du wuerdest dich aber auch wundern wie haeufig das auch bei "normalen" Anwendungen gemacht wird, gerade wenn es um irgendwelche komplexe Probleme oder auch Spielereien (wie eine Animation) geht, die man nicht anders loesen kann.

    Dravere schrieb:

    Was um alles in der Welt hat dies mit Multitasking zu tun?
    So wie ich die Dokumentation in der MSDN verstanden habe, ist dem nicht gewährleistet.

    Ich habe mir die Dokumentation jetzt zwar nicht angesehen, aber aus eigener Erfahrung kann ich sagen, dass das kein Problem ist bzw. die Klicks immer erkannt werden. Ich habe das jetzt sogar noch extra schnell getestet, um sicher zu gehen, dass ich jetzt keinen Schwachsinn rede.

    Dravere schrieb:

    Dir ist schon aufgefallen, dass heutzutage viele Mäuse mit eigener Software kommen, wo man die Tasten selber konfigurieren kann. Dann kann man zum Beispiel die linke Maustaste auf eine andere Taste transferieren. Ich meine, wenn es jemanden gefällt.

    Ist mir bekannt.

    Dravere schrieb:

    Eben, statt die korrekten Funktionen zu benutzen, welche eigentlich dafür gedacht sind, probiert man es irgendwie andersherum zu "hacken".

    Aus was willst du hinaus? Versteh es gerade nicht.

    Gruss
    Cartman



  • Das deine Methode einfach nicht schön ist. Nur weil sie funktioniert heißt das immernoch nicht das sie Akzeptabel wäre.


  • Administrator

    Eric Cartman schrieb:

    ... Erklärung von Sleep ...

    Ich weiss schon, was du damit erreichst, nur ist es eine sehr unschöne Lösung. Ist mit vielen Nachteilen verbunden und absolut nicht zu empfehlen. Informationen dazu findest du genügend im Netz.

    Eric Cartman schrieb:

    Gerade bei Spiele wird das haeufig so gemacht.

    Nur bei Amateure-Spielen, ich kann mir nicht vorstellen, dass ein seriöser Spielehersteller so einen Fehler macht.

    Eric Cartman schrieb:

    Du wuerdest dich aber auch wundern wie haeufig das auch bei "normalen" Anwendungen gemacht wird, gerade wenn es um irgendwelche komplexe Probleme oder auch Spielereien (wie eine Animation) geht, die man nicht anders loesen kann.

    Man kann das Zeug anders lösen. Es gibt bessere Wege. Und nein, es würde mich nicht wundern, es gibt so viele unwissende Programmierer und so viele scheiss Software, da ist das absolut kein Wunder. Es ist aber kein Grund, auch sowas zu machen.

    Eric Cartman schrieb:

    Ich habe mir die Dokumentation jetzt zwar nicht angesehen, aber aus eigener Erfahrung kann ich sagen, dass das kein Problem ist bzw. die Klicks immer erkannt werden. Ich habe das jetzt sogar noch extra schnell getestet, um sicher zu gehen, dass ich jetzt keinen Schwachsinn rede.

    Tests beweisen gar nichts! Was wichtig ist, ist die Dokumentation. Du kannst noch so viel testen, vielleicht funktioniert es gerade in diesem Zusammenhang, vielleicht hat es kein anderes Programm, welches dir gerade reinfunkt, usw. usf.

    Auf einen anderen Computer bei einer anderen Person: BUMMM!

    Eric Cartman schrieb:

    Aus was willst du hinaus? Versteh es gerade nicht.

    Ich will grundsätzlich darauf hinaus, dass du eine Funktion für etwas missbrauchst, wofür die Funktion nicht gedacht ist und dadurch Software produziert, welche instabil und schlecht ist. Man kann immer irgendetwas auf eine andere Art hinbiegen, nur ist das meistens der falsche Weg.

    Grüssli


Anmelden zum Antworten