Autor |
Beitrag |
Namenlosnameless
      
Beiträge: 259
Erhaltene Danke: 6
Windows XP Home Edition, Windos Vista
C#
|
Verfasst: Sa 08.01.11 21:36
Hallo!
Ich will für ein Projekt, einen "Cursor" mit den Pfeiltasten steuern.
Dieser Cursor wird auf einem Selbstgezeichnetem Raster herumgeschoben.
Ich kann wunderbar über W,A,S und D steuern, leider ist diese Lösung Suboptimal, da das Programm dann von der Bedienung unhandlich wird.
Ich hab das Problem: Wenn ich mit den Pfeiltasten steuern will (ich prüfe mit: if(e.KeyCode==Keys.Up) ) wird gleichzeitig der Fokus auf ein anderes Steuerelement gelegt und die if-Abfrage ergibt false bzw wird nicht angesteuert.
Wie kann ich, das Verschieben des Fokusses unterbinden?
mfg Christoph Moderiert von Kha: Topic aus C# - Die Sprache verschoben am So 09.01.2011 um 20:03
_________________ 1:<<Life sucks!!>> 2:<< Well okay>> 1: <<Just Yours>> 2:<<Ohmph>>
Zuletzt bearbeitet von Namenlosnameless am Sa 08.01.11 22:59, insgesamt 1-mal bearbeitet
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Sa 08.01.11 22:43
Hi,
setze in deinem KeyUp- bzw KeyDown-Ereignis noch zusätzlich "e.Handled":
C#-Quelltext 1: 2: 3: 4: 5:
| if(e.KeyCode == Keys.Up) { e.Handled = true; } |
P.S. Alternativ auch "e.SuppressKeyPress = true".
|
|
Namenlosnameless 
      
Beiträge: 259
Erhaltene Danke: 6
Windows XP Home Edition, Windos Vista
C#
|
Verfasst: Sa 08.01.11 23:05
Danke für die Antwort!
Leider funktioniert, das nicht so wie du es geschrieben hast:
weil,
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| if (e.KeyCode == Keys.D || e.KeyCode == Keys.Right) { e.Handled = true;
int x = selectedsquare.PosX; int y = selectedsquare.PosY; x++; if (x <= 9) { selectedsquare = playfield[(9 * (x - 1) + y - 1)]; } } |
der Programmablauf nicht bis in die äußere if-Abfrage vordringt, also auch das e.Handled nicht.
EDIT: Okay ich habe gerade beim Debuggen bemerkt, dass das Drücken der Pfeiltasten, zwar den Fokus verschiebt, aber kein KeyDown-Event auslöst!
_________________ 1:<<Life sucks!!>> 2:<< Well okay>> 1: <<Just Yours>> 2:<<Ohmph>>
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 08.01.11 23:08
Windows fragt vorher mit WM_GETDLGCODE nach, ob diese Tastendrücke von dem Control behandelt werden sollen:
msdn.microsoft.com/e...645425(v=vs.85).aspx
|
|
Namenlosnameless 
      
Beiträge: 259
Erhaltene Danke: 6
Windows XP Home Edition, Windos Vista
C#
|
Verfasst: Sa 08.01.11 23:28
sry das ich so blöd frage,
aber ich verstehe nicht wirklich was WM_GETDLGCODE macht!
Wenn ich das richtig verstanden hab, sendet Windows diese Nachricht aus und ermittelt, dann aus der Antwort, was zu tun ist?
hab jetzt auch noch ein bisschen gegoogelt, es sind aber fast alle Seiten kopien der MSDN-Hilfe
kannst du mir das Ganz etwas genauer beschreiben?
_________________ 1:<<Life sucks!!>> 2:<< Well okay>> 1: <<Just Yours>> 2:<<Ohmph>>
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 08.01.11 23:40
Richtig, wenn eine solche Taste das erste Mal gedrückt wird, schickt Windows diese Message. Je nachdem was du in dieser Message zurückgibst, behandelt Windows diesen und folgende Tastendrücke entsprechend. Wenn du also DLGC_WANTARROWS zurückgibst, sagst du Windows damit, dass du diese Tastendrücke selbst behandeln willst.
Und dann bekommst du auch die entsprechenden Key-Messages, die dann nehme ich an auch zu den normalen C#-Events führen. (Ausprobiert habe ich das in C# noch nie.)
|
|
Namenlosnameless 
      
