C# forms Anwendung Windows taste deaktivieren?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Kommt drauf an, was genau Du vorhast, einfach wird das jedenfalls nicht und definitiv nichts für einen Anfänger ;)
Außerdem spielt die Windows-Taste eine besondere Rolle, da Windows selber darauf reagiert und das lässt sich ungern dazwischen funken. Es kann also gut sein, dass dir das einen Strich durch die Rechnung macht und Du tief in die Trickkiste greifen musst, um das noch zu verhindern.
Möglich ist es definitiv, aber ganz sicher kein einfaches Thema.

Innerhalb des Programms musst Du schauen, wie deine Umgebung das behandelt.
In Konsolenprogrammen hat die Console-Klasse ein paar Methoden zum Warten auf Eingaben, das funktioniert auch mit der Windows-Taste. Wenn Du es "abfangen" willst, musst Du nur prüfen, ob's die Windows-Taste ist und dann eben nicht reagieren.
Bei WinForms und WPF gibt's mehrere Methoden, auf Tasteneingaben zu reagieren, oder Du verwendest eine Textbox. Hier gilt das Gleiche: Auf Eingabe warten, prüfen und (nicht) reagieren.
Das blöde bei der Windows-Taste: Windows reagiert trotzdem.

In der WinApi kannst Du einen MessageHook registrieren, die Technik dafür heißt "p/invoke", mit der Du entsprechend vorbereitete C++-Funktionen aus C# heraus aufrufen kannst.
Windows schickt dann alle internen Messages an diese Methode und bietet dir die Möglichkeit, zu reagieren. Unter diesen Messages ist alles, z.B. Mausbewegungen oder Tastatureingaben. Wenn diese Methode den nächsten Hook nicht aufruft, passiert einfach nichts, völlig egal, in welchem Programm Du gerade arbeitest, solange das von dir entwickelte Programm noch läuft.
Die spannende Frage ist: Was passiert, wenn Windows selber darauf reagieren möchte? Es kann gut sein, dass das dein Hook dann "zu spät" ist und Windows schon reagiert hat, dann hast Du keine Chance, das noch zu ändern.
Sorg aber dafür, dass der Hook in jedem Fall korrekt entfernt wird, ansonsten hast Du "lustige" Effekte. Ich hab sowas mal für die Maus gemacht, wenn da was schief geht, funktioniert halt die Maus nicht mehr.
Windows bekommt das zwar von selbst mit und behebt das Problem, besser wäre aber, Du räumst einfach richtig auf.

Die dritte Möglichkeit ist die Hardware (sprich: Die Tastatur) selber oder der Treiber dafür. Manche Geräte unterstützen solche Sperren von sich aus, andere nicht.
Es gibt sog. Filter-Treiber, sowas wie ein normaler Treiber, der aber nicht die Hardware direkt steuert, sondern nur einen anderen Treiber aufruft.
Ein solcher Filter-Treiber kann - wie der Name schon sagt - filtern, aber ob das auch für Tastaturen funktioniert, weiß ich nicht.
Außerdem hat das den Nachteil, dass es nur für die eine Hardware funktioniert, für die der Filter-Treiber verwendet wird. Der wichtigste Nachteil ist aber: Treiber arbeiten auf sehr tiefer Ebene - ich würde mir nicht einfach so irgendeinen zwielichtigen Treiber installieren wollen.
Und die Entwicklung von einem Filter-Treiber oder allgemein Treiber ist kein Pappenstiel. Alles Andere, was ich hier beschreibe (inklusive das Folgende), habe ich so ähnlich schon gemacht, aber ob ich einen Filter-Treiber hinbekomme - keine Ahnung. Kann aber auch gut sein, dass ein erfahrener C++-Entwickler das etwas anders sieht, ich bin jedenfalls keiner.

Und dann gibt's noch das "Keyboard Filter"-Feature:
Ich lese davon gerade zum ersten Mal, weiß also nicht, ob und wie gut das funktioniert. So wie ich es verstehe, kannst Du damit Tasten und Tastenkombinationen systemweit unabhängig von deinem Programm sperren, gesteuert anhand von Werten in der Registry.
Direkt steuern kannst Du aus deinem Programm heraus also nicht, aber Du kannst die Werte in der Registry dynamisch verändern und z.B. daran festmachen, ob dein Programm sichtbar ist, oder nicht.
Aber auch hier solltest Du korrekt aufräumen, tust Du das nicht, bleibt die zuletzt gesetzte Sperre solange drin, bis Du sie per Hand entfernst oder das Programm wieder gestartet wird.

