Entwickler-Ecke

Windows API - Bestimmte Tasten blockieren?


D.Elphi - Fr 09.03.12 15:56
Titel: Bestimmte Tasten blockieren?
Hallo zusammen,
für ein Programm möchte ich die Tasten ALT, STRG, ESC, F4, ENTF und die Windows-Taste blocken. Mein bisheriger Ansatz:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Char;
  Shift: TShiftState);
begin
if Key = 'VK_CONTROL' then Key := '0'//Strg
if Key = 'VK_ESCAPE' then Key := '0'//ESC
if Key = 'VK_F4' then Key := '0';    //F4-Taste 
if Key = 'VK_DELETE' then Key := '0'//ENTF
if Key = 'VK_MENU' then Key := '0'//ALT
if Key = 'VK_LWIN' then Key := '0'//Linke Windowstaste
if Key = 'VK_RWIN' then Key := '0'//Rechte Windowstaste
end;


Das klappt aber nicht :(. Mache ich was falsch? Bitte helft mir :)

gruß
D.Elphi

Moderiert von user profile iconNarses: Status "gelöst" gesetzt.


bummi - Fr 09.03.12 16:05

1. Key ist ein Char also nur ein Zeichen Du vergleichst mit einem String
2. Ein Teil der Tasten Du abfangen willst kommen nicht über den Key sondern über Shift
3. Ein Teil kommt gar nicht auf diese Art

Wenn Du es nur innerhalb Deiner Anwendung benötigst könntest Du Dich in Application.OnMessage hängen oder ein eine ApplicationEvents-Komponente verwenden und Dort OnMessage regieren.

Ich vermute aber Du möchtest Dich systemweit einhängen, das Stichwort wäre dann Keyhook und ist immer mit einer DLL verbunden.


Narses - Fr 09.03.12 16:07

Moin!

user profile iconD.Elphi hat folgendes geschrieben Zum zitierten Posting springen:
für ein Programm möchte ich die Tasten ALT, STRG, ESC, F4, ENTF und die Windows-Taste blocken. Mein bisheriger Ansatz:
Zumindest Strg+Alt+Entf kann man nicht für ein spezielles Programm blockieren, da es eine Systemfunktion ist. Ob und wie auch immer man das machen kann, sei mal dahingestellt. Wofür brauchst du das denn?

cu
Narses


D.Elphi - Fr 09.03.12 16:22

@Narses: Ich versuche, so etwas ähnliches wie SiteKiosk oder Magic Desktop zu machen, wo diese Kombinationen auch nicht funktionieren.


Narses - Fr 09.03.12 16:42

Moin!

Du möchtest also die Rechte des Benutzers auf das Betriebssystem einschränken. Dafür verwendet man üblicherweise verschiedene Benutzerkonten und Gruppenrichtlinien. Die kann man auch nicht aushebeln und zentral Administrieren (wenn man denn einen Windows-Server zur Hand hat). :idea:

Ein Delphi-Programm ist hier leider kein gutes Mittel, dieses Ziel zu erreichen.

cu
Narses


D.Elphi - Fr 09.03.12 16:48

Ich glaube, mein Beitrag war ein wenig missverständlich :D. Ich möchte keines dieser Programme nachmachen, ich möchte lediglich verhindern, dass ein Programm sich per Klick auf "X" oder mit den Tastenkombis beenden lässt (momentan sieht es so aus: ein vom User festgelegtes Passwort muss eingegeben werden, damit das Programm sich beendet.)


Gausi - Fr 09.03.12 16:52

Das Schließen (Alt-F4, oder auch Klick auf [ X ]) kann man im OnCloseQuery verweigern. Gegen das Abschießen des Prozesses über den Taskmanager gibt es aber nichts sinnvolles - und das ist auch gut so.


D.Elphi - Fr 09.03.12 16:53

OK, danke. Aber wie sieht denn jetzt der Quelltext konkret aus?

danke im Voraus :)


bummi - Fr 09.03.12 16:53

Dann langt gegf. das?


Delphi-Quelltext
1:
2:
3:
4:
procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := PasswortPasst;
end;


Narses - Fr 09.03.12 16:55

Moin!

