Windows Funktionstasten deaktivieren
lima-city → Forum → Programmiersprachen → Programmieren mit .NET & Mono
artikel
base
behandeln
button
code
ereignis
funktionieren
gewisse tasten
http
message
pfeil
sicher sagen
standard
steuerung
system
taste
treten
url
windows
zugewiesenen code
-
Guten Abend,
ich habe bei meinem C# WPF Jump&Run ein kleines Problem: gewisse Tasten (Space, Pfeiltaste Oben) machen nicht dass, was sie sollen, obwohl ich sie nur als alternative Tasten mit dem gleichen auszuführenedn Code ausgestattet habe. So sollte die Pfeil Oben Taste genau das selbe machen wie W, stattdessen öffnet sich oben eine art Konsole in Blau, ungefähr 20 Pixel hoch.
Ich gehe stark davon aus, dass dies Windows-Funktionen sind, z.B. die Space-Taste führt einen Button der noch selektiert ist aus, anstelle den ihr zugewiesenen Code.
Weiß jemand, wie ich solche Sachen deaktivieren kann?
Gemüße,
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ich glaube, was du suchst, ist dashier: http://msdn.microsoft.com/de-de/library/system.windows.forms.form.processcmdkey(v=vs.110).aspx
Damit solltest du die allgemeinen Controlls disablen können. Der Code dazu könnte so aussehen:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { // whatever button you wanna process if (keyData == Keys.Left || keyData == Keys.Right) { // return true to stop processing return true; } return base.ProcessCmdKey(ref msg, keyData); }
Wenn du hier ein "return true" für alle Keys machst, die nicht standard ausgeführt werden sollen, sollte das eigentlich funktionieren. Ich bin jedoch kein C# entwickler, und daher kann ich dir das so nicht sicher sagen.
Vielleicht hilft ansonsten dieser Artikel weiter: http://msdn.microsoft.com/de-de/library/windows/apps/xaml/hh868246.aspx
Liebe Grüße -
ggamee schrieb:
Wenn du hier ein "return true" für alle Keys machst, die nicht standard ausgeführt werden sollen, sollte das eigentlich funktionieren.
Leider kann ich true nicht als Rückgabewert für ein KeyDown-Event machen und auch so sag mir der Debugger das nicht alle Codeteile einen Rückgabewert haben, ich müsste das ganz unten auf True setzen, womit es keinen Sinn mehr ergeben würde...
ggamee schrieb:
Vielleicht hilft ansonsten dieser Artikel weiter: http://msdn.microsoft.com/de-de/library/windows/apps/xaml/hh868246.aspx
Hier steht:
Einige Windows-Runtime-Steuerelemente behandeln Eingabeereignisse intern. In diesen Fällen tritt ein Eingabeereignis möglicherweise nicht ein, weil der Ereignislistener den zugehörigen Handler nicht aufruft. Normalerweise wird diese Tastenteilmenge vom Klassenhandler verarbeitet, um eine integrierte Unterstützung für die Barrierefreiheit des einfachen Tastaturzugriffs bereitzustellen.
Die Button-Klasse setzt beispielsweise die OnKeyDown-Ereignisse für die Leertaste und die EINGABETASTE (sowie für OnPointerPressed) außer Kraft und leitet sie an das Click-Ereignis des Steuerelements weiter. Wenn von der Steuerelementklasse ein Tastendruck verarbeitet wird, werden die KeyDown- und KeyUp-Ereignisse nicht ausgelöst.
Das könnte sehr gut der Fehler sein, allerdings habe ich den Button mittlerweile rausgenommen und durch etwas anderes ersetzt. Dennoch denke ich, dass hier das Problem liegt.
Mein derzeitiges KeyDown-Event sieht so aus (ja, ich weiß, kein Deutsch/Englisch-Misch, Ja, ich weiß, im Objektorientierten Programmieren schreibt man die Datentypen nicht davor...):
/* Steuerung Spieler */ private void MainWindow_KeyDown_1(object sender, KeyEventArgs e) { if (e.Key == Key.Right) { if (bolObjectBuyingMode == false) { bolRechts = true; bolLinks = false; bolRunningRight = true; bolRunningLeft = false; bolStanding = false; bolKeyIsPressedRight = true; } else { bolObjektRechts = true; } } if (e.Key == Key.Left) { if (bolObjectBuyingMode == false) { bolRechts = false; bolLinks = true; bolRunningLeft = true; bolRunningRight = false; bolKeyIsPressedLeft = true; } else { bolObjektLinks = true; } } if (e.Key == Key.Up) { if (bolObjectBuyingMode == false) { if (bolSprungfreigabe == true) { bolOben = true; bolSprungZeit = true; bolWaitingForBoden = true; } } else { bolObjektOben = true; } } if (e.Key == Key.D) { if (bolObjectBuyingMode == false) { bolRechts = true; bolLinks = false; bolRunningRight = true; bolRunningLeft = false; bolStanding = false; bolKeyIsPressedRight = true; } else { bolObjektRechts = true; } } if (e.Key == Key.A) { if (bolObjectBuyingMode == false) { bolRechts = false; bolLinks = true; bolRunningLeft = true; bolRunningRight = false; bolKeyIsPressedLeft = true; } else { bolObjektLinks = true; } } if (e.Key == Key.Space) { if (bolObjectBuyingMode == false) { if (bolSprungfreigabe == true) { bolOben = true; bolSprungZeit = true; bolWaitingForBoden = true; } } else { bolObjektOben = true; } } if (e.Key == Key.W) { if (bolObjectBuyingMode == false) { if (bolSprungfreigabe == true) { bolOben = true; bolSprungZeit = true; bolWaitingForBoden = true; } } else { bolObjektOben = true; } } if (e.Key == Key.B) { if (bolKaufen == false) { bolKaufen = true; } else { bolKaufen = false; } if (intLevel == 3 && bolBuyingTutorialEnabled == true) { bolBuyingTutorial = true; } } if (e.Key == Key.Down) { bolObjektUnten = true; } if (e.Key == Key.S) { bolObjektUnten = true; } if (e.Key == Key.Enter) { if (bolRectInHand == true) { bolKaufenDone = true; } } if (e.Key == Key.Escape) { bolCancel = true; } }
Beitrag zuletzt geändert: 17.5.2014 17:13:29 von schinkenmedia -
In einem Event-Handler kannst du folgendes machen:
e.Handled = true;
Statt einem "return true;" also einfach ein "e.Handled = true".
http://msdn.microsoft.com/de-de/library/system.windows.forms.keypresseventargs.handled(v=vs.110).aspx
Ich hoffe das hilft.
Liebe Grüße -
Das klappt super! Herzlichen Dank für die Antwort! :)
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage