Проблема с привязкой button к клавише клавиатуры C#

Доброе время суток. Возник такой вопрос в ходе разработки мини-программы. Суть такова - я нажимаю клавиши, а именно - стрелочки на клавиатуре, и они должны поменять свой цвет. Со цветом всё в порядке, но на клавиши кнопки не хотят реагировать. Если нажать мышкой на Button - она поменяет свой цвет, но на клавиатуру не реагирует : ( Подскажите, что в коде не так?
Заранее спасибо!
Пишу на C#.
KeyPreview - включён!
Использовал KeyDown. !

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Keyboard
{
    public partial class Form1 : Form

    {
        public Form1()
        {           
            InitializeComponent();         
            this.KeyDown += new KeyEventHandler(Form1_KeyDown);                 
        }
        public void Form1_Load(object sender, EventArgs e)
        {
            this.KeyPreview = true;
        }
        public void button1_Click(object sender, EventArgs e)
        {            
            button1.BackColor = Color.Green;            
        }
        public void button2_Click(object sender, EventArgs e)
        {            
            button2.BackColor = Color.Green;           
        }
        public void button4_Click(object sender, EventArgs e)
        {          
            button4.BackColor = Color.Green;          
        }
        public void button3_Click(object sender, EventArgs e)
        {           
            button3.BackColor = Color.Green;          
        }
        public void button5_Click(object sender, EventArgs e)
        {
            button1.BackColor = Color.Gainsboro;
            button2.BackColor = Color.Gainsboro;
            button3.BackColor = Color.Gainsboro;
            button4.BackColor = Color.Gainsboro;
        }
        

       *public void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == (char)Keys.Up)
            {
                button1.PerformClick();
            }
            else if (e.KeyValue == (char)Keys.Down)
            {                
                button2.PerformClick();
            }
            else if (e.KeyValue == (char)Keys.Right)
            {              
                button3.PerformClick();
            }
            else if (e.KeyValue == (char)Keys.Left)
            {            
                button4.PerformClick();
            }
        }
    }


}

В любой непонятной ситуации надо использовать отладчик или отладочный вывод.

Например, в начале Form1_KeyDown добавить что-нибудь типа

Debug.WriteLine(e.KeyValue);

и

Debug.WriteLine((char)Keys.Up);

чтобы убедиться, что

  • событие срабатывает
  • значение совпадает с ожидаемым

(вывод Debug.WriteLine можно смотреть в окне Output в VS)

Обычно лучше вместо такого создать отдельную функцию и вызывать её и тут, и при клике кнопки.

А если оно вообще не будет работать? (( Я проверял, мой Debug просто не срабатывал

Не срабатывает что? Убедитесь сначала, что смотрите в нужное место добавив например

Debug.WriteLine("Hello");

при запуске программы или при клике кнопок.

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }

        public void Form1_Load(object sender, EventArgs e)
        {
            this.KeyPreview = true;
        }
        public void button1_Click(object sender, EventArgs e)
        {
            button1.BackColor = Color.Green;
        }
        public void button2_Click(object sender, EventArgs e)
        {
            button2.BackColor = Color.Green;
        }
        public void button4_Click(object sender, EventArgs e)
        {
            button4.BackColor = Color.Green;
        }
        public void button3_Click(object sender, EventArgs e)
        {
            button3.BackColor = Color.Green;
        }

        public void button5_Click(object sender, EventArgs e)
        {
            button1.BackColor = Color.Gainsboro;
            button2.BackColor = Color.Gainsboro;
            button3.BackColor = Color.Gainsboro;
            button4.BackColor = Color.Gainsboro;
        }
        

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            switch (keyData)
            {
                case Keys.Left: // left arrow key
                    button2.BackColor = Color.Green;
                    return true;

                case Keys.Right: // right arrow key
                    button4.BackColor = Color.Green;
                    return true;

                case Keys.Up: // up arrow key
                    button1.BackColor = Color.Green;
                    return true;

                case Keys.Down: // down arrow key
                    button3.BackColor = Color.Green;
                    return true;

                    // etc.
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }

    }
}

upd

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void button1_Click(object sender, EventArgs e)
        {
            ColorizeButton(sender);
        }
        public void button2_Click(object sender, EventArgs e)
        {
            ColorizeButton(sender);
        }
        public void button4_Click(object sender, EventArgs e)
        {
            ColorizeButton(sender);
        }
        public void button3_Click(object sender, EventArgs e)
        {
            ColorizeButton(sender);
        }

        public void button5_Click(object sender, EventArgs e)
        {
            button1.BackColor = Color.Gainsboro;
            button2.BackColor = Color.Gainsboro;
            button3.BackColor = Color.Gainsboro;
            button4.BackColor = Color.Gainsboro;
        }
        

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            switch (keyData)
            {
                case Keys.Left: // left arrow key
                    ColorizeButton(button2);
                    return true;

                case Keys.Right: // right arrow key
                    ColorizeButton(button4);
                    return true;

                case Keys.Up: // left arrow key
                    ColorizeButton(button1);
                    return true;

                case Keys.Down: // right arrow key
                    ColorizeButton(button3);
                    return true;

                case Keys.Space:
                    button5.PerformClick();
                    return true;
                    // etc.
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }

        private void ColorizeButton(object sender)
        {
           ((Button)sender).BackColor = Color.Green;
        }

    }
}

Подскажите, я добавил новые клавиши и у меня не хотят работать: Shift, Alt и Ctrl. Остальные работают, в чём может быть проблема и как это обойти? ( естественно, клавиши на самой клавиатуре работают прекрасно. )

Так а в коде что?)

Я попробовал сделать вот так с клавишами Ctrl, Alt и Shift. Но это тоже не работает :frowning:
Пробовал таким же образом сделать KeyDown/KeyUp в обработчике событий, результата нет.

if (keyData == Keys.Control)
button11.BackColor = Color.Green;
 
if (keyData == Keys.Alt)
button12.BackColor = Color.Green;
 
if (keyData == Keys.Shift)
button7.BackColor = Color.Green;

Это модификаторы, не уверен, что ProcessCmdKey срабатывает когда они нажаты сами по себе. (чтобы проверить — отладчик или отладочный вывод в помощь)

Обычно их используют для комбинаций как-то так: https://stackoverflow.com/a/8029678/964478

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)    
{
    if (keyData == (Keys.Control | Keys.Alt | Keys.Q)) {
        this.Parent.Text="<CTRL> + Alt + Q Captured";

как я понял, зафиксировать нажатие ТОЛЬКО одних модификаторов - нельзя?

В KeyUp/Down скорее всего можно, если ProcessCmdKey не фиксирует.

Ok, Google. “C# handle shift pressing”, KeyEventArgs.Shift пробовали?