Zum korrekten Aufräumen gibt's das Disposable-Pattern. Damit funktioniert der using-Block in C#, selber aufräumen wird also einfacher und wenn's doch mal schief geht und das Programm abstürzt, räumt die Runtime für dich auf, doch darauf verlassen sollte man sich nie.

Woher ich das weiß:Berufserfahrung

LordEscanor2003 
Fragesteller
 02.02.2021, 01:16

Könnte ich theoretisch nicht einfach vorgeben, dass die Windows-Taste bei Betätigung nach dem klicken erneut vom Programm geklickt wird, sodass die Leiste direkt wieder verschwindet?

0
Palladin007  02.02.2021, 09:22
@LordEscanor2003

Wäre eine Möglichkeit, sähe bloß scheiße aus :D

Aber auch das geht nur per WinApi, damit kann man einen Tastendruck simulieren.

By the way: Wenn's um p/invoke geht, ist die Seite http://pinvoke.net/ Gold wert.

0
LordEscanor2003 
Fragesteller
 09.02.2021, 23:30

Oder einfach Desktop taskkillen 😂✌️Ist sowieso eine Fullscreen-Anwendung :ppp

0
Palladin007  09.02.2021, 23:37
@LordEscanor2003

Der Desktop ist eigentlich der Windows-Explorer und der wird von Windows wieder neugestartet.

Außerdem könnte ich mir vorstellen, dass der eine oder andere Virenscanner bei solchen Tricks hellhörig wird.

0

Das ist meines wissens nach nicht möglich, genau so wie du die Tastenkombination ALT F4 nicht aushebeln kannst.

Du kannst die Tasteneingabe nur in deinem Programm nicht beachten, du kannst aber die Taste nicht insgesamt für alle Programme deaktivieren und die Funktion, dass das Menü mit dieser Taste geöffnet wird kommt vom Explorer und nicht von deinem Programm.


LordEscanor2003 
Fragesteller
 02.02.2021, 00:06

Das weiß ich schon, jedoch meine ich auch, dass man innerhalb meines Programmes keinen Nutzen von der Windows-Taste machen soll.

Alt+F4 habe ich schon lokal in meinem Programm deaktiviert.

0
Palladin007  02.02.2021, 01:03
@PeterKremsner

Soweit ich mich erinnere, funktioniert so ein MessageHook unabhängig vom Fokus, solange das Programm läuft, greift der Hook.

Deshalb sollte man auch sorgfältig arbeiten, da ein Fehler oder eine ungünstig blockierende Anwendung dafür sorgen kann, dass gar nichts mehr funktioniert.

Ich hab sowas mal mit der Maus gemacht, die hat dann so lange nicht mehr funktioniert, bis Windows nach einer kurzen Weile reagiert und nicht mehr (so lange) auf mein Programm gewartet hat.

2
PeterKremsner  02.02.2021, 01:30
@Palladin007

Ich dachte die sind nur solange die jeweilige Anwendung den Fokus hat.

Kann aber durchaus sein, dass die immer greifen.

Bestimmte Tastenkombination gehn aber nicht zB lässt sich mit dem MessageHook Strg Alt Entf nicht abfangen, auch nicht beim Fokus auf dem Programm.

1
Palladin007  02.02.2021, 09:24
@PeterKremsner

UI-Frameworks überwachen den Fokus und geben dann ggf. die Messages nicht weiter, das stimmt.

Die Messages selber sind aber systemweit und gelten immer, sonst wären viele Programme gar nicht möglich.

Und doch, Tastenkombinationen kann man auch abfangen, aber eben nicht nativ. Stattdessen muss man die Tasten einzeln überwachen und wenn mehrere Tasten gleichzeitig gedrückt werden, entsprechend reagieren.

1
PeterKremsner  02.02.2021, 09:53
@Palladin007

