Laden...

TreeView: KeyEvent Strg+C wird nicht erkannt

Erstellt von beck's vor 13 Jahren Letzter Beitrag vor 13 Jahren 7.033 Views
B
beck's Themenstarter:in
10 Beiträge seit 2011
vor 13 Jahren
TreeView: KeyEvent Strg+C wird nicht erkannt

Hallo Zusammen,

ich möchte den Text von einen Knoten (via Shortcut Strg+C) kopieren. Wenn ich aber einen Knoten im TreeView selektiere und dann Strg+C drücke, das Ereignis liefert mir nicht die gewünschte Ergebnis (siehe unten). Ich habe sogar eine Ausgabe eingebaut, um zu sehen was in dem Objekt-KeyEventArgs steht, egal was gedrückt wird. Hier unten steht ein Beispiel für Strg+C und dort kann man sehen, dass nur die Taste Strg erkannt wird und die Taste 'C' wird einfach ignoriert.
Könnte mir jemand helfen warum es so ist?

 
private void treeView1_KeyDown(object sender, KeyEventArgs e)
        {
            System.Console.WriteLine(e.KeyCode.ToString() + " " + e.Control + " " + e.KeyData.ToString() + " " + e.KeyValue.ToString());
            if (e.Control & (e.KeyCode == Keys.C))
            {
                
            }
        }

Ausgabe:

ControlKey True ControlKey, Control 17
ControlKey True ControlKey, Control 17
ControlKey True ControlKey, Control 17
ControlKey True ControlKey, Control 17

Grüße

PS: übrigens, ich habe hier im Forum keine Lösung dafür gefunden. Nicht dass Ihr meint, ich habe die "Suche" nicht benutzt.

M
164 Beiträge seit 2009
vor 13 Jahren

So müsste es funktionieren:

// im konstruktor
this.treeView.CommandBindings.AddRange(this.CreateCopyPasteCutCommandBindings());
        protected ICollection CreateCopyPasteCutCommandBindings()
        {
            return new List<CommandBinding>
                       {
                           new CommandBinding(
                               ApplicationCommands.Copy,
                               (s, e) => this.MyCopy(),
                               (s, e) => e.CanExecute = this.MyCanCopy()),
                           new CommandBinding(
                               ApplicationCommands.Cut,
                               (s, e) => this.MyCut(),
                               (s, e) => e.CanExecute = this.MyCanCut()),
                           new CommandBinding(
                               ApplicationCommands.Paste,
                               (s, e) => this.MyPaste(),
                               (s, e) => e.CanExecute = this.MyCanPaste())
                       };
        }

Edit: sorry - das wäre die Lösung für WPF 😉

4.942 Beiträge seit 2008
vor 13 Jahren

(Hallo martin0, du hast dich im Sub-Forum vertan hier ist WinForms, nicht WPF 😉

Und hallo beck's,

ich hatte es mal so gelöst:


void textBox_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
	if(e.KeyChar == 0x03) // CTRL+C
           // ...
}

(der Trick ist, daß die Strg+<Buchstabe> im KeyPress als 1 (0x01) bis 26 (0x1A) übergeben werden).

Im Internet habe ich auch noch für KeyDown


if (e.KeyData == (int)Keys.Control + (int)Keys.C)

gefunden.

B
beck's Themenstarter:in
10 Beiträge seit 2011
vor 13 Jahren
  
void textBox_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)  
{  
  if(e.KeyChar == 0x03) // CTRL+C  
           // ...  
}  
  

(der Trick ist, daß die Strg+<Buchstabe> im KeyPress als 1 (0x01) bis 26 (0x1A) übergeben werden).

Hallo, leider es funktioniert nicht, die Methode wird erst dann aufgerufen, wenn ich nur eine Tase ohne "STRG" drücke. Wenn aber STRG+C gedrück wird, dann wird das Event KeyPress nicht aufgerufen.
Das andere Beispiel ist nicht mal kompilierbar. Es kann doch in .NET nicht so schwierig sein einen Text aus TreeView oder TextBox zu kopieren.

Grüße

S
11 Beiträge seit 2011
vor 13 Jahren

Hi! Probier mal folgendes:

        private void treeView1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Modifiers == Keys.Control && e.KeyCode == Keys.C)
                Debug.WriteLine("Works!");
        }

Das gleiche auch für Textbox

😃

mfg Sanny

S
341 Beiträge seit 2008
vor 13 Jahren

Servus,

versuchs doch mal 2 '&' und nicht mit einem 😉

private void treeView1_KeyDown(object sender, KeyEventArgs e)
        {
            System.Console.WriteLine(e.KeyCode.ToString() + " " + e.Control + " " + e.KeyData.ToString() + " " + e.KeyValue.ToString());
            if (e.Control && (e.KeyCode == Keys.C))
            {

            }
        }

