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 1 von 6  1 23     Letzte »    
blackdrake

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

Maus sperren während Tastatureingabe

  Alt 17. Nov 2008, 12:53
Hallo.

Ich habe bei meinem Notebook folgendes Problem: Ich lege meine Handflächen während des Tippens meistens auf die Mitte der Tastatur, was bewirkt, dass ich mit den Handballen ständig auf das (meiner Meinung etwas zu große) Touchpad komme und ich somit während des Tippens ständig in das Textfeld klicke und mein Text dadurch ziemlich verunstaltet wird.

Nach einer Recherche habe ich herausgefunden, dass viele Leute dieses Problem haben und dass es bis jetzt kein Tool dafür gibt. Die einzigste Workaround-Lösung ist, den Mauszeiger auf ein neutrales Element des Forms (im Browser z.B. die Lesezeichenleiste) zu setzen, bei der ein Klick keine Aktion und keinen Fokusverlust des Eingabefeldes bewirken kann. Das ist aber meiner Meinung nach unzureichend.

Deswegen wollte ich mal versuchen, ein Tool zu entwickeln, dass die Maus während einer Tastatureingabe sperrt (Touchpad separat sperren ist ja unter Windows-Ebene nicht wirklich allgemein machbar)

Ich stelle mir das so vor:
1. Das Ereignis einer Tastatureingabe wird auf Betriebssystemebene erfasst - im Notfall müsste man mit den Hook-DLLs von Keyloggern arbeiten, jedoch dann schlagen AntiViren-Programme zu, da sie ein Keylogger-Malware vermuten
2. Während der nächsten x-Sekunden wird die Maus in Sachen Bewegungen und Klicks gesperrt. (Eventuell könnte man noch einstellen, dass nur Klicks und Bewegungen nicht gesperrt werden)

Wie kann ich das realisieren?

- Man kann die letzte Eingabe mittels GetLastInputInfo() prüfen, jedoch wird dort auf Tastatur und Maus überprüft. Ich will jedoch nur den Zeitpunkt des letzten Tastenanschlags
- Und wie man die Maus komplett oder nur partiell sperrt, weiß ich auch nicht. Man müsste eventuell eine Windows-Message abfangen und diese nach dem Erhalt als ungültig erklären, oder?

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Maus sperren während Tastatureingabe

  Alt 17. Nov 2008, 13:02
viele Notebooks bieten die möglichkeit mit einer seperaten Taste oder in Verbindung mit FN das Touchpad zu deaktivieren. Falls diese Möglichkeit nicht vorhanden ist und man mit dem Touchpad nicht klar kommt ist eine weitere Möglichkeit das Touchpad im Gerätemanger zu deaktivieren und eine externe Maus anzuschließen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
blackdrake

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

Re: Maus sperren während Tastatureingabe

  Alt 17. Nov 2008, 13:06
Hallo.

Ich möchte es wirklich gerne per Tool bewältigen.

Mein Notebook besitzt eine [Fn]-Tastenkombination zur Deaktivierung des Touch-Felds. Das könnte ich machen, wenn ich sehr lange Texte tippe, aber für normale Benutzung wäre es nicht günstig, das Touch-Feld andauernd zu aktivieren und zu deaktivieren. Denn ich möchte das Touchfeld ja zwischen den Eingaben wirklich benutzen. Eine externe Maus ist auch nicht überall passend, besonders wenn es an Platz fehlt, man im Zug sitzt etc. Eine komplette deaktivierung des Touchfields wäre mir also nicht ganz so recht.

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
blackdrake

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

Re: Maus sperren während Tastatureingabe

  Alt 17. Nov 2008, 13:51
Hallo.

In einem kleinen Testprogramm habe ich schon einen kleinen Fortschritt erwirkt.

Wenn ein Button "Maus 3 Sekunden sperren" geklickt wird, wird die Maus innerhalb des Forms für 3 Sekunden gesperrt.

Folgendes fehlt jetzt noch:
1. Der Hook muss die Maus Systemweit sperren
2. Ich muss noch herausfinden, wann die Tastatur zuletzt bedient wurde (aber NUR die Tastatur)

Delphi-Quellcode:
var
  HookID: THandle;

function MouseProc(nCode: Integer; wParam, lParam: Longint): Longint; stdcall;
var
  szClassName: array[0..255] of Char;
begin
  case nCode < 0 of
    True:
      Result := CallNextHookEx(HookID, nCode, wParam, lParam)
      else
        case wParam of
          // Linke Maustaste sperren
          WM_LBUTTONDOWN,
          WM_LBUTTONUP,
          WM_LBUTTONDBLCLK:
            begin
              GetClassName(PMOUSEHOOKSTRUCT(lParam)^.HWND, szClassName, SizeOf(szClassName));
              Result := HC_SKIP
            end
            else
              Result := CallNextHookEx(HookID, nCode, wParam, lParam);
        end;
  end;
end;

