如何捕获Ctrl + Shift + N?

时间:2015-07-02 15:18:18

标签: c# winforms keyboard modifier-key

在一些Cyber​​intelligensia的帮助下,我现在可以使用Ctrl + [某些可显示键],Ctrl + Shift + [某些可显示键]和Ctrl + Shift + Alt + [某些可显示键]的组合来添加重音chars into a textbox。

问题及其答案是here

然而,仍然存在一种顽固的组合。我使用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

...在“输出”窗口中。

为什么Ctrl + Shift + N和弦中的“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;

......来自here,但这无关紧要。

更新2

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

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

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

1 个答案:

答案 0 :(得分:4)

请试试这个。它会告诉我们其他人是否已经通过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.");
    }

}

如果这回来说组合已经在您的系统上注册,那么它将无法到达您的应用,因为组合已经被注册组合的应用“消耗”了。

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