AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Maus sperren während Tastatureingabe
Thema durchsuchen
Ansicht
Themen-Optionen

Maus sperren während Tastatureingabe

Ein Thema von blackdrake · begonnen am 17. Nov 2008 · letzter Beitrag vom 8. Apr 2010
Antwort Antwort
Seite 3 von 6     123 45     Letzte »    
blackdrake

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

Re: Maus sperren während Tastatureingabe

  Alt 18. Nov 2008, 18:50
Ich habe gerade wieder etwas mit der Mouse+Keyboard-Hook-DLL probiert.

Kann man das auch irgendwie so machen, dass auf die Hook-Message mit "0" geantwortet wird, wenn das Mausereignis gelöscht werden soll?

Delphi-Quellcode:
procedure TForm1.WndProc(var Message:TMessage);
var
  difference: DWORD;
begin
  if Message.Msg = WM_KEYBHOOKMSG then
  begin
    inherited WndProc(Message);

    // Eine Taste wurde gedrückt, wir merken uns den Zeitpunkt
    last_keyboard_input := GetTickCount();

    // ToDo: Tasten wie Strg dürfen nicht mitgezählt werden,
    // da diese in Kombination mit der Maustaste OK sind!
  end
  else if Message.Msg = WM_MOUSEHOOKMSG then
  begin
    difference := GetTickCount() - last_keyboard_input;

    if (difference <= sperrdauer) and
       ((Message.wParam = WM_LBUTTONDBLCLK) or
        (Message.wParam = WM_LBUTTONDOWN) or
        (Message.wParam = WM_LBUTTONUP)) then
    begin
      // Ereignis verwerfen, da linke Maustaste innerhalb
      // der Sperrzeit gedrückt wurde

      // Something ToDo ?
      Message.Result := 0;

      // 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;
In der DLL:

Delphi-Quellcode:
function MouseHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  Result := CallNextHookEx(Mouse_HookHandle, nCode, wParam, lParam);
  case nCode < 0 of
    TRUE: exit;
    FALSE:
      begin
        setprop(WindowHandle, 'mous_ncode', nCode);
        setprop(WindowHandle, 'mous_hwnd', PMOUSEHOOKSTRUCT(lParam)^.hwnd);
        setprop(WindowHandle, 'mous_hitt', PMOUSEHOOKSTRUCT(lParam)^.wHitTestCode);
        setprop(WindowHandle, 'mous_xpos', PMOUSEHOOKSTRUCT(lParam)^.pt.x);
        setprop(WindowHandle, 'mous_ypos', PMOUSEHOOKSTRUCT(lParam)^.pt.y);
        if SendMessage(HWND_BROADCAST, WM_MOUSEHOOKMSG, wParam, lParam) = 0 then
        begin
          result := WM_NULL; // Funktioniert das?
        end;
      end;
  end;
end;
Würde soetwas funktionieren oder ist es der falsche Weg? Ich komme mit der Windows API einfach nicht klar...
Daniel Marschall
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#22

Re: Maus sperren während Tastatureingabe

  Alt 18. Nov 2008, 19:29
Wenn du deine Nachricht an HWND_BROADCAST schickst, kannst du kein Ergebnis erhalten, da die Nachricht an alle Top-Level-Fenster geschickt wird. Deshalb habe ich auch die MMF vorgeschlagen.

Zum Verwerfen der Nachricht zitiere ich mal die MSDN Library:
Zitat:
If the hook procedure processed the message, it may return a nonzero value to prevent the system from passing the message to the target window procedure.
Der Rückgabewert ist also keine Nachrichtenkonstante. WM_NULL = 0 ist zum Verwerfen gerade ungeeignet.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
blackdrake

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

Re: Maus sperren während Tastatureingabe

  Alt 18. Nov 2008, 19:36
Könntest du bzgl. des MMF ein kleines Beispiel posten, sofern es keine Umstände macht?
Daniel Marschall
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#24

Re: Maus sperren während Tastatureingabe

  Alt 18. Nov 2008, 19:48
