如何捕获 Ctrl+Shift+N?

How can I capture Ctrl+Shift+N?

在一些 Cyber​​intelligensia 的帮助下,我现在可以使用 Ctrl+[一些可显示键]、Ctrl+Shift+[一些可显示键] 和 Ctrl+Shift+Alt+[一些可显示键] 的组合来将重音字符添加到文本框中。

问题及其答案是

然而,还有一个顽强的组合。我使用 CodeCaster 的建议添加对 "Debug.WriteLine(keyData);" 的调用以查看正在按下的是什么(哪些键)。这在大多数情况下都很好用;例如,如果我捣碎 "Ctrl+Shift+E" 它报告:

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

所以它的响应如我所料,并在文本框中输入了“É”。该技术帮助我了解了响应“!”所需的内容。字符 (D1).

但是,有一个组合键是无法识别的,即"Ctrl+Shift+N"(Ctrl+N有效)。当我按下 "Ctrl+Shift+N" 时,输出 window 报告:

ControlKey, Control
ShiftKey, Shift, Control

IOW,它缺少预期的 "N",因此没有向文本框添加任何内容(应添加“Ñ”)。

这是唯一失败的案例;所有其他组合键都有效。

Ctrl+N 可以 工作。我在文本框中看到“ñ”并得到:

ControlKey, Control
N, Control

...在输出中 window.

为什么 Ctrl+Shift+N 和弦中的 "N" 不是 "heard",我该如何纠正?

这是我现在的代码:

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;

...来自 here 但它无济于事。

更新 2

奇怪的是,用于打开记事本的 Ctrl+Shift+N 键盘快捷键不再适用于我的桌面(我正在使用正在讨论的实用程序),但它确实 在远程桌面会话中工作(我在其中处理 Sharepoint 内容)。

远程桌面连接真的拦截了桌面上的击键吗?

即使从远程桌面会话注销,"blind spot" (Ctrl+Shift+N) 仍保留在此桌面实用程序中。

请试试这个。它会告诉我们是否其他人已经通过 RegisterHotkey():

将 Ctrl-Shift-N 注册为热键组合
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.");
    }

}

如果返回时说该组合已在您的系统上注册,则它不会到达您的应用程序,因为注册该组合的应用程序已经"consumed"该组合。

如果该组合未注册,则可能是另一个应用程序通过低级键盘钩子 (WH_KEYBOARD_LL) 捕获它并从那里使用它。但是,您无法知道这一点...