Как я могу захватить 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
Итак, в нем отсутствует ожидаемое "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) остается в этой служебной программе для настольных компьютеров.
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) и потребляет его оттуда. Вы бы не знали этого, однако...