Mouse Hook Doppelklick abfangen



  • Hallo Forum 🙂

    Ich hab einen MouseHook erfolgreich in Betrieb, der fängt mir schön Mousewheel events, einfache Mouseclicks usw ab, nur bekomme ich es nicht hin, dass er mich über Doppelklicks informiert.

    Mein Code geht so (nicht wundern, ist bischen Java JNI drin)

    LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam){
            JNIEnv * env;
            MSLLHOOKSTRUCT * m = (MSLLHOOKSTRUCT*)lParam;
            int a;
            if(nCode < 0)	return CallNextHookEx(NULL, nCode, wParam, lParam);
    
            if (jvm->AttachCurrentThread((void **)&env, NULL) >= 0) {
    
                    if(nCode == HC_ACTION){
    
                            switch (wParam){
    
                                  break;
                            case WM_MOUSEWHEEL:
                                    env->CallIntMethod(hookObj, processKeyID, (int)m->mouseData, false);
                                    break;
                                case WM_LBUTTONUP:
                                   env->CallVoidMethod(hookObj, onHotKeyID, -10, false);
                                  break;
    //das fängt er nicht ab...
                                case WM_LBUTTONDBLCLK:
                                   env->CallVoidMethod(hookObj, onHotKeyID, -100, false);
                                  break;
                                case WM_RBUTTONUP:
                                   env->CallVoidMethod(hookObj, onHotKeyID, -30, false);
                                  break;
                                case WM_MBUTTONUP:
                                   env->CallVoidMethod(hookObj, onHotKeyID, -20, false);
                                  break;
                                case WM_XBUTTONDOWN:
                                   a = HIWORD(m->mouseData);
                                   int ret;
    
                                   if (a == 1) {
                                       ret = -40;
                                   }
                                   if ( a == 2 ) {
                                       ret = -50;
                                   }
                                   env->CallVoidMethod(hookObj, onHotKeyID, ret, false);
                                  break;
                            default:
                                    break;
                            }
                    }
            }
            return CallNextHookEx(NULL, nCode, wParam, lParam);
    }
    

    Jemand ne Idee?
    also für jeden Klick ruft der Hook ne Java Funktion auf, doch für Doppelklick, macht er es nicht. Bekomme immer -10...


  • Mod

    Soweit ich das verstehe, wird die Double-Clickaus dem WM_LBUTTONDOWN Nachrichten durch die Default Window Proc erzeugt.
    Sie ist kein Event das als Mauseingabe reinkommt, also auch nicht im Hook ankommt.



  • Wenn die MouseDoubleClicks nicht hook-fähig sind (was ich nicht weiss), kann man diese sehr gut in subclasses auf die Childfenster abfangen, wo der Mausklick erfolgt. Ich mache das erfolgreich so und benutze weder für die Tastatur noch für die Maus Hooks. Das Einhängen der subclasses ist leider nicht ganz einfach.



  • hmmm, ich muss irgendwie feststellen, ob in dem einen Programm ein Doppelklick erfolgte ...

    Könnt ich das evtl. über nen anderen Hook machen? Message Hook an den andren Thread dranhängen?

    Es gibt auch noch die Möglichkeit die Zeit zwischen den Linksklicks zu messen und dann mit der Doppelklickzeit zu vergleichen ...

    nur weiß ich nicht wie Zuverlässig das ist...



  • So wie ich sehe hast du nur ein Programm mit einem thread. Was willst du wem mitteilen, etwa einem zweiten Programm im ersten Programm ist ein Doppelklick erfolgt oder was?


  • Mod

    Verwende z.B. einen anderen Hook...



  • Lumpeh schrieb:

    Es gibt auch noch die Möglichkeit die Zeit zwischen den Linksklicks zu messen und dann mit der Doppelklickzeit zu vergleichen ...

    So macht es das Betriebssystem für ein WM_LBUTTONDBLCLK (siehe Remarks) auch. Wenn das Fenster auf Doppelklicks reagiert und nicht den CS_DBLCLKS-Style hat, dann ist Zeitmessen eh die einzige Möglichkeit. Es mag ja sein, daß sich das Fenster den Doppelklick selbst "zusammenmisst" (alter Trick).



  • Also es geht darum, dass ich feststellen mag, ob in einem bestimmten Fenster eines anderen Programmes, ein Doppelklick erfolgte. Mit dem normalen MouseHook kann ich ja ganz normal die Mausklicks bekommen.. Nun interessieren mich halt die Doppelklicks.

    Ich denke ich werds irgendwie über die Zeitmessung hinwurschteln. Kann es da irgendwie passieren, dass aufgrund von Verzöerungen in der Nachichtenschleife der Doppelklick nicht gewertet wird? Wobei es bei einem LL Mouse Hook eher unwahrscheinlich ist, die Events müssten direkt zum Hook gehen und erst danach zu anderen Applikationen.. wenn ich mich nicht täusche 🙂


  • Mod

    Und warum nimmst Du keinen Hook auf die Fensterprozedur, wie ich es schon geschrieben habe?



  • Und welchen Hook? Bin grade nicht sicher, meinst du mit dem ich alle Nachrichten bekomme?

    Ja, das wäre auch ne Möglichkeit 🙂


  • Mod

    Lumpeh schrieb:

    Und welchen Hook? Bin grade nicht sicher, meinst du mit dem ich alle Nachrichten bekomme?

    Ja, das wäre auch ne Möglichkeit 🙂

    Schon mal gelesen welche Hooks es gibt?
    http://msdn.microsoft.com/en-us/library/ms644990(VS.85).aspx

    Wie wäre es mit WH_CALLWNDPROC.
    Damit bekommst Du exakt alle Nachrichten, die auch in die WndProc laufen.


Anmelden zum Antworten