• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Рекция формы на нажатие клавиш

  • Автор темы @LE}{@NDER
  • Дата начала
@

@LE}{@NDER

Проблема заключается в следующем:
Есть форма, которая реагирует на нажатия клавиш. Все бы хорошо, да вот, когда добавляю кнопку на форму, форма перестает реагировать на нажатия клавиш. Комментирую кнопку, все нормально. Кто-нибудь сталкивался с подобным? В чем проблема-то собственно? Ставил брейк поинты - прога вообще не реагирует на событие нажатия клавиш.

Код инициализации формы:
[codebox]
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackgroundImage = global::MegaSnake.Properties.Resources.Background2;
this.ClientSize = new System.Drawing.Size(292, 266);
this.Controls.Add(this.CloseBtn);
this.DoubleBuffered = true;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown);
this.ResumeLayout(false);
[/codebox]

Код инициализации кнопки
[codebox]
private System.Windows.Forms.Button CloseBtn;
this.CloseBtn = new System.Windows.Forms.Button();
//
// CloseBtn
//
this.CloseBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.CloseBtn.BackColor = System.Drawing.Color.Transparent;
this.CloseBtn.FlatAppearance.BorderSize = 0;
this.CloseBtn.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(192)))), ((int)(((byte)(255)))));
this.CloseBtn.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Indigo;
this.CloseBtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.CloseBtn.Image = global::MegaSnake.Properties.Resources.CloseBtn;
this.CloseBtn.Location = new System.Drawing.Point(240, 7);
this.CloseBtn.Name = "CloseBtn";
this.CloseBtn.Size = new System.Drawing.Size(45, 45);
this.CloseBtn.TabIndex = 1;
this.CloseBtn.UseVisualStyleBackColor = true;
this.CloseBtn.Click += new System.EventHandler(this.CloseBtn_Click);
[/codebox]

Ну и обработчик нажатия на клавиши:
[codebox]
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Up:
direction = Directions.West;
break;
case Keys.Down:
direction = Directions.East;
break;
case Keys.Left:
direction = Directions.South;
break;
case Keys.Right:
direction = Directions.North;
break;
case Keys.Escape:
this.Close();
break;
}
}
[/codebox]
 
@

@LE}{@NDER

Вопрос немного меняется. Поменял клавиши со стрелками на W, S, A, D, заработало, но все равно непонятно, почему не работают стрелки.
 
D

Delegat

Сталкивался с похожей проблемой, но там тупо фокус был не на форме. Может и тут такой же косяк?
 
Y

yanny

Скорее всего. Отследи где фокус находился. На форме самой или на кнопке. Скорее всего проблема именно в этом. когда фокус на кнопке, при нажатии стрелок пытаеться поменяться фокус, а т.к. кнопка одна, то фокус на месте...
 
V

VladimirN

Скорее всего. Отследи где фокус находился. На форме самой или на кнопке. Скорее всего проблема именно в этом. когда фокус на кнопке, при нажатии стрелок пытаеться поменяться фокус, а т.к. кнопка одна, то фокус на месте...

скорее всего надо перехватовать событие вручную чтоб программа работала коректно и не зависела от фокуса , а можно сделать этот касе на нажатиях клавиш на кнопке, однако лучше будет завести все обработчики нажатия на один чтоб не путаться в коде
З.Ы: не обещаю что это самый елегентный зато рабочий способ
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!