在一些Cyberintelligensia的帮助下,我现在可以使用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,但这无关紧要。
奇怪的是,用于打开记事本的Ctrl + Shift + N键盘快捷键不再适用于我的桌面(我正在使用正在讨论的实用程序),但它 在远程桌面会话(我处理Sharepoint的东西)。
远程桌面连接是否真的拦截了桌面上的击键?
即使从远程桌面会话注销,“盲点”(Ctrl + Shift + N)仍保留在此桌面实用程序中。
答案 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)捕获它并从那里使用它。但是,你无法知道这一点......