procedure DestroyHook;
begin
  if HookID <> 0 then
  begin
    UnHookWindowsHookEx(HookID);
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  DestroyHook;
end;

procedure TForm1.sperre_maus_fuer_3_sekundenClick(Sender: TObject);
begin
  // TODO: SYSTEM-GLOBAL DEN HOOK FÜR WM_MOUSE SETZEN!
  HookID := SetWindowsHookEx(WH_MOUSE, MouseProc, 0, GetCurrentThreadId());
  timer1.enabled := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  DestroyHook;
end;
Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Maus sperren während Tastatureingabe

  Alt 17. Nov 2008, 13:59
Zitat von blackdrake:
1. Der Hook muss die Maus Systemweit sperren
Der Cod emus sin einer DLL liegen.
Zitat:
2. Ich muss noch herausfinden, wann die Tastatur zuletzt bedient wurde (aber NUR die Tastatur)
Schreib noch einen Tastatur Hook.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
416 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Maus sperren während Tastatureingabe

  Alt 17. Nov 2008, 14:21
Hallo,
Zitat von blackdrake:
Ich habe bei meinem Notebook folgendes Problem: Ich lege meine Handflächen während des Tippens meistens auf die Mitte der Tastatur, was bewirkt, dass ich mit den Handballen ständig auf das (meiner Meinung etwas zu große) Touchpad komme und ich somit während des Tippens ständig in das Textfeld klicke und mein Text dadurch ziemlich verunstaltet wird.
schau Dir doch mal deinen Touchpad-Treiber an. Ich hab ein Uralt-Toshiba und da konnte man das schlicht und ergreifend ausschalten, daß ein Druck auf das Touchpag einen Klick auslöst (und der Treiber war ein Standard für diese Touchpads). Würde mich wundern, wenn modernere Notebooks das nicht haben.

Grüße,
Uli
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

Re: Maus sperren während Tastatureingabe

  Alt 17. Nov 2008, 15:28
Ich glaube es geht hier um eine smarte Lösung für das Problem mit dem Touchpad.

Bei Outlook kann ich mit F9 meine emails abholen lassen. Aber das geht auch automatisch.
Den Rechner kann ich ausschalten, wenn ich ihn nicht mehr brauche. Aber das geht mittlerweile auch automatisch (Standby, Ruhezustand).
Bei meinem Auto kann ich alle Türen separat verschließen und öffnen. Die ZV macht das auf einen Schlag.
Mit KeylessGo öffnet und schließt das Auto, wenn ich mich nähere oder entferne.

Es geht nicht darum, dass man da manuell was machen kann, sondern um die smarte Automatik.

Hier in der DP wurde schon mal darauf verlinkt http://www.delphi-treff.de/tutorials...astatur-hooks/

cu

Oliver
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Maus sperren während Tastatureingabe

  Alt 17. Nov 2008, 16:46
@Sir Rufo:
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
blackdrake

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

Re: Maus sperren während Tastatureingabe

  Alt 17. Nov 2008, 20:55
Hallo.

@Sir Rufo: Ja, genau so meine ich es. Im Endeffekt will ich das Tool auch veröffentlichen, da es in einigen Situationen bzw. bei einigen Anwendern wirklich sinnvoll ist.

Die Klickfunktion des Touchpads zu Deaktivieren führt natürlich wieder zu einer gezwungenen Umstellung des Benutzers und ist außerdem nicht im Allgemeinen (bei allen Notebooks/Treibern) anwendbar. Und allgemeine Deaktivierungen bzw. per Fn-Tastenkombination sind nur bei längeren Schreibphasen sinnvoll.

Ich habe jetzt mit dem Delphi-Treff-Tutorial folgende Anwendung mit DLL (ich möchte die DLL konventionell extern haben, nicht als Ressource) abgeleitet. Ich bekomme aber eine AV, sobald ich Button 1 oder 2 klicke. Ich weiß nicht, was da passiert

Das DP Tutorial ist leider so kompliziert nonVCL geschrieben, dass ich es nur sehr schwer in VCL nachvollziehen/nachmachen kann. Ich denke, dass auch hier ein Problem bei der Transkription besteht.

Hauptanwendung, die ein Keyboard-Ergeigniss erhalten soll

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TInstallHook = function(Hwnd: THandle): Boolean; stdcall;
  TUninstallHook = function: Boolean; stdcall;

var
  InstallHooks: TInstallHook;
  UninstallHooks: TUninstallHook;
  lib: Cardinal;
  WM_MOUSEHOOKMSG: Cardinal = 0;
  WM_KEYBHOOKMSG: Cardinal = 0;

const
  mousmsg='MouseHookMessage_Assarbad';
  keybmsg='KeyboardHookMessage_Assarbad';

procedure TForm1.Button1Click(Sender: TObject);
var
  h: hwnd;
begin
  h := application.Handle; // ???
  InstallHooks(h); // EXCEPTION
  WM_MOUSEHOOKMSG:=getprop(h,mousmsg);
  WM_KEYBHOOKMSG:=getprop(h,keybmsg);
