Autor |
Beitrag |
RFZ
      
Beiträge: 137
WinME, WinXP, Win2k*, Win98*, Win95*, Win3.11*, DOS* (*VMware)
D4 Prof
|
Verfasst: Mo 29.07.02 11:10
Moin, also, weil ich nicht genau weiss wo das Problem liegt, weiss ich auch nicht in welches Forum ich posten soll
Also, ich hab ein F-Tasten Prog (spielt Sounds beim Drücken der F-Tasten) gemacht. Es funktioniert alles super, nur bekomme ich sehr selten einen 'Runtime error 216 at 00004D92', und das nicht wenn das Programm gerade arbeitet, sondern wenn ich z.B. ein Explorerfenster schliesse (meisstens). Ich denke dass es an der DLL liegt, aber ich weiss nicht genau wo, da ich deren inhalt hauptsächlich kopiert habe, und davon (noch *g*) wenig verstehe.
Hier mal die DLL:
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:
| library hook; uses Windows, Messages, mmsystem, dialogs, registry, SysUtils; var KBHookHandle: Cardinal = 0; WindowHandle: Cardinal = 0; reg: TReginifile; path: string; fx: boolean;
function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin case nCode < 0 of FALSE: { in wParam steckt der virtuelle Tastaturcode } begin
fx:=false; if path='' then begin reg:=TReginifile.Create(''); reg.RootKey:=HKey_Current_User; path:=reg.ReadString('Software\GIGA F-Tasten','path',''); reg.CloseKey; end;
if wParam = VK_F1 then fx:=true; if wParam = VK_F2 then fx:=true; if wParam = VK_F3 then fx:=true; if wParam = VK_F4 then fx:=true; if wParam = VK_F5 then fx:=true; if wParam = VK_F6 then fx:=true; if wParam = VK_F7 then fx:=true; if wParam = VK_F8 then fx:=true; if wParam = VK_F9 then fx:=true; if wParam = VK_F10 then fx:=true; if wParam = VK_F11 then fx:=true; if wParam = VK_F12 then fx:=true;
if (lParam < 1) then begin if wParam = VK_F1 then playsound(pchar(path+'sounds/f1.wav'),0, SND_ASYNC); if wParam = VK_F2 then playsound(pchar(path+'sounds/f2.wav'),0, SND_ASYNC); if wParam = VK_F3 then playsound(pchar(path+'sounds/f3.wav'),0, SND_ASYNC); if wParam = VK_F4 then playsound(pchar(path+'sounds/f4.wav'),0, SND_ASYNC); if wParam = VK_F5 then playsound(pchar(path+'sounds/f5.wav'),0, SND_ASYNC); if wParam = VK_F6 then playsound(pchar(path+'sounds/f6.wav'),0, SND_ASYNC); if wParam = VK_F7 then playsound(pchar(path+'sounds/f7.wav'),0, SND_ASYNC); if wParam = VK_F8 then playsound(pchar(path+'sounds/f8.wav'),0, SND_ASYNC); if wParam = VK_F9 then playsound(pchar(path+'sounds/f9.wav'),0, SND_ASYNC); if wParam = VK_F10 then playsound(pchar(path+'sounds/f10.wav'),0, SND_ASYNC); if wParam = VK_F11 then playsound(pchar(path+'sounds/f11.wav'),0, SND_ASYNC); if wParam = VK_F12 then playsound(pchar(path+'sounds/f12.wav'),0, SND_ASYNC);
end;
end;
end; { wichtig: Hook weiterreichen } if fx=false then Result := CallNextHookEx(KBHookHandle, nCode, wParam, lParam); if fx=true then Result := 2; //Meine Eigenkreation damit die eigentliche Funktion der F-Taste ignoriert wird
end;
function InstallHook(Hwnd: Cardinal): Boolean; stdcall; var kbh: Boolean; begin kbh := FALSE; if KBHookHandle = 0 then begin { Hook installieren & Handle sichern } KBHookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, hInstance, 0); kbh := TRUE; end; { Fensterhandle sichern } WindowHandle := Hwnd; { Returnwert von SetWindowsHookEx, als Rückgabewert der Funktion zurückgeben } Result := kbh; end;
function UninstallHook: Boolean; stdcall; var kbh: Boolean; begin kbh := FALSE; { Hook deinstallieren } kbh := UnhookWindowsHookEx(KBHookHandle); { Handle zurück setzen } KBHookHandle := 0; { Rückgabe } result := kbh; end; exports InstallHook, UninstallHook; end. |
ich hoffe ihr könnt mir da helfen... Wer sich selbst überzeugen will, kann das Programm hier runterladen:
GIGA F-Tasten
cu RFZ
|
|
aogwaba
      
Beiträge: 109
|
Verfasst: Mo 29.07.02 18:29
In einer HOOK Function, muss 'result' auf eine gültige andere Hook-Function verweisen, oder 0 sein.
Also result:=2 geht nicht.
cu
waba
|
|
RFZ 
      
Beiträge: 137
WinME, WinXP, Win2k*, Win98*, Win95*, Win3.11*, DOS* (*VMware)
D4 Prof
|
Verfasst: Mo 29.07.02 18:33
Titel: F-Tasten
Abgesehn davon dass ich davon nix verstehe, funktioniert das doch eigentlich. Ich hatte het den Fehler einmal, und das Programm läuft seit heut morgen durchgehend! Aber trotzdem probier ich's mal mit 0.
cu RFZ
--------------------------------------------------
Nachtrag... Wenn ich es auf 0 setze, werden auch wieder nach dem Sound die normalen Funktionen ausgeführt, also F1=Hilfe, F5=Aktualisieren, usw. das soll nicht passieren!
cu RFZ
|
|
aogwaba
      
Beiträge: 109
|
Verfasst: Mo 29.07.02 18:48
Mal so ausgedrückt:
Bei Hook's funkst du Windows bei seiner Ereignissgehandlung
dazwischen, wenn die Hookkette, abreisst, kann Win ziemlich
durcheinander kommen.
cu
waba
|
|
RFZ 
      
Beiträge: 137
WinME, WinXP, Win2k*, Win98*, Win95*, Win3.11*, DOS* (*VMware)
D4 Prof
|
Verfasst: Mo 29.07.02 19:09
Titel: F-Tasten
Dann sag mir doch bitte, was ich senden kann, damit kein fehler auftritt, aber auch keine weitere Funktion ausgeführt wird. Andere F-Tasten Programme können das ja auch  Dann frag ich mich aber noch wieso ich locker tausendmal die Tasten drücken kann, und es passiert nix, dann wenn ich z.B. ein fenster schliesse kommt der Runtime Error, welcher sich nicht wegklicken lässt, das Programm funktioniert aber immernoch!
cu RFZ
|
|
aogwaba
      
Beiträge: 109
|
Verfasst: Mo 29.07.02 20:00
Wenn du dich in die Hookkette eingeklinkt hast, wird bei jedem Event (in deinem Fall Keyboard) deine registrierte Function angesprungen.
Bei der kannst du weder die Parameter noch den Rückgabewert ändern, du kannst höchstens registrieren das die Taste gedrückt wurde(globales Flag oä.) und das dann später auswerten(Extra Thread oä.).
Da man keine langwierigen Operationen in Hooks ausführen soll.
Warum benutz du eigentlich Hook's?
cu
waba
|
|
RFZ 
      
Beiträge: 137
WinME, WinXP, Win2k*, Win98*, Win95*, Win3.11*, DOS* (*VMware)
D4 Prof
|
Verfasst: Mo 29.07.02 20:30
Wie ich oben bereits gesagt hab, ist der meisste Teil Kopiert, weil ich davon eh nix verstehe  Ich hab nur den teil mit den Sounds eingebaut...
Wenn du einen besseren Vorschlag hast, bitte. Es ist aber wichtig, dass beim Drücken der F-Tasten dann nur noch der Sound gespielt wird, und weiter nichts!
cu RFZ
|
|
aogwaba
      
Beiträge: 109
|
Verfasst: Mo 29.07.02 21:36
Dann benutze doch in der HookFunction eine PostMessage, die
eine Nachricht an dein Programm schickt.
(Ausserdem solltest du 'reg', in der HookRoutine wieder freigeben)
cu
waba
|
|
RFZ 
      
Beiträge: 137
WinME, WinXP, Win2k*, Win98*, Win95*, Win3.11*, DOS* (*VMware)
D4 Prof
|
Verfasst: Mo 29.07.02 21:41
Hmm, ich hab von Hook und anderem was ausserhalb meiner exe abläuft keine Ahnung :) Vielleicht könntest du mir ja mal ein kleines beispiel machen? *liebfrag*
Aber konkret hast du mir immernoch nicht beantwortet, ob dann der Sound die einzige Funktion der Taste bleibt, oder ob das übliche auch aufgerufen wird...
cu RFZ
|
|
cbs
      
Beiträge: 207
Erhaltene Danke: 1
|
Verfasst: Mo 29.07.02 21:58
Tag auch
hier ist nen Hook Tut: Mouse- und Tastaturhooks
|
|
RFZ 
      
Beiträge: 137
WinME, WinXP, Win2k*, Win98*, Win95*, Win3.11*, DOS* (*VMware)
D4 Prof
|
Verfasst: Di 30.07.02 14:07
Schön, nur hilft mir das nicht... Denn genau das, was ich machen muss, wird dort nicht angesprochen! Im Gegenteil, es steht sogar da, dass es extrem kompliziert ist und viele Probleme bereitet. Ich muss ja den Ausgabewert verändern, damit eben nicht mehr die normale Funktion (F1 = Hilfe) ausgeführt wird. Und da scheint ja auch das Problem zu liegen, also sagt mir doch einfach wie ich den Rückgabewert ändern soll (ich hab einfach 2 gemacht, fragt nicht warum  ) damit das funktioniert.
cu RFZ
|
|
|