Der MMF Übertragungsweg funktioniert nun.
Ein Problem habe ich noch bei der Verwerfung des Mausklicks. Ich verstehe nicht ganz, wie das getan werden soll. WM_NULL ist ja scheinbar falsch, aber was soll dann als Result zurückgegeben werden?
Ausschnitt Anwendung:
Delphi-Quellcode:
procedure TForm1.WndProc(
var Message:TMessage);
var
difference: DWORD;
begin
if Message.Msg = WM_ANYKEY_PRESSED
then
begin
inherited WndProc(
Message);
// Eine Taste wurde gedrückt, wir merken uns den Zeitpunkt
last_keyboard_input := GetTickCount();
end
else if Message.Msg = WM_LMOUSECLK_CONFIRM
then
begin
difference := GetTickCount() - last_keyboard_input;
if (difference <= sperrdauer)
then
begin
// Ereignis verwerfen, da linke Maustaste innerhalb
// der Sperrzeit gedrückt wurde
// Der DLL melden, dass das Hook die Mausnachricht verwerfen soll.
Message.Result := 10;
// Debug: Zeigen, dass etwas gesperrt wurde
label2.Caption := '
Sperrung: ' + IntToStr(GetTickCount());
end
else
begin
// Sonstiges Mausereignis bzw. Mausklick außerhalb
// der Sperrzeit erlauben
inherited WndProc(
Message);
end;
end
else
begin
// Andere Ereignisse durchlassen
inherited WndProc(
Message);
end;
end;
Ausschnitt
DLL:
Delphi-Quellcode:
function MouseHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
res: Cardinal;
begin
Result := CallNextHookEx(Mouse_HookHandle, nCode, wParam, lParam);
case nCode < 0 of
TRUE: exit;
FALSE:
begin
// Handelt es sich um einen linken Mausklick?
if (wParam = WM_LBUTTONDBLCLK) or
(wParam = WM_LBUTTONDOWN) or
(wParam = WM_LBUTTONUP) then
begin
// Dann Anwendung fragen, ob das OK ist
SendMessageTimeOut(TargetHandle, WM_LMOUSECLK_CONFIRM, wParam, lParam,
SMTO_ABORTIFHUNG or SMTO_BLOCK, MsgTimeOut, res);
if res = 10 then
begin
// Mausklick verwerfen
Result := WM_NULL; // ToDo: Funktioniert nicht...
end;
end;
end;
end;
end;
Die "10" ist die Rückantwort, die sagen soll, dass das Mausereignis verworfen werden soll.