[edit]
Die Erklärung warum: Operator & (C#-Referenz)
[/edit]

**Nur die Kenner können mit 10 Fingern bis 1023 zählen !!**
private int Main()
{
   string programmingSkills = getMySkills("programming")
   return = 1;
}
B
beck's Themenstarter:in
10 Beiträge seit 2011
vor 13 Jahren

@Sanny: keine Ahnung aber bei mir funktioniert es nicht. Nachdem ich strg-Taste gedrück habe wird das Event treeView1_KeyDown zyklisch ausgelöst aber nach dem ich noch zusätzlich die Taste 'C' drücke, dann wird das Event nicht mehr abgefeuert, d.h. die 'C'-taste wird nicht mehr erkannt.

S
11 Beiträge seit 2011
vor 13 Jahren

Hi Becks,

Poste mal dein Code...
Bei mir funktionierts einwandfrei...

Hat Smou's Beitrag dich weitergebracht?

mfg Sanny

B
beck's Themenstarter:in
10 Beiträge seit 2011
vor 13 Jahren

Hi Becks,
Poste mal dein Code...
Bei mir funktionierts einwandfrei...
Hat Smou's Beitrag dich weitergebracht?
mfg Sanny

Mein Code habe ich eigentlich oben gepostet. Bis jetzt habe ich alle Vorschläge ausprobiert und es will nicht funktionieren. Übrigens ich benutze .Net 4.0

private void treeView1_KeyDown(object sender, KeyEventArgs e)
        {
            System.Console.WriteLine(e.KeyCode.ToString() + " " + e.Control + " " + e.KeyData.ToString() + " " + e.KeyValue.ToString());

            if (e.KeyCode == Keys.C)
            {

            }
            if (e.Modifiers == Keys.Control && e.KeyCode == Keys.C)
            {
                System.Console.WriteLine("Works!");
            }
            //if (e.Control & (e.KeyCode == Keys.C))
            //{
                
            //}
        }

        private void treeView1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 0x03)
            {
                
            }
        }
S
341 Beiträge seit 2008
vor 13 Jahren

Was gibt er dir denn als Keychar zurück wenn du strg + C gedrück hälts und keypress registriert hast?

**Nur die Kenner können mit 10 Fingern bis 1023 zählen !!**
private int Main()
{
   string programmingSkills = getMySkills("programming")
   return = 1;
}
B
beck's Themenstarter:in
10 Beiträge seit 2011
vor 13 Jahren

Was gibt er dir denn als Keychar zurück wenn du strg + C gedrück hälts und keypress registriert hast?

genau hier liegt der Hund begraben, eben nichts. Nach dem ich nur _strg _ gedrückt halte gibt er _:::

Die Ausgabe basiert auf diesem Code:


private void treeView1_KeyDown(object sender, KeyEventArgs e)
        {
            System.Console.WriteLine(e.KeyCode.ToString() + " " + e.Control + " " + e.KeyData.ToString() + " " + e.KeyValue.ToString());
}

S
341 Beiträge seit 2008
vor 13 Jahren

Sei so freundlich und versuch es mit keyPress und nicht mit KeyDown. 😉


private void treeView1_KeyPress(object sender, KeyPressEventArgs e)
        {
            System.Console.WriteLine(e.KeyCode.ToString() + " " + e.Control + " " + e.KeyData.ToString() + " " + e.KeyValue.ToString());
            if (e.KeyChar == 0x03)
            {
                   System.Console.WriteLine("Works!");
            }
        }

**Nur die Kenner können mit 10 Fingern bis 1023 zählen !!**
private int Main()
{
   string programmingSkills = getMySkills("programming")
   return = 1;
}
B
beck's Themenstarter:in
10 Beiträge seit 2011
vor 13 Jahren

Sei so freundlich und versuch es mit keyPress und nicht mit KeyDown. 😉

hier ist noch schlimmer 😉 die 'STRG'-taste wird nicht geloggt, d.h. das Event wird nicht abgefeuert auch nicht, wenn ich STRG+C drücke. Es wird nur dann aufgerufen, wenn ich nur die Taste 'C' drücke ?( X( es schaut so aus, dass die STRG - Taste Probleme verursacht, bzw. .NET 4.0 und Windows XP. Unten steht der Code, wie ich es ausprobiert habe:

private void treeView1_KeyPress(object sender, KeyPressEventArgs e)
        {
            System.Console.WriteLine(e.KeyChar);
            if (e.KeyChar == 0x03)
            {
                System.Console.WriteLine("Works!");
            }
        }

Ausgabe: c

S
341 Beiträge seit 2008
vor 13 Jahren

Also ich weiß nicht was du da bastelst aber genau dein code wirft bei mir "Works" in die Console....

**Nur die Kenner können mit 10 Fingern bis 1023 zählen !!**
private int Main()
{
   string programmingSkills = getMySkills("programming")
   return = 1;
}
B
beck's Themenstarter:in
10 Beiträge seit 2011
vor 13 Jahren

Also ich weiß nicht was du da bastelst aber genau dein code wirft bei mir "Works" in die Console....

hmmm.....ich versuche da weiter zu suchen.

1.665 Beiträge seit 2006
vor 13 Jahren

Erstell dir eine eigene TreeView Klasse, die von TreeView erbt und dann:
Control verliert Focus durch Pfeiltasten...

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo beck's,

vermutlich wird Strg+C (also Copy/Zwischenablage) als Kommando interpretiert (ProcessCmdKey), nicht als Eingabe (KeyDown/Press/Up).

herbivore

4.942 Beiträge seit 2008
vor 13 Jahren

Hallo beck's

sorry, meinte


if (e.KeyValue == (int)Keys.Control + (int)Keys.C)

Hast du evtl. ein Menü bei dir definiert, wo du Ctrl+C als ShortCut eingetragen hast? (Dann wird dieses immer ausgelöst und es kommt nie im Control an!)

Oder hast du Form.KeyPreview gesetzt (d.h. 'true') und fragst im Form-KeyEvent schon diese Tastenkombi ab, bzw. gibst diese nicht weiter?

Ich würde dir aber jetzt auch mal raten, ein neues Testprojekt aufzusetzen und diese Funktionalität alleine auszuprobieren (und dann nachher den Fehler in deinem eigentlichen Programm zu suchen)!