Beiträge: 259
Erhaltene Danke: 6
Windows XP Home Edition, Windos Vista
C#
|
Verfasst: Sa 08.01.11 23:51
jaenicke hat folgendes geschrieben : | (Ausprobiert habe ich das in C# noch nie.) |
ich auch nicht
es klingt eigentlich ziemlich einfach.
Aber: wenn ich ehrlich bin, hab ich keinen Schimmer wie ich Windows mit DLGC_WANTARROWS antworten soll, bzw wie ich überhaupt die Frage abfange :S
_________________ 1:<<Life sucks!!>> 2:<< Well okay>> 1: <<Just Yours>> 2:<<Ohmph>>
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 08.01.11 23:59
Ich wusste es auch nicht, aber Google weiß wie man Windows Messages abfängt:
www.codeproject.com/...cevolumemonitor.aspx
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: So 09.01.11 11:53
Hallo,
also bei mir funktioniert das wunderbar
Hätte erwähnen sollen, das man zusätzlich bei der Form "KeyPreview = true" setzen und du dann auch das KeyDown-Ereignis des Forms benutzen solltest (nicht des "Raster"-Controls wie z.B. Panel, PictureBox o.ä.).
|
|
Namenlosnameless 
      
Beiträge: 259
Erhaltene Danke: 6
Windows XP Home Edition, Windos Vista
C#
|
Verfasst: So 09.01.11 16:15
Das Raster wird direkt auf die Form gezeichnet
ich hab schon probiert bei allen Steuerelementen, das KeyDown-Ereignis abzufangen, aber wie gesagt, die Pfeiltasten rufen kein Ereignis hervor!
Das mit den Messages ist mir zwar immer noch nicht klar, aber ich werd weiter googeln ;D
_________________ 1:<<Life sucks!!>> 2:<< Well okay>> 1: <<Just Yours>> 2:<<Ohmph>>
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: So 09.01.11 17:46
Hast du Buttons bei dir auf der Form? Du könntest auch einfach das 'Tabben' unterdrücken und für die Controls "TabStop = false" setzen.
Überprüfe auch mal ob wenigstens "Strg"- bzw. "Alt"- + Pfeiltasten in deine Methode springt.
Ansonsten gäbe es noch folgende Form-Methoden, welche du mittels Überschreiben benutzen könntest:
- ProcessCmdKey
- PreProcessMessage
- ProcessKeyMessage
Für diesen Beitrag haben gedankt: Namenlosnameless
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 09.01.11 20:36
Ok, man kann sich das Gehample mit der Windows Message sparen, da C# das schon übernimmt. Funktionieren tut es mit dem obigen Link aber auch damit. Einfacher ist es aber so (im Form selbst, KeyPreview auf true): C#-Quelltext 1: 2: 3: 4:
| protected override bool ProcessDialogKey(Keys keyData) { return false; } | Dann funktioniert z.B. das normale KeyDown.
Für diesen Beitrag haben gedankt: Namenlosnameless
|
|
Namenlosnameless 
      
Beiträge: 259
Erhaltene Danke: 6
Windows XP Home Edition, Windos Vista
C#
|
Verfasst: So 09.01.11 21:23
jaenike: hat wunderbar funktioniert, Danke
Th69: ebenfalls Danke
_________________ 1:<<Life sucks!!>> 2:<< Well okay>> 1: <<Just Yours>> 2:<<Ohmph>>
|
|