Delphi-PRAXiS
Seite 1 von 2  1 2      

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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:51 Uhr.
Seite 1 von 2  1 2      

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