Как я могу захватить Ctrl + Shift + N?

С помощью некоторых из Cyberintelligensia я теперь могу использовать комбинации Ctrl + [некоторая отображаемая клавиша], Ctrl + Shift + [некоторая отображаемая клавиша] и Ctrl + Shift + Alt + [некоторая отображаемая клавиша], чтобы добавлять символы с надстрочными знаками в текстовое окно.

Вопрос и ответы на него: здесь.

Однако есть еще одна непокорная комбинация. Я использовал предложение CodeCaster, чтобы добавить вызов «Debug.WriteLine (keyData);» чтобы увидеть, что в tarnation было нажато (какие клавиши). В большинстве случаев это работает нормально; например, если я нажму «Ctrl + Shift + E», он сообщает:

ControlKey, Control
ShiftKey, Shift, Control
E, Shift, Control

Итак, он отвечает, как я и ожидал, и вводит «É» в текстовое поле. Эта техника помогла мне увидеть, что нужно для ответа на "!" персонаж (D1).

Однако есть одна комбинация клавиш, которую он не распознает, а именно «Ctrl + Shift + N» (Ctrl + N работает). Когда я нажимаю Ctrl + Shift + N, окно вывода сообщает:

ControlKey, Control
ShiftKey, Shift, Control

IOW, отсутствует ожидаемое "N", поэтому в текстовое поле ничего не добавляется (следует добавить "Ñ").

Это единственный неудачный случай; все остальные комбинации клавиш работают.

Ctrl + N работает. Я вижу "ñ" в текстовом поле и получаю:

ControlKey, Control
N, Control

... в окне вывода.

Почему «N» в аккорде Ctrl + Shift + N не «слышится» и как это исправить?

Вот код, который у меня есть сейчас:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    Debug.WriteLine(keyData);
    if (this.ActiveControl != null && this.ActiveControl is TextBox)
    {
        string replacement = "";
        TextBox tb = (TextBox)this.ActiveControl;
        bool useHTMLCodes = checkBoxUseHTMLCodes.Checked;

        // ...

        // N
        if (keyData == (Keys.Control | Keys.N))
        {
            replacement = useHTMLCodes ? "ñ" : "ñ";
        }
        else if (keyData == (Keys.Control | Keys.Shift | Keys.N))
        {
            replacement = useHTMLCodes ? "Ñ" : "Ñ"; // not working
        }

        // ...

        if (replacement != "")
        {
            tb.SelectedText = replacement;
            return true;
        }
    }

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

Как уже упоминалось, все работает, кроме кода для перехвата Ctrl + Shift + N, который должен выдавать «Ñ».

ОБНОВИТЬ

Я добавил это:

tb.ShortcutsEnabled = false;

... из здесь, но это не помогает.

ОБНОВЛЕНИЕ 2

Странно то, что сочетание клавиш Ctrl + Shift + N для открытия Блокнота больше не работает на моем рабочем столе (где я работаю с обсуждаемой утилитой), но оно действительно работает в сеансе удаленного рабочего стола. (где я работаю над материалами для Sharepoint).

Действительно ли подключение к удаленному рабочему столу перехватывает нажатия клавиш на рабочем столе?

Однако даже после выхода из сеанса удаленного рабочего стола «слепое пятно» (Ctrl + Shift + N) остается внутри этой настольной утилиты.


person B. Clay Shannon    schedule 02.07.2015    source источник
comment
Это в вашем окне верхнего уровня?   -  person rene    schedule 02.07.2015
comment
У меня работает, печатает N, Shift, Control. Итак, something обрабатывает комбинацию клавиш, прежде чем она попадет в вашу форму. У вас есть меню или другие элементы управления в этой форме, какая у вас раскладка клавиатуры, есть ли у вас программа горячих клавиш, ...   -  person CodeCaster    schedule 02.07.2015
comment
@rene: Я не понимаю, что вы имеете в виду; это единственный код в форме (кроме InitializeComponent (); в конструкторе формы).   -  person B. Clay Shannon    schedule 02.07.2015
comment
@CodeCaster: в форме нет меню; раскладка клавиатуры стандартная / ничего особенного. Нет программ с горячими клавишами, о которых я знаю (то есть ничего я не устанавливал). Если подумать, у меня был Ctrl + Shift + N, настроенный для открытия Блокнота, но это даже больше не работает. Есть ли способ временно игнорировать такие сообщения во время работы этого приложения?   -  person B. Clay Shannon    schedule 02.07.2015
comment
И эта форма запускается из вызова Application.Run ()?   -  person rene    schedule 02.07.2015
comment
@rene: он запускается с помощью затирания F5 в Visual Studio.   -  person B. Clay Shannon    schedule 02.07.2015
comment
Вы пробовали exe?   -  person TaW    schedule 02.07.2015
comment
@TaW: я запустил .exe из \ binDebug; Было бы интересно узнать, почему это будет иметь значение, откуда оно было начато.   -  person B. Clay Shannon    schedule 02.07.2015
comment
Это было бы потрясающе. Я просто спросил, потому что VS могло вмешаться ..   -  person TaW    schedule 02.07.2015


Ответы (1)


Попробуй, пожалуйста. Он сообщит нам, зарегистрировал ли кто-то еще Ctrl-Shift-N как комбинацию горячих клавиш через RegisterHotkey():

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    private const int MOD_ALT = 0x0001;
    private const int MOD_CONTROL = 0x0002;
    private const int MOD_SHIFT = 0x0004;
    private const int MOD_WIN = 0x0008;

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc);

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

    private void button1_Click(object sender, EventArgs e)
    {
        bool result = RegisterHotKey(this.Handle, 1001, MOD_CONTROL | MOD_SHIFT, (int)Keys.N);
        if (result)
        {
            UnregisterHotKey(this.Handle, 1001);
        }

        string msg = result ? " was NOT " : " WAS ";
        MessageBox.Show("The Ctrl-Shift-N combination" + msg + "already registered on your system.");
    }

}

Если это возвращается, говоря, что комбо уже было зарегистрировано в вашей системе, оно не дойдет до вашего приложения, так как комбо уже будет «использовано» приложением, которое зарегистрировало комбо.

Если эта комбинация НЕ зарегистрирована, то возможно, что другое приложение захватывает ее с помощью низкоуровневого перехватчика клавиатуры (WH_KEYBOARD_LL) и потребляет оттуда. Однако у вас не будет возможности узнать об этом ...

person Idle_Mind    schedule 02.07.2015
comment
Спасибо; Я понимаю, комбинация Ctrl-Shift-N уже была зарегистрирована в вашей системе. Значит, нет возможности вмешаться в танец и временно оттолкнуть нынешнего танцора? - person B. Clay Shannon; 02.07.2015
comment
Не то, чтобы я в курсе. Вы можете: (1) выяснить, в каком приложении есть эта комбинация, и изменить комбинацию и / или отключить это приложение, или (2) перехватить комбинацию клавиш на более низком уровне, чтобы получить ее раньше, чем это сделает другое приложение (клавиатура низкого уровня крючок через WH_KEYBOARD_LL будет работать). Вариант № 2 намного сложнее, чем текущий подход захвата комбо с ProcessCmdKey(); это все равно, что вставить крошечную кнопку в пробковую доску кувалдой. Вам нужно будет решить, стоят ли инвестиции того ... = \ - person Idle_Mind; 02.07.2015