![]() |
Maus sperren während Tastatureingabe
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 |
Re: Maus sperren während Tastatureingabe
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.
|
Re: Maus sperren während Tastatureingabe
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 |
Re: Maus sperren während Tastatureingabe
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:
Gruß
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; blackdrake |
Re: Maus sperren während Tastatureingabe
Zitat:
Zitat:
|
Re: Maus sperren während Tastatureingabe
Hallo,
Zitat:
Grüße, Uli |
Re: Maus sperren während Tastatureingabe
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 ![]() cu Oliver |
Re: Maus sperren während Tastatureingabe
@Sir Rufo: :thumb:
|
Re: Maus sperren während Tastatureingabe
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:
Die Hook-DLL, direkt übernommen
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.
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. |
Re: Maus sperren während Tastatureingabe
Die Anwort auf Deine ??? (Alfred Hitchcock :gruebel: ) aus Zeile 45 der Hauptanwendung findest Du m.E. in Zeile 80 des DLL-Codes:
Delphi-Quellcode:
cu
//Uebergebenes Fensterhandle sichern
//Save the given window handle WindowHandle := Hwnd; Oliver |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz