SetWindowsHookEx mit Thread
-
Guten Morgen und Guten Rutsch!
Ich bin gerade dabei mir ein Programm zu schreiben, welches meine Tastenanschläge zählen soll. Für den zurückgelegten Weg der Maus gibt es ja z.B. MouseMeter.
Für die Tastatur habe ich sowas noch nicht gesehen.In der MSDN wird beschrieben, das man SetWindowsHookEx auch mit einem Thread nutzen kann, welcher dem Prozess angehören soll.
http://msdn.microsoft.com/en-us/library/ms644990Nun habe ich meinen Code soweit geschrieben, aber es läuft nicht so wie geplant.
Es steht nirgends beschrieben, ob der Thread laufen soll und wie er laufen soll, weswegen ich erstmal eine while (true) - Schleife einbaute.#include <iostream> #include <windows.h> using namespace std; void MyThread(); LRESULT WINAPI KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam); int main() { DWORD threadid; HANDLE thread; thread= CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyThread,0,0,&threadid); SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,NULL,threadid); WaitForSingleObject(thread,INFINITE); CloseHandle(thread); cout << "Hello world!" << endl; return 0; } void MyThread() { while (true) { } } LRESULT WINAPI KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode < 0) return CallNextHookEx(0, nCode, wParam, lParam); cout << nCode; return CallNextHookEx(0, nCode, wParam, lParam); }
Vielleicht hat der eine oder andere eine Idee und kann mir weiterhelfen.
Gruß
-
Was hat das mit Standard-C++ zu tun? Bitte die wichtigen Threads vor dem Posten lesen. Danke.
-
Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ (auch C++0x, bzw. C++11) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Entschuldigung an pumuckl.
Ich war wohl etwas zu schnellNicht destotrotz habe ich mein Problem gerade gelöst:
Ich erzeuge nicht einfach einen Thread, sondern nutze GetMessage(), welches einen Dauerhaften Loop erzeugt.#include <iostream> #include <windows.h> #include <fstream> using namespace std; LRESULT WINAPI LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam); long long count; fstream file; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInst, LPTSTR lpCmdLine, int nShowCmd) { count=0; HHOOK hook; MSG message; file.open("counter.txt",ios::out|ios::trunc); hook=SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)LowLevelKeyboardProc,NULL, 0); while(GetMessage(&message, NULL, 0, 0) != 0) { } UnhookWindowsHookEx(hook); return 0; } LRESULT WINAPI LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { if(wParam==WM_KEYDOWN) { count++; file.seekp(0); file<<count; } return CallNextHookEx(0, nCode, wParam, lParam); }
Gruß
-
Hallo, ich beschäftige mich im moment auch etwas mit Hooks normale Hooks die nicht Systemweit sind funktionieren bei mir.
Aber bei den lowlevel Hooks bekomme ich folgendes bei GetLastError(); zurück:
ERROR_HOOK_NEEDS_HMOD
1428 (0x594)
Cannot set nonlocal hook without a module handle.MSDN error codes:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms681385(v=vs.85).aspxAber was für ein Module handle in der MSDN steht nichts davon:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644959(v=vs.85).aspx#wh_keyboard_llhook
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644985(v=vs.85).aspx
-
Hallo ich hab ein gutes Beispiel gefunden jetzt weiss ich auch warum es bei mir nicht ging.^^
Quelle: http://cboard.cprogramming.com/windows-programming/119909-setwindowshookex-lowlevelmouseproc.html
#define _CRT_SECURE_NO_WARNINGS #include <windows.h> #include <iostream> #include <cstdio> using namespace std; HHOOK g_Hook; HANDLE g_evExit; LRESULT CALLBACK LowLevelMouseProc (int code, WPARAM wParam, LPARAM lParam) { if (code == HC_ACTION) { const char *msg; char msg_buff[128]; switch (wParam) { case WM_LBUTTONDOWN: msg = "WM_LBUTTONDOWN"; break; case WM_LBUTTONUP: msg = "WM_LBUTTONUP"; break; case WM_MOUSEMOVE: msg = "WM_MOUSEMOVE"; break; case WM_MOUSEWHEEL: msg = "WM_MOUSEWHEEL"; break; case WM_MOUSEHWHEEL: msg = "WM_MOUSEHWHEEL"; break; case WM_RBUTTONDOWN: msg = "WM_RBUTTONDOWN"; break; case WM_RBUTTONUP: msg = "WM_RBUTTONUP"; break; default: sprintf(msg_buff, "Unknown msg: %u", wParam); msg = msg_buff; break; }//switch const MSLLHOOKSTRUCT *p = reinterpret_cast<const MSLLHOOKSTRUCT*>(lParam); cout << msg << " - [" << p->pt.x << ',' << p->pt.y << ']' << endl; static bool left_down = false; static bool right_down = false; switch (wParam) { case WM_LBUTTONDOWN: left_down = true; break; case WM_LBUTTONUP: left_down = false; break; case WM_RBUTTONDOWN: right_down = true; break; case WM_RBUTTONUP: right_down = false; break; }//switch if (left_down && right_down) SetEvent(g_evExit); }//if return CallNextHookEx(g_Hook, code, wParam, lParam); }//LowLevelMouseProc int main() { g_evExit = CreateEvent(0, TRUE, FALSE, 0); if (!g_evExit) { cerr << "CreateEvent failed, le = " << GetLastError() << endl; return 1; }//if g_Hook = SetWindowsHookEx(WH_MOUSE_LL, &LowLevelMouseProc, GetModuleHandle(0), 0); if (!g_Hook) { cerr << "SetWindowsHookEx() failed, le = " << GetLastError() << endl; return 1; }//if cout << "Press both left and right mouse buttons to exit..." << endl; MSG msg; DWORD status; while (1) { while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessage(&msg); status = MsgWaitForMultipleObjects(1, &g_evExit, FALSE, INFINITE, QS_ALLINPUT); if (status == (WAIT_OBJECT_0 + 1)) { // there are messages to process, eat em up continue; }//if else { // assume g_evExit is signaled break; }//else }//while cout << "Exiting..." << endl; UnhookWindowsHookEx(g_Hook); CloseHandle(g_evExit); return 0; }//main