Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: WinAPI ::  LL MouseHook manchmal plötzlich weg     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Lumpeh
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.08.2007
Beiträge: 124
Beitrag Lumpeh Mitglied 14:43:25 30.07.2012   Titel:   LL MouseHook manchmal plötzlich weg            Zitieren

Hallo!

Bei meinem Programm kommt es manchmal vor, aber auch nicht auf allen Rechnern (bei mir z.B. nie) dass plötzlich der WH_MOUSE_LL Hook aus der Chain genommen wird, ich bekomme dann keine Notifications mehr.

Ich hab schon eingebaut, dass er dann wieder neu gesetzt wird, allerdings passiert es dann jede Minute, dass ich plötzlich keine Notifications mehr bekomme. also es geht dann ne Minute, dann wieder nicht mehr. Kann das an meine MouseProc liegen?

Ich mache nämlich folgendes: um zu überprüfen, ob mein MouseHook noch geht, sende ich über mouse_event eine "WM_RBUTTONUP" mit dwExtraInfo, damit ich weiß, dass das meine Message war. Ich fange die dann in der MouseProc ab und schaue, ob die extraInfo meine ist, falls ja weiß ich, dass mein MouseHook noch geht. Nun rufe ich dann aber nicht CallNextHookEx auf, sondern "return 1", da ich ja nicht will dass "mein" RBUTTON_UP weite durchgeleitet wird, sonst wird ja ein KontextMenu aufpoppen beim user.. Kann es auf manchen System da ein problem geben, dass ich da diese Message nicht weiterlete und er dann irgendwann den Hook löscht? Komisch ist halt, dass es nur bei einigen Usern auftritt.

Vielleicht ein anderes Programm, das irgendwie Hook Chains ständig aufräumt? Virenscanner?

Ich hab das gefühl, dass es nur ab Windows 7 auftritt. Ich dachte schon es liegt an "LowLevelHooksTimeout" in der Registry, aber in meiner MouseProc wird nichts groß berechnet, und ein heraufsetzen dieses Wertes bringt auch nichts.


Oder gibt es vielleicht noch andere Möglichkeiten rauszufinden, ob ein gesetzter Hook noch aktiv ist?

Danke für die Hilfe.
kabbala_reloaded
Unregistrierter




Beitrag kabbala_reloaded Unregistrierter 14:48:32 30.07.2012   Titel:              Zitieren

Glaskugelalarm
(siehe FAQ)
Lumpeh
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.08.2007
Beiträge: 124
Beitrag Lumpeh Mitglied 11:32:39 31.07.2012   Titel:              Zitieren

Finde ich nix zu !!
Ich bin Matrix...
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.01.2012
Beiträge: 55
Beitrag Ich bin Matrix... Mitglied 14:11:21 31.07.2012   Titel:              Zitieren

Was kabbala damit sagen will... Poste bitte mal den Code des Hooks, bzw. irgendwelchen Code, der das Problem noch ausreichend thematisiert (FAQ).
Des weiteren kann ich von meinem Standpunkt aus nur erwähnen, dass mir sowas noch nie passiert ist, habe selbst schon diverse Hooks geschrieben und bei keinem trat ein solches/ähnliches Problem auf, aber ohne Quellcode kann ich weiter nichts sagen.
Lumpeh
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.08.2007
Beiträge: 124
Beitrag Lumpeh Mitglied 16:19:11 31.07.2012   Titel:              Zitieren

Ok, dann kommt mal ein wenig Code. Ich habe ein Java programm, welches über eine in C geschriebene DLL erweitert wurde. Und in einer DLL mach ich diese Hooks. Es wird einmal ein MouseHook und einmal ein Keyboard Hook gesetzt.
Ich poste mal die DLL mit den wichtigsten Funktionen.

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
HINSTANCE hInst = NULL;
JavaVM * jvm = NULL;
jobject hookObj = NULL;
jmethodID processKeyID = NULL;
jmethodID onHotKeyID = NULL;
DWORD hookThreadId = 0;
HHOOK hookHandle;
HHOOK hookHandleMouse;
 
extern "C" BOOL APIENTRY DllMain(HINSTANCE _hInst, DWORD reason, LPVOID reserved) {
    switch (reason) {
        case DLL_PROCESS_ATTACH:
            hInst = _hInst;
            break;
        default:
            break;
    }
 
    return TRUE;
 
}
 
//Wird aus Java aufgerufen, um die Hooks zu registrieren
JNIEXPORT void JNICALL Java_LowLevelHook_Hook_registerHook(JNIEnv * env, jobject obj) {
    setHook(env, obj); //ist die Funktion drunter
 
    MsgLoop();
 
 
    if (!UnhookWindowsHookEx(hookHandleMouse)) {
        printf("C++: Java_Hook_registerHook - Unhook failed\n");
    } else {
        printf("C++: Java_Hook_registerHook - Unhook successful\n");
    }
    if (!UnhookWindowsHookEx(hookHandle)) {
        printf("C++: Java_Hook_registerHook - Unhook Keyboard failed\n");
    } else {
        printf("C++: Java_Hook_registerHook - Unhook Keyboard successful\n");
    }
}
 
void setHook(JNIEnv *env, jobject obj) {
    hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInst, 0);
    hookHandleMouse = SetWindowsHookEx(WH_MOUSE_LL, MouseProc, hInst, 0);
 
    if (hookHandle == NULL || hookHandleMouse == NULL) {
        printf("C++: Java_Hook_registerHook - Hook failed!\n");
        printf("C++: Java_Mouse_Hook_registerHook - Hook failed!\n");
        return;
    } else {
        printf("C++: Java_Hook_registerHook - Hook successful\n");
        printf("C++: Java_Mouse_Hook_registerHook - Hook successful\n");
    }
 
    hookObj = env->NewGlobalRef(obj);
    jclass cls = env->GetObjectClass(hookObj);
    processKeyID = env->GetMethodID(cls, "processKey", "(IZ)I");
    onHotKeyID = env->GetMethodID(cls, "onHotKey", "(I)V");
    env->GetJavaVM(&jvm);
    hookThreadId = GetCurrentThreadId();
}
 
 
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) {
                case WM_MOUSEWHEEL:
                    env->CallIntMethod(hookObj, processKeyID, (int) m->mouseData, false);
                    break;
                case WM_LBUTTONUP:
                    env->CallVoidMethod(hookObj, onHotKeyID, -10, false);
                    break;
                case WM_RBUTTONUP:
 
/* Hier handelt es sich um die beschriebene Sache, dass ich selbst ein  MouseEvent alle 5 sec auslöse und es dann wieder "auffange" um zu schauen, ob der Hook noch läuft.
*/
 
                    int extra = (int) m->dwExtraInfo;
                    if (extra == -99) {
                        env->CallVoidMethod(hookObj, onHotKeyID, -99, false);
                        return 1;
                    }
                    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);
}



So, hoffentlich jetzt keine Glaskugel mehr. Wie gesagt, meine komplette Programmlogik ist in Java, ich brauch die Winapi wirklich nur um auf einige Dinge zu reagieren. Und ich versteh nicht, wieso manchmal (und nur bei einigen Usern) plötzlich die Notifikations aufhören. So als wäre der Hook auf einmal weg.


Zuletzt bearbeitet von Lumpeh am 16:22:01 31.07.2012, insgesamt 1-mal bearbeitet
c++.de :: WinAPI ::  LL MouseHook manchmal plötzlich weg   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.