Keyboard Hook Virtual Key Code Problem
-
Ja. Ich schließe mich mal an: "Lerne Grundlagen!"
Keys23 schrieb:
KBDLLHOOKSTRUCT *kbdStruct; _declspec(dllexport) LRESULT CALLBACK KBHookProc(int Code, WPARAM wParam, LPARAM lParam) { if (Code >= 0){ if((lParam & 0x80000000) == 0x00000000){keystrokes++;} kbdStruct = (KBDLLHOOKSTRUCT*)lParam;// Pfeilschriebweise }
Also hier belegest Du unter bestimmten Umständen kbdstruct vor.
Aber nicht immer. Die globale Variable bleibt also über Aufrufsgrenzen hinweg gespeichert. Ist zudem ein Zeigerund wird garantiert ungültig, wenn die Funktion verlassen wird.Keys23 schrieb:
if (Code == HC_ACTION){ key_vkcode1 = kbdStruct->vkCode; if(key_vkcode1 == VK_TAB){MessageBox(NULL,_T("") ,_T(""), MB_ICONEXCLAMATION | MB_OK);} }
So: Und hier benutzt Du nun evtl. einen Zeiger, der nciht mehr aktuell ist...
Fazit: Lerne Grundlagen!
-
Hey Martin, erstmal danke für eine Antwort, die auf das Thema eingeht - da lass ich mir dann auch gerne sagen, dass ich Grundlagen lernen soll - aber ich hoffe ihr helft hier auch Leuten, die gerade noch die Grundlagen lernen
Allgemein muss ich sagen: Mean Culpa, wenn man den Code falsch zusammenkopiert kann man natürlich auch nicht erwarten eine hilfreiche Antwort zu bekommen. Hier nochmal der Versuch den Code rauszukopieren ohne die Klammersetzung dabei zu verwurschteln:HHOOK hhook = NULL; unsigned long keystrokes = 0; DWORD key_vkcode1=0; int pcount = 0; HINSTANCE g_hInstance = NULL; KBDLLHOOKSTRUCT *kbdStruct; _declspec(dllexport) LRESULT CALLBACK KBHookProc(int Code, WPARAM wParam, LPARAM lParam) { if (Code >= 0){ if((lParam & 0x80000000) == 0x00000000){ keystrokes++; kbdStruct = (KBDLLHOOKSTRUCT*)lParam; key_vkcode1 = kbdStruct->vkCode; if(key_vkcode1 == VK_TAB){MessageBox(NULL,_T("TAB") ,_T("TAB"), MB_ICONEXCLAMATION | MB_OK);} } } return(CallNextHookEx(hhook, Code, wParam, lParam)); }
Meiner Meinung nach werden bei dieser hoffentlich korrekten Klammersetzung keine vorher nicht definierten Größen verwendet. Der zwar global deklarierte kbdStruct-Pointer kommt nur lokal in der Funktion, in der er dann definiert wird zum Einsatz. Ich sehe nicht wo Größen verwendet werden, die ggf ihre Gültigkeit bereits verloren haben.
Das Problem ist nach wie vor das in meinem Anfangspost geschilderte. Irgendwelche Ideen, wie ich den Fehler behebe?
-
Wahrscheinlich bekomme ich jetzt keine Antwort, weil schon wieder ein Anfängerfehler drin ist, oder ist es noch das selbe Argument, dass Martin schon gepostet hat? Dann bitte habt Nachsicht mit einem Anfänger und erklärt es noch einmal, aber ich denke mit der Klammersetzung jetzt dürfte es kein problem mehr sein!
Vielen Dank
-
bist du dir denn sicher dass in lParam ein Pointer zu einer KBDLLHOOKSTRUCT steckt? Ansonsten greifst du bei kbdStruct->vkCode sicher auf nicht definierten Speicher zu.
Außerdem für was kbdStruct und key_vkcode1 global machen? Die gehören beide in die Funktion.greetz KN4CK3R
-
Du hast auch sicher SetWindowsHookEx korrekt aufgerufen mit WH_KEYBOARD_LL und nicht nur mit WH_KEYBOARD?
Weiterhin: Was glaubst Du wohl was ein KeyBoardHook macht, wenn er eine MessageBox anzeigen soll? Dein System blockieren?
BTW1: Du hast nichts "falsch" zusammenkopiert: Du hast den Quatsch gemacht. Siehe erstes Posting.
BTW2: Ich bin bekannt dafür Fragen zu Hooks i.A. zu ignorieren, weil es meines Erachtens keine sinnreiche (nicht bösartige) Anwendungen gibt. Und bezeichnend dafür ist alleine schon, das 95% der Anfragen dazu dann auch noch von nicht registrierten Leuten kommt.
-
Hey vielen Dank! WH_KEYBOARD_LL ohne _LL war das Problem! Auch, wenn ich nicht genau verstehe warum - aber ich habe nie behauptet Profi zu sein
Ich arbeite mich halt gerade erst in das Thema Hooks etc ein.
@ Martin Keine Sorge, ich hab nicht vor ein Virus oder sowas zu programmieren auch, wenn ich deine Bedenken verstehen kann. Nicht alle Menschen auf der Welt sind schlecht und wenn Visual C++ gewisse Möglichkeiten bietet sollte man sie auch erlernen und einsetzen dürfen. Damit du beruhigt bist verrate ich dir für welche(nicht bösartige) Anwendungen
das ganze gut ist: Vielleicht kennt jemand esheep bzw. "screenmate"? Das ist so ein kleines Schaf, dass die ganze Zeit in Windows neben anderen laufenden Programmen rumrennt, mal was frisst etc. Das ganze soll bei mir auf jeden Fall auf Benutzereingaben reagieren, auch wenn es nicht den Fokus hat: Kopfschütteln bei Escape oder sowas ^^ Nagut ob das ganze jetzt sinnreich ist, ist eine andere Frage, aber Programmieren ist halt mein Hobby und nicht mein Job
Vielleicht habt ihr ja noch Tipps für FUnktionen, die man zur Umsetzung eines solchen Programmes nützlich sind.
Besten Dank keys23
-
Was lernen wir daraus!? Lerne Grundlagen!
-
Ja vielleicht ist das ein würdiger Abschlusskommentar ^^
Hätte nicht gedacht, dass ich hier sogar noch ne Lebensweisheit mit nach Hause nehmen kann
Ps. Hat vielleicht jemand noch einen Vorschläge womit man am besten die Grafik für das "screenmate" programm umsetzen kann?
LG
-
Wer im Leben immer alles von obenherab betrachtet sollte sich nicht wundern das er sich nicht mehr entwickeln kann! Dies ist doch ein Forum wo man Fragen stellen kann ohne ein Informatikstudium vorher zu absolvieren "Lern Grundlagen!".
Der nächste der mich fragt, wie er ein Leben retten soll jetzt grade dem werde
ich bei euch dann auch sagen "Hey lerne Grundlagen und lass die doch da liegen...!"
oder oder oder... Fragen sind nicht umsonst und hier wird keiner gezungen zu antworten. Ihr werdet feststellen das die Grundlagen manchmal die schlechtere Wahl ist so entsteht durch den Zufall nicht viele neue Ansätze um etwas zu programmieren. Oder meint hier jemand wir haben schon alle ultimativen Variabeln und Funktionen geschrieben. Man man man seit ihr süß!Gruß
-
Keys23 schrieb:
Hey vielen Dank! WH_KEYBOARD_LL ohne _LL war das Problem!
http://msdn.microsoft.com/en-us/library/windows/desktop/ms632589(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644959(v=vs.85).aspx
WH_KEYBOARD_LL
The WH_KEYBOARD_LL hook enables you to monitor keyboard input events about to be posted in a thread input queue.
For more information, see the LowLevelKeyboardProc callback function.
WH_KEYBOARDThe WH_KEYBOARD hook enables an application to monitor message traffic for WM_KEYDOWN and WM_KEYUP messages about to be returned by the GetMessage or PeekMessage function. You can use the WH_KEYBOARD hook to monitor keyboard input posted to a message queue.
WH_KEYBOARD_LL fängt Tastatureingaben Global ab. WH_KEYBOARD eignet sich dafür wenn du z.b. nur die Tastatureingaben innerhalb einer bestimmten Anwendung abfangen willst.
Keys23 schrieb:
Ps. Hat vielleicht jemand noch einen Vorschläge womit man am besten die Grafik für das "screenmate" programm umsetzen kann?
LGErklär vielleicht mal in einem neuen Thread GENAU was du vorhast, so kann man dir sonst schlecht helfen.
Und jetzt hab ich eine Frage?
Was heisst "LG"?^^ (Das hast du am Ende von deinem Post geschrieben Keys23)
LG = Lern Grundlagen?^^
Ich hab kp was es heisst.^^