Kein Thema.
Delphi-Quellcode:
//Anwendung
hMapping := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, 4, 'The mapping of the black drake');
pView := MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, 0, 0);

PCardinal(pView)^ := Handle;

//Aufräumen bei Programmende
UnmapViewOfFile(pView);
CloseHandle(hMapping);


//In der DLL
hMapping := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, 'THe mapping of the black drake');
pView := MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);

TargetHandle := PCardinal(pView)^;

//Aufräumarbeiten bei DLL_PROCESS_DETACH
UnmapViewOfFile(pView);
CloseHandle(hMapping);
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
blackdrake

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

Re: Maus sperren während Tastatureingabe

  Alt 18. Nov 2008, 21:28
Hallo.

Danke für den Code. Ich werde versuchen, damit den Übertragungsweg zu realisieren.
Daniel Marschall
  Mit Zitat antworten Zitat
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
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#27

Re: Maus sperren während Tastatureingabe

  Alt 19. Nov 2008, 06:58
Das Problem ist wohl, dass du CallNextHook() in jedem Fall aufrufst.
Delphi-Quellcode:
function MouseHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  res: Cardinal;
begin
  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 // Mausklick verwerfen
            Result := 1 // Irgend ein nicht-null Wert. So hab ich es zumindest auch schon mal gemacht ;)
          else
            Result := CallNextHookEx(Mouse_HookHandle, nCode, wParam, lParam);
          end;
        end;
      end;
  end;
end;
Das einzige was ich jetzt nicht weiss ist, ob und wann nCode jemals <0 wird. Result ist in dem Fall dann undefiniert, und müsste mit einem konstanten Wert vorbelegt werden, der dazu führt dass der Wert von nCode ebenfalls Einfluss darauf hat ob das Ereignis durchkommt oder nicht. Man müsste nur mal schauen unter welchen Bedingungen nCode<0 auftritt.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
blackdrake

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

Re: Maus sperren während Tastatureingabe

  Alt 19. Nov 2008, 07:26
Hallo.

Danke für den Tipp, ich werde es später zu Hause gleich ausprobieren.

Ein Verständnisproblem habe ich aber noch: Du sagst, CallNextHookEx() soll nicht aufgerufen werden, wenn ich mein Ereignis verwerfen will, deswegen hast du CallNextHookEx() in die If-Abfrage reingepackt. Klingt logisch. Was ist aber für den Fall dass nCode<0 ist (was das auch immer bedeuten soll)? In meinem vorherigen Code, den ich von Delphi-Treff übernommen habe, wurde CallNextHookEx() auch aufgerufen wenn nCode<0 wäre - war das unrichtig bzw. unnötig?

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#29

Re: Maus sperren während Tastatureingabe

  Alt 19. Nov 2008, 10:08
Deswegen mein letzter Absatz . Ich hatte bei meinem Programm die Abfrage vor, also ausserhalb der nCode-Bedingung, da ich selbst noch in der DLL auf das Event reagieren wollte, aber sonst keiner mehr. Das Problem bei dir ist nun, dass du deine Hostanwendung erst fragen musst ob zu ignorieren ist oder nicht. Wenn du es so biegen kannst dass du es in der DLL direkt entscheiden kannst, dürfte es kein Problem sein das ganze aus dem nCode-Abschnitt zu nehmen. (So langsam wäre es echt interessant zu wissen was nCode angibt. Das msdn fand ich da imho nicht recht hilfreich.)

Bei meinem Programm kann man auch im Host das Ignorieren ab- und anschalten, was mir ein Flag in einem gemeinsamen MMF setzt. Damit entscheide ich dann in der DLL ob geblockt wird oder nicht ohne jedes Mal nachfragen zu müssen. Evtl. wäre das eine Alternative zum Message-Frage-Antwort-Spiel für dich.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#30

Re: Maus sperren während Tastatureingabe

  Alt 19. Nov 2008, 11:50
Hi Blackdrage,

ich hatte auch dieses Touchpad Problem und habe es dann mittels automatischem sperren der Maus gelöst, evtl reicht dir das ja auch

Siehe Hier
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 6     123 45     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz