![]() |
BlockInput unter Vista?
Hi,
ich hab ein Programm, welches per SetCursorPos und einem mouse_event auf einem anderen Proramm rumklickt und danach eine Texteingabe simuliert. Während dieser Zeit, darf man nirgendwo anders hinklicken, sonst passieren "mysteriöse" Dinge. Im Klartext hieße das, dass ich den kompletten Input blocken möchte (STRG+ALT+Entf und so weiter muss nicht geblockt werden (ginge ja nur durch DLL Ersetzung)). Die Hauptsache ist, dass der Benutzer nicht versehentlich irgendwo hin klickt. Unter Vista jedoch scheint BlockInput nicht mehr zu funktionieren. Ich kann weiterhin die Maus bewegen und Tastatureingaben senden.
Delphi-Quellcode:
Mein Aufbau vom Code ist ungefähr so:
function BlockInput(fBlockIt: boolean): boolean; stdcall; external 'user32.dll';
Delphi-Quellcode:
Hat jemand eine Idee?
BlockInput(true);
try HWND holen; Schleifenbeginn; Rechtsklick senden; Taste senden; Einige Tastureingaben senden; OK klicken; Schleifenende; finally BlockInput(false); end; |
Re: BlockInput unter Vista?
Hi,
Laut dem hier: ![]() scheitert es an den Benutzerrechten... musst mal schauen ob du ggf. Admin-Rechte brauchst. mfG mirage228 |
Re: BlockInput unter Vista?
Hi,
danke. Da war es jetzt. Dann werd ich wohl doch ein Manifest mitgeben müssen, damit das Programm Adminrechte fordert. |
Re: BlockInput unter Vista?
GetLastError gibt doch eindeutig 5 (Access denied) für BlockInput zurück.
|
Re: BlockInput unter Vista?
Ähem, Recht hast Du, an GetLastError hatte ich auf die schnelle gar nicht gedacht :oops:
|
Re: BlockInput unter Vista?
Hat jemand eine Idee, wie man nun BlockInput unter Windows Vista realisieren könnte, ohne dabei Adminrechte zu haben?
|
Re: BlockInput unter Vista?
Wenn du mit Gewalt das System für den Benutzer unbedienbar machen musst, damit dein Programm korrekt funktioniert, stimmt was mit deinem Design nicht.
|
Re: BlockInput unter Vista?
Hmm, das Problem ist folgendes:
nach einem Input in einer Eingabemaske muss ich ein paar Berechnungen inkl. Datenbankzugriffe machen. In der Eingabemaske habe ich 8 Felder nebeneinander, in denen jeweils die oben genannte Routine aufgerufen wird. Da die Berechnungsroutine etwas länger dauert, als der User benötigt, um isn nächste Feld zu wechseln und den gleichen Prozess nochmasl anzustoßen, möchte ich ihn daran hindern, bis ie Berechnungsroutine abgeschlossen ist. Dazu ist der Befehl BlockInput doch ganz brauchbar. Aber ich bin für konstruktive Vorschläge natürlich offen... |
Re: BlockInput unter Vista?
Äh...
Delphi-Quellcode:
So vielleicht? Geht auch mit einer Semaphore oder einem Mutex von Windows...
Function StarteWennNichtSchonGestartet : Boolean;
Begin fMyCriticalSection.Enter; Try Result := Not fGestartet; fGestartet := True; Finally fMyCriticalSection.Leave; End; End; Procedure FertigMitDerArbeit; Begin fMyCriticalSection.Enter; Try fGestartet := False; Finally fMyCriticalSection.Leave; End; End; Procedure StarteRoutine; Begin If Not StarteWennNichtSchonGestartet Then Exit; Try MachWasDuWilst; Finally FertigMitDerArbeit; End; End; Du kannst aber auch einfach die Editfelder auf 'ReadOnly' setzen, oder das OnKeyDown-Ereignis der Form (mit KeyPreview = True) überschreiben, oder oder oder. Ich mache es immer so: Ich habe einen Timer, der auf 50ms eingestellt ist. Sobald ein Ereignis eintritt, das die Neuberechnung anstößt, wird der Timer angeschaltet. Jeder Tastendruck setzt den Timer zurück. Wenn man nun 50ms nichts tippt, wird er ausgelöst und kann dann z.B. die Berechnungen anwerfen. So spürt der Anwender keinerlei Verzögerung, bekommt aber trotzdem 'sofort' das Resultat zu sehen. |
Re: BlockInput unter Vista?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:18 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