Autor Beitrag
RFZ
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137

WinME, WinXP, Win2k*, Win98*, Win95*, Win3.11*, DOS* (*VMware)
D4 Prof
BeitragVerfasst: 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:

ausblenden volle Höhe Quelltext
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137

WinME, WinXP, Win2k*, Win98*, Win95*, Win3.11*, DOS* (*VMware)
D4 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137

WinME, WinXP, Win2k*, Win98*, Win95*, Win3.11*, DOS* (*VMware)
D4 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137

WinME, WinXP, Win2k*, Win98*, Win95*, Win3.11*, DOS* (*VMware)
D4 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137

WinME, WinXP, Win2k*, Win98*, Win95*, Win3.11*, DOS* (*VMware)
D4 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207
Erhaltene Danke: 1



BeitragVerfasst: Mo 29.07.02 21:58 
Tag auch

hier ist nen Hook Tut: Mouse- und Tastaturhooks
RFZ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137

WinME, WinXP, Win2k*, Win98*, Win95*, Win3.11*, DOS* (*VMware)
D4 Prof
BeitragVerfasst: 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