Как закрыть форму двойным кликом + комбинация клавиш(Alt + Х)
Всем доброго времени суток. Как закрыть форму при нажатии на комбинации клавишь (Alt + X) + DoubleClick() По Отдельности эти методы у меня работают но как их соеденить в один метод х3. С помошью флага какого нибудь ?
if ( ModifierKeys == Keys.Alt && e.KeyCode == Keys.X )
Enviromentr.Exit(0);
Ответы (2 шт):
Если я вас правильно понял, вы хотите закрывать форму, когда нажаты 2 кнопки и происходит ивент двойного клика. Чисто в теории, можно попробовать хранить информацию о нажатых клавишах в свойствах и при двойном клике смотреть их. Вариант мне не очень нравится, но это первое, что приходит мне в голову на ночь. Если вам срочно, то можете попробовать так...
private bool _isPressedEscape;
private bool _isPressedX;
public Form1() =>
InitializeComponent();
public event PropertyChangedEventHandler PropertyChanged;
public bool IsPressedEscape
{
get => _isPressedEscape;
set
{
_isPressedEscape = value;
OnPropertyChanged(nameof(IsPressedEscape));
}
}
public bool IsPressedX
{
get => _isPressedX;
set
{
_isPressedX = value;
OnPropertyChanged(nameof(IsPressedX));
}
}
private void Form1_Load(object sender, EventArgs e) =>
PropertyChanged += PropertyChangedEvent;
private void PropertyChangedEvent(object sender, PropertyChangedEventArgs e)
{
label1.Text = $"Escape: {IsPressedEscape}";
label2.Text = $"X: {IsPressedX}";
}
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar is (char)Keys.Escape)
IsPressedEscape = true;
else if (char.ToUpper(e.KeyChar) is (char)Keys.X)
IsPressedX = true;
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode is Keys.Escape)
IsPressedEscape = false;
else if (e.KeyCode is Keys.X)
IsPressedX = false;
}
private void Form1_DoubleClick(object sender, EventArgs e)
{
if (IsPressedEscape && IsPressedX)
MessageBox.Show("Win!");
}
protected void OnPropertyChanged(string propertyName) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
А так, если хотите отлавливать нажатия клавиш вне формы, то стоит посмотреть на GetAsyncKeyState https://stackoverflow.com/questions/32569965/how-to-use-getasynckeystate-in-c. Могу написать через данный метод реализацию, если нужно будет
p.s. INotifyPropertyChanged просто для отображения состояния нажатых кнопок
Дополню ответ Frehzy.
Основным событием будет являться двойной клик мыши. В нём проверяем, нажаты ли нужные две кнопки.
Нажатие Alt детектируем с помощью ModifierKeys.
А вот нажатие X нужно действительно сохранять в поле в событиях KeyDown/KeyUp.
При этом, если на форме есть контролы, способные принимать фокус - это, например, Button, TextBox и многие другие, - то нужно свойству KeyPreview формы задать значение true, чтобы обработчики событий срабатывали всегда.
private bool _xPressed;
public Form1()
{
//InitializeComponent();
new Button { Text = "OK", Parent = this };
new TextBox { Text = "Test", Parent = this, Top = 50 };
this.MouseDoubleClick += Form1_MouseDoubleClick;
this.KeyDown += Form1_KeyDown;
this.KeyUp += Form1_KeyUp;
KeyPreview = true; // Важно!
}
private void Form1_MouseDoubleClick(object? sender, MouseEventArgs e)
{
if (ModifierKeys == Keys.Alt && _xPressed)
this.Close();
}
private void Form1_KeyDown(object? sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.X)
_xPressed = true;
}
private void Form1_KeyUp(object? sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.X)
_xPressed = false;
}