KeyboardHook Programmfokus
-
Danke Fencer für die bisherige Hilfe
Funktioniert soweit nun alles, wenn ich nun die Daten an mein Hauptprogramm übergebe während das Hauptprogramm aktiv ist (Taskleiste -> ausgewählt), bearbeitet es die Daten. Wenn ich aber nun irgendwo anders ne Taste drücke, solange das Hauptprogramm nicht aktiv ist wird nichts bearbeitet, was ja auch logisch ist!
Hat einer eine Idee wie ich mein Hauptprogramm dazu bringe auch zu arbeiten während ich n anderes Programm aktiv habe, ohne die Verarbeitung in der Dll zu machen? Ist das überhaupt möglich?
-
Gern geschehen

vllt. wenn du beim SetWindowsHookEx mal WH_KEYBOARD_LL(siehe msdn) versuchst. ist aber nur ne vermutung.
-
muss ins shared datensegment, zeig dein code.
-
//Shared-Data-Segment #pragma data_seg("Shared") HHOOK hook = NULL; // Handle Hook (als "shared") #pragma data_seg() #pragma comment (linker, "/section:Shared,RWS") //linker directivewas muss sonst denn noch da rein?
-
die process id natürlich, ist doch sonnenklar wie schwarzbrot.
-
Ok is mir nun klar warum die da rein muss.
Ich übergebe der Dll die ThreadID meines Hauptprogrammes mit der InstallHook-Funktion und speichere sie in myAPP.
So sieht mein shared nun aus:
//Dll.c //Shared data segment #pragma data_seg("Shared") HHOOK hook = NULL; // HookHandle (als "shared" Deklariert) DWORD myApp; //ThreadId des Programmes an das die Daten gesendet werden sollen #pragma data_seg()Die Callback-Funktion wird immer ordnungsgemäss aufgerufen:
//Dll.c LRESULT CALLBACK KeyboardProc (int ncode, WPARAM wParam, LPARAM lParam) { if(ncode>=0) { if((lParam & 0xE0000000) == 0x00000000) //Key filter { // Beep(1700,100); PostThreadMessage(myApp, WM_USER+100, wParam, lParam); //Daten an Hauptprogramm senden } } return ( CallNextHookEx(hook,ncode,wParam,lParam) ); //Nächster Hook in der Hook-Kette aufrufen }So sieht meine Hauptschleife im Hauptprogramm nun aus die die Daten erhalten soll:
//hauptprogramm.c while (msg.wParam != 27) //Austrittsbedinung erfüllt bei drücken von Esc { GetMessage(&msg, NULL, 0, 0); if(msg.message == WM_USER+100) { KeyStrokeProcessing(msg.wParam, msg.lParam); //Daten verarbeiten } DispatchMessage(&msg); //MSG verteilen }Wenn ich mein Hauptprogramm aktiv habe kriegt es die Daten, sobald ich aber n anderes Programm aktiviere erhält es die Daten nicht mehr, die Callback-Funktion in der Dll wird aber aufgerufen, an was kann das liegen?
mfg elDorado
-
Habe ungefähr das selbe Problem und bis jetzt noch keine Lösung gefunden, bleib aber dran.
-
hab bei anderen projekten gesehen das die vor der PostMessage in der dll zuerst das handle des fensters mithilfe von FindWindow suchen und dann direkt dahin schicken. veruch doch mal n fenster zu erstellen, es dann aber nicht anzuzeigen, da ich mal annehme das dein programm ja eigentlich kein gui haben soll, mehr fällt mir dazu au ned ein.
-
get last error

-
was soll ich nu mit der Antwort anfangen?