Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi BlockInput unter Vista? (https://www.delphipraxis.net/98915-blockinput-unter-vista.html)

Die Muhkuh 4. Sep 2007 08:20


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:
function BlockInput(fBlockIt: boolean): boolean; stdcall; external 'user32.dll';
Mein Aufbau vom Code ist ungefähr so:

Delphi-Quellcode:
BlockInput(true);

try
  HWND holen;
 
  Schleifenbeginn;
    Rechtsklick senden;
    Taste senden;
    Einige Tastureingaben senden;
    OK klicken;
  Schleifenende;
finally
  BlockInput(false);
end;
Hat jemand eine Idee?

mirage228 4. Sep 2007 08:26

Re: BlockInput unter Vista?
 
Hi,

Laut dem hier:
https://forums.microsoft.com/MSDN/Sh...80586&SiteID=1

scheitert es an den Benutzerrechten... musst mal schauen ob du ggf. Admin-Rechte brauchst.

mfG
mirage228

Die Muhkuh 4. Sep 2007 08:41

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.

Dezipaitor 4. Sep 2007 12:08

Re: BlockInput unter Vista?
 
GetLastError gibt doch eindeutig 5 (Access denied) für BlockInput zurück.

Die Muhkuh 4. Sep 2007 12:18

Re: BlockInput unter Vista?
 
Ähem, Recht hast Du, an GetLastError hatte ich auf die schnelle gar nicht gedacht :oops:

coollupo 30. Okt 2007 15:14

Re: BlockInput unter Vista?
 
Hat jemand eine Idee, wie man nun BlockInput unter Windows Vista realisieren könnte, ohne dabei Adminrechte zu haben?

Luckie 30. Okt 2007 15:32

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.

coollupo 30. Okt 2007 16:23

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...

alzaimar 30. Okt 2007 17:16

Re: BlockInput unter Vista?
 
Äh...

Delphi-Quellcode:
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;
So vielleicht? Geht auch mit einer Semaphore oder einem Mutex von Windows...

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.

Luckie 30. Okt 2007 20:00

Re: BlockInput unter Vista?
 
Zitat:

Zitat von coollupo
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.

Ach so und deswegen hinderst du ihn auch gleich daran auch mit einer anderen Anwendung weiterarbeiten zu können? Warum deaktivierst du nicht einfach die entsprechenden Steuerelemente?

coollupo 31. Okt 2007 09:35

Re: BlockInput unter Vista?
 
Danke für die Vorschläge.

Luckie: Das Deaktivieren der Steuerelemente ist natürlich möglich. Keine Frage, und das ist sicher auch der "korrekte" Weg. Ich hätte allerdings kein Problem damit gehabt, die Eingabe allgemein für ein paar hunderstel Sekunden zu blocken - egal in welcher Anwendung, denn der User hätte das nicht mit bekommen. Und: es wäre ein Einzeiler gewesen.

Alzaimar: Der Code-Vorschlag ist besser geeignet um das doppelte Ausführen der Routine sicher zu stellen. Das Problem ist nur, das die Routine nach dem Verlassen eines jeden der 8 Felder ausgeführt werden MUSS. Daher wäre gegen die doppelte Ausführung als solche ja nichts einzuwenden. Die Routine muss jedoch erst beendet werden (da andere, anzeigende Dialogelemente mit Gesamtwerten gefüllt werden) und dann müsste ich wissen, welches der anderen EIngabefelder der User in der Zwischenzeit geändert hat, und dann müsste die Routine wieder ausgeführt werden usw. - Etwas zu aufwendig für die kleine Aufgabe. Da gefällt mir Dein Vorschlag mit dem Timer schon sehr viel besser. Den werde ich an einer anderen Stelle mal umsetzten und schauen, wie sich das ganze "anfühlt". Thx! Hier wird die "schnelle" Lösung wohl im Deaktivieren der Eingabefelder liegen...

Luckie 31. Okt 2007 09:55

Re: BlockInput unter Vista?
 
Zitat:

Zitat von coollupo
Und: es wäre ein Einzeiler gewesen.

Bitte Zeilen zählen:
Delphi-Quellcode:
Form1.Enabled := False;

coollupo 31. Okt 2007 11:13

Re: BlockInput unter Vista?
 
LOL! Ok, ok, ok! Daran hatte ich gar nicht gedacht! Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:12 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