Dass die Messages selbst Systemweit sind weiß ich ja. Ich wusste nur nicht, dass man Global mit einem Keybinding diesen Key auch für alle Programme einfach sperren kann, selbst dann wenn die eigenen Anwendung nicht den Fokus hat. Ich hätte mal angenommen, dass das Bereits vom Kernel so verwaltet wird, dass die Keypresses grundsätzlich an alle Programme gesendet werden und man nur den Key in der eigenen Anwendung dann eben nicht abfragen kann/muss, bzw man nur solange das weiterreichen deaktivieren kann wie eben das eigene Programm den Fokus hat.

Ich glaube die Kombination Strg Alt Entf kann man gar nicht abfangen, weil an den Kernel geht sie ja sowieso und wenn bereits der Kernel oder bestimmte Teile des OS auf einer tieferen Ebene die Aktion auslösen als MessageHooks können die MessageHooks selbst das ja nicht mehr entscheiden.

Zumindest hätte ich mal gelesen, dass die Funktion Strg Alt Entf kein Teil des Windows Explorers ist sondern tiefer im OS sitzt als die typischen Userspace Programme. Das hab ich glaub ich auf Stackoverflow gelesen zu einer Frage warum diese Tastenkombination eigentlich immer funktioniert.

1
Palladin007  02.02.2021, 10:05
@PeterKremsner

Die Hooks rufen ja den jeweils nächsten Hook auf und können da entscheiden.
Ob und wann Windows dann entscheidet, dass dein Hook nicht mehr informiert wird, weil es ganz frech zu viele Messages sperrt, das weiß ich nicht.
Ich wüsste aber auch nicht, wo man sowas fest machen will, es könnte ja eine legitime Anforderung sein, die Windows dann nicht verhindern darf.

Und ja, mit STRG-ALT-ENTF hat man vermutlich das gleiche Problem, wie mit der Windows-Taste: Windows reagiert selber darauf und ein "unwichtiges" Programm spielt da immer die zweite Geige.

Das gilt aber nur für die Tasten (-Kombinationen), auf die das Betriebssystem selber überwacht, alle anderen kann man so behandeln.

Aber scheinbar bietet Windows selber ein Feature zum Sperren mit, das kenne ich aber auch erst seit gestern.

2
PeterKremsner  02.02.2021, 10:32
@Palladin007

Das mit den Hooks würde mich jetzt näher interessieren.

Wenn die Hooks nacheinander aufgrufen werden, wie erfolgt dann eine Priorisierung? Also welches Programm entscheidet als erstes, dass das nächste Programm den Tastendruck nicht mehr erhält.

Wenn das in der Reihe ist in der den Anwendungen Prozessorzeit zur Verfügung gestellt wird, würde sich ja eine klassische Race Condition ergeben.

Und nach der Startreihenfolge wärs zumindest bei Autostartprogrammen die Parallel gestartet werden auch eine Race Condition.

1
Palladin007  02.02.2021, 10:37
@PeterKremsner

So tief hab ich mich damit nie beschäftigt :D

Aber Du darfst mich gerne auf dem Laufenden halten, wenn Du näheres herausfinden kannst.

2
FaTech  02.02.2021, 00:08

Möglich ist sowas, siehe Computergames, wenn die das können, kann C# das auch... Davon mal abgesehen ist es eines der leichtesten Dinge Alt F4 auszuhebeln. Einfach Event Listener auf das Close legen und abfangen

0
PeterKremsner  02.02.2021, 00:09
@FaTech

Ich hätte die Frage so verstanden, dass das Alt F4 Event so wie die Windows Taste global ausgehebelt werden sollten.

Also nicht nur, dass das die Tasten nichts machen während das Programm den Fokus hat, sondern dass die Tasten generell gar nichts mehr machen, egal welches Programm gerade den Fokus hat, solange diese Anwendung im Vordergrund oder Hintergrund läuft.

1
FaTech  02.02.2021, 00:12
@PeterKremsner

Ja gut, klar, kann beides sein und dann würde es wirklich nicht gehen

1
Palladin007  02.02.2021, 01:06
@FaTech

Meines Wissens nach funktioniert so ein Hook generell, auch wenn das Programm im Hintergrund läuft.

Es macht bloß kein Spiel, die müssen ja nur beobachten, ob sie den Fokus haben oder nicht.

0