Einzelnen Beitrag anzeigen

blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#26

Re: Maus sperren während Tastatureingabe

  Alt 18. Nov 2008, 23:02
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.
Daniel Marschall
  Mit Zitat antworten Zitat