user profile iconD.Elphi hat folgendes geschrieben Zum zitierten Posting springen:
Ich glaube, mein Beitrag war ein wenig missverständlich :D. Ich möchte keines dieser Programme nachmachen,
Oh, ja, das habe ich wohl falsch verstanden. ;)

user profile iconD.Elphi hat folgendes geschrieben Zum zitierten Posting springen:
ich möchte lediglich verhindern, dass ein Programm sich per Klick auf "X" oder mit den Tastenkombis beenden lässt (momentan sieht es so aus: ein vom User festgelegtes Passwort muss eingegeben werden, damit das Programm sich beendet.)
In Delphi kannst du, zusätzlich zu user profile iconGausis Tipp, auch das OnClose-Ereignis nutzen:

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if NichtBeenden then
    Action := caNone;
Dagegen, dass ein Computer-Administrator den Prozess deines Programms abschießt, kannst du erstmal nichts unternehmen. Und gleich der Hinweis: wie man das evtl. doch tun könnte, wollen wir in der EE nicht diskutieren. :idea:

cu
Narses


D.Elphi - Fr 09.03.12 16:56

Klasse :D Danke für eure Hilfe!


Tranx - Fr 09.03.12 17:33

Also, wenn ich ein Programm hätte, das sich nur mit Passwort beenden lässt, das würde bei mir gnadenlos per Taskmanager beendet. Und ich würde dann auch noch gleich das Programm herausfinden und mir Eraser von der Festplatte löschen. Ganz ehrlich, das klingt so, wie manche dieser Internetanwendungen, wo man auf das X des Fensters, was ja üblich für "Schießen" steht, klickt und dann öffnet sich irgendeine obskure Internetadresse. Da hab ich echt die Kappe dann auf.

Wenn ich auf meinem Rechner die Programme nicht schließen kann (Ausnahme irgendwelche Systemroputinen), wann ich will, dann haben die auf meinem Rechner nichts zu suchen.

Das nur mal zu dem Thema. Ansonsten ist die Frage wohl beantwortet.


Nersgatt - Fr 09.03.12 17:39

Man muss nicht immer Böses dabei vermuten.

Wir haben auch z.B. Touchscreenterminals, die man nicht per X schließen kann. Und das ist gewollt, denn die werden von Leuten bedient, die es einfach nicht schließen sollen. Die hängen unbeaufsichtigt in Pausenräumen, Hallen, etc... Man staunt, auf was für doofe Ideen Leute während einer langweiligen Nachtschicht kommen. Nach dem Motto "mal gucken, ob man mit der Kiste auch Solitär spielen kann". Und das ist noch die beste der doofen Ideen. :roll:
Man könnte die Terminals übrigens über ALT+F4 schließen. Geht aber nicht, weil 1. PC in verschlossenem Schrank und Tastatur ebenso. Bedienung ausschließlich über Touchscreen.


D.Elphi - Fr 09.03.12 23:24

Tranx, mal mal nicht den Teufel an die Wand :D Nersgatt hat Recht mit seinem Beitrag. Ich hab nix böses vor - dürfte ich eh nicht verbreiten weil wegen Educational-Version ;)


Delete - Sa 10.03.12 14:52

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Zumindest Strg+Alt+Entf kann man nicht für ein spezielles Programm blockieren, da es eine Systemfunktion ist. Ob und wie auch immer man das machen kann, sei mal dahingestellt.


Nicht getestet:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
{Task-Manager disablen}
SystemParametersInfo(SPI_SCRE]ENSAVERRUNNING,1,Nil,0);
.
{Task-Manager enablen}
SystemParametersInfo(SPI_SCREENSAVERRUNNING,0,Nil,0);

oder:
SystemParametersInfo(SPI_SCREENSAVERRUNNING, True, 10);
Label1.Caption:='[Strg] + [Alt] + [Entf] ausgeschaltet';
.
SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, 10);
Label1.Caption:= '[Strg] + [Alt] + [Entf] eingeschaltet';


Ausserdem:
HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableLockWorkstation
HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr
HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableChangePassword
HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoLogoff
HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoClose

All entries should be dword values: 1 enables the feature - 0 disables it.


Delete - Sa 10.03.12 15:37

Damit kannst du den Taskmanager deaktivieren, aber nicht Strg+Alt+Entf. Und darüber kann man wieder den Taskmanager erreichen.