Как закрыть форму двойным кликом + комбинация клавиш(Alt + Х)

Всем доброго времени суток. Как закрыть форму при нажатии на комбинации клавишь (Alt + X) + DoubleClick() По Отдельности эти методы у меня работают но как их соеденить в один метод х3. С помошью флага какого нибудь ?

if ( ModifierKeys == Keys.Alt && e.KeyCode == Keys.X )
     Enviromentr.Exit(0);

Ответы (2 шт):

Автор решения: Frehzy

Если я вас правильно понял, вы хотите закрывать форму, когда нажаты 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 просто для отображения состояния нажатых кнопок

→ Ссылка
Автор решения: Alexander Petrov

Дополню ответ 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;
}
→ Ссылка