| Autor |
Nachricht |
Lumpeh
Mitglied
Benutzerprofil
Anmeldungsdatum: 07.08.2007
Beiträge: 124
|
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
|
kabbala_reloaded Unregistrierter
14:48:32 30.07.2012 Titel: |
|
Zitieren |
Glaskugelalarm
(siehe FAQ) |
|
|
|
 |
Lumpeh
Mitglied
Benutzerprofil
Anmeldungsdatum: 07.08.2007
Beiträge: 124
|
Lumpeh Mitglied
11:32:39 31.07.2012 Titel: |
|
Zitieren |
|
 |
Ich bin Matrix...
Mitglied
Benutzerprofil
Anmeldungsdatum: 19.01.2012
Beiträge: 55
|
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
|
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 |
|
 |
|
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.
|
|
|
|
|