Ich habe eigentlich alle Varianten ausprobiert, so oft wie bei diesem Projekt musste ich noch nie die Hardware-Resettaste drücken.
Die
dll Variante habe ich aufgegeben, da sie unter Delphi wohl nicht zum Laufen zu bekommen ist und bin zu einem JournalHook gewechselt.
Das scheint problemlos zu funktionieren, auch der vorher mehrfach gekommene Event kommt jetzt richtig.
Hier die Lösung:
Delphi-Quellcode:
function JournalProc(Code, wParam: Integer; var EventStrut: TEventMsg): Integer; stdcall;
var
Char1: PChar;
begin
Result := CallNextHookEx(JHook, Code, wParam, Longint(@EventStrut));
if Code < 0 then Exit;
if Code = HC_SYSMODALON then Exit;
if Code = HC_ACTION then
begin
if EventStrut.message = 523 then
begin
EventStrut.message := 0;
inc(GongBums);
end;
end;
end;
procedure TFrmAudioCtrl.StartJour;
begin
if FHookStarted then
begin
ShowMessage('Mouse is already being Journaled, can not restart');
Exit;
end;
JHook := SetWindowsHookEx(WH_JOURNALRECORD, @JournalProc, hInstance, 0);
{SetWindowsHookEx starts the Hook}
if JHook > 0 then
begin
FHookStarted := True;
end
else
ShowMessage('No Journal Hook availible');
end;
procedure TFrmAudioCtrl.StopJour;
begin
FHookStarted := False;
UnhookWindowsHookEx(JHook);
JHook := 0;
end;
Interessenhalber habe ich die Hooklösung in externer
dll mal in C# und VS2010 ausprobiert.
Dort funktionierte es wie gewünscht.
Da ich in meinem Legacy Projekt keinen Code mischen will, bin ich auf die beschriebene Lösung ausgewichen.
Peter