Ik heb een programmatje weten te schrijven dat je keyboard hookt... Dit programma werkt perfect, en hij logt ook alle knoppen die de gebruiker intoetst, in elk willekeurig scherm. Het is geschreven door gebruik te maken van een HOOK_DLL, de belangrijkste code staat hieronder weergeven:
Deze code en de "gecommente" code werken perfect. In de file wParam.bwr staan alle wParam parameters, zelfde geld voor de lParam. In de tekstfile KLText.bwr komen alle letters te staan (1x, ook als de knop word ingehouden).
Nu kan ik de paramfile weer uitlezen met de volgende code:
En dan komt nu het probleem:
Hoe kan ik nu deze tekst files weer zo "afspelen" dat ze het keyboard weer nabootsen. Ik was van mening dat ik dit kon doen met SendMessage, maar dit kan niet, of ik doe het verkeerd. Wat hij echter wel doet met SendMessage is, als ik het commando WM_CHAR gebruik, alle letters en cijfers op de juiste manier op het scherm tonen. Maar alle letters komen dubbel op het scherm te staan en de toetsencombinaties zoals CTRL+HOME en CTRL+A en bijvoorbeeld alle F-toetsen werken op deze manier niet.
Is er een andere functie die ik kan/moet gebruiken, of doe ik iets verkeerd?
Alvast bedankt voor jullie hulp
C++:
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
| int __stdcall GlobalKeyBoardHook(int code,WPARAM wParam, LPARAM lParam) { if (code<0) //if code is <0 your keyboard hook should always run CallNextHookEx instantly and return(CallNextHookEx(CurrentHook,code,wParam,lParam)); //then return the value from it. //if ((wParam>=65) && (wParam<=90)) { KeyArray[KeyArrayPtr]=wParam; KeyArrayPtr=KeyArrayPtr+1; //if (KeyArrayPtr > sizeof(KeyArray)) { FILE *wParamFile, *lParamFile, *KLTextFile; wParamFile = fopen("c:\\wParam.bwr", "a+"); lParamFile = fopen("c:\\lParam.bwr", "a+"); fwrite(&wParam, sizeof(wParam), 1, wParamFile); fwrite(&lParam, sizeof(lParam), 1, lParamFile); fwrite("*", sizeof("*"), 1, lParamFile); int KeyUp = (lParam & 0x80000000 ); if ((wParam>=65) && (wParam<=90) && (KeyUp!=0) ) { KLTextFile = fopen("c:\\KLText.bwr", "a+"); fwrite(&wParam, 1, 1, KLTextFile); fclose(KLTextFile); } fclose(wParamFile); fclose(lParamFile); KeyArrayPtr=0; } } /*unsigned char state [256] ; GetKeyboardState(state); FILE *StateFile; StateFile = fopen("c:\\State.bwr", "a+"); fwrite(&state, sizeof(state), 1, StateFile); fclose(StateFile);*/ CallNextHookEx(CurrentHook,code,wParam,lParam); //call the next hook proc if there is one return 0; //if GlobalKeyBoardHook returns a non-zero value, the window that should get //the keyboard message doesnt get it. } |
Deze code en de "gecommente" code werken perfect. In de file wParam.bwr staan alle wParam parameters, zelfde geld voor de lParam. In de tekstfile KLText.bwr komen alle letters te staan (1x, ook als de knop word ingehouden).
Nu kan ik de paramfile weer uitlezen met de volgende code:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| WPARAM wParam; LPARAM lParam; FILE *wParamFile, *lParamFile; wParamFile = fopen("c:\\wParam.bwr", "r"); lParamFile = fopen("c:\\lParam.bwr", "r"); fseek(wParamFile, 0, SEEK_SET); fseek(lParamFile, 0, SEEK_SET); while(!feof(wParamFile) && !feof(lParamFile)) { fread(&wParam,sizeof(wParam),1,wParamFile); fread(&lParam,sizeof(lParam),1,lParamFile); } fclose(wParamFile); fclose(lParamFile); |
En dan komt nu het probleem:
Hoe kan ik nu deze tekst files weer zo "afspelen" dat ze het keyboard weer nabootsen. Ik was van mening dat ik dit kon doen met SendMessage, maar dit kan niet, of ik doe het verkeerd. Wat hij echter wel doet met SendMessage is, als ik het commando WM_CHAR gebruik, alle letters en cijfers op de juiste manier op het scherm tonen. Maar alle letters komen dubbel op het scherm te staan en de toetsencombinaties zoals CTRL+HOME en CTRL+A en bijvoorbeeld alle F-toetsen werken op deze manier niet.
Is er een andere functie die ik kan/moet gebruiken, of doe ik iets verkeerd?
Alvast bedankt voor jullie hulp