如何捕获 Ctrl+Shift+N?
How can I capture Ctrl+Shift+N?
在一些 Cyberintelligensia 的帮助下,我现在可以使用 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) 捕获它并从那里使用它。但是,您无法知道这一点...
在一些 Cyberintelligensia 的帮助下,我现在可以使用 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()
:
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) 捕获它并从那里使用它。但是,您无法知道这一点...