end;

// TODO: Globale Keyboard Message abfragen (mit WM_KEY Message?)

procedure TForm1.Button2Click(Sender: TObject);
begin
  UnInstallHooks; // EXCEPTION
  WM_MOUSEHOOKMSG:=0;
  WM_KEYBHOOKMSG:=0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  lib := LoadLibrary('hooks.dll');
  if lib <> INVALID_HANDLE_VALUE then begin
    InstallHooks := GetProcAddress(lib, 'InstallHook');
    UnInstallHooks := GetProcAddress(lib, 'UninstallHook');
  end
  else
  begin
    ShowMessage('Hook could not be initialized. Please check "hooks.dll".');
    Application.Terminate;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeLibrary(lib);
end;

end.
Die Hook-DLL, direkt übernommen

Delphi-Quellcode:
library Hooks;

uses
  Windows,
  Messages;

const
  mousmsg='MouseHookMessage_Assarbad';
  keybmsg='KeyboardHookMessage_Assarbad';

var
  Mouse_HookHandle: Cardinal = 0;
  Keyboard_HookHandle: Cardinal = 0;
  WindowHandle: Cardinal = 0;

  WM_MOUSEHOOKMSG: Cardinal = 0;
  WM_KEYBHOOKMSG: Cardinal = 0;

function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
//es ist ebenfalls moeglich die Bearbeitung an eine Bedingung zu knuepfen
//it's possible to call CallNextHookEx conditional only.
  Result := CallNextHookEx(Keyboard_HookHandle, nCode, wParam, lParam);
  case nCode < 0 of
    TRUE: exit; //wenn code kleiner 0 wird nix gemacht
                //if code smaller 0 nothing has to be done
    FALSE:
      begin
//Hier kann jetzt alles bearbeitet werden
//Here one can work with the parameters
        setprop(WindowHandle, 'keyb_ncode', nCode);
        SendMessage(HWND_BROADCAST, WM_KEYBHOOKMSG, wParam, lParam);
      end;
  end;
end;

function MouseHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
//es ist ebenfalls moeglich die Bearbeitung an eine Bedingung zu knuepfen
//it's possible to call CallNextHookEx conditional only.
  Result := CallNextHookEx(Mouse_HookHandle, nCode, wParam, lParam);
  case nCode < 0 of
    TRUE: exit; //wenn code kleiner 0 wird nix gemacht
                //if code smaller 0 nothing has to be done
    FALSE:
      begin
//Hier kann jetzt alles bearbeitet werden
//Here one can work with the parameters
        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);
        SendMessage(HWND_BROADCAST, WM_MOUSEHOOKMSG, wParam, lParam);
      end;
  end;
end;

function InstallHooks(Hwnd: Cardinal): Boolean; stdcall;
var mouseh, keybh: boolean;
begin
  keybh := false;
  mouseh := false;
//Erstmal Hooks installieren
//First install the hooks
  case Mouse_HookHandle of
    0: begin
        Mouse_HookHandle := SetWindowsHookEx(WH_MOUSE, @MouseHookProc, HInstance, 0);
        SetProp(Hwnd,mousmsg,WM_MOUSEHOOKMSG);
        mouseh := true;
      end;
  end;
  case Keyboard_HookHandle of
    0: begin
        Keyboard_HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0);
        SetProp(Hwnd,keybmsg,WM_KEYBHOOKMSG);
        keybh := true;
      end;
  end;
//Uebergebenes Fensterhandle sichern
//Save the given window handle
  WindowHandle := Hwnd;
  Result := keybh and mouseh;
end;

function UninstallHooks: Boolean; stdcall;
var mouseh, keybh: boolean;
begin
//Hooks aus der Hookchain entfernen
//Uninstall hook from hooks chain
  mouseh := UnhookWindowsHookEx(Mouse_HookHandle);
  keybh := UnhookWindowsHookEx(Keyboard_HookHandle);
  Mouse_HookHandle := 0;
  Keyboard_HookHandle := 0;
  Result := keybh and mouseh;
  if Result then WindowHandle := 0;
end;

exports
//Installations- und Deinstallationsroutine exportieren
//Export the installation and deinstallation routine
  InstallHooks,
  UninstallHooks;

begin
  WM_MOUSEHOOKMSG:=RegisterWindowMessage(mousmsg);
  WM_KEYBHOOKMSG:=RegisterWindowMessage(keybmsg);
end.
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

Re: Maus sperren während Tastatureingabe

  Alt 17. Nov 2008, 21:11
Die Anwort auf Deine ??? (Alfred Hitchcock ) aus Zeile 45 der Hauptanwendung findest Du m.E. in Zeile 80 des DLL-Codes:
Delphi-Quellcode:
//Uebergebenes Fensterhandle sichern
//Save the given window handle
  WindowHandle := Hwnd;
cu

Oliver
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 6  1 23     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 18:02 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