检测 KeyDown 事件上的单引号键

管道

我希望 TextBox 使用 KeyDown 事件仅接受某些特定字符。我已经让它工作了,除了一个字符,单引号。为了获得将要写入的字符,我使用(char)e.KeyValue它适用于除引号之外的所有字符(它给出了 Û)。我知道我可以使用,e.KeyCode但它的价值是Keys.Oem4,AFAIK 可能因系统而异。

有没有办法始终如一地检测单引号按键?

代码片段:

char c = (char)e.KeyValue;
char[] moves = { 'r', 'u', ..., '\'' };

if (!(moves.Contains(c) || e.KeyCode == Keys.Back || e.KeyCode == Keys.Space))
{
    e.SuppressKeyPress = true;
}
管道

正如@EdPlunkett 所建议的,这个答案对我有用

[DllImport("user32.dll")]
static extern bool GetKeyboardState(byte[] lpKeyState);

[DllImport("user32.dll")]
static extern uint MapVirtualKey(uint uCode, uint uMapType);

[DllImport("user32.dll")]
static extern IntPtr GetKeyboardLayout(uint idThread);

[DllImport("user32.dll")]
static extern int ToUnicodeEx(uint wVirtKey, uint wScanCode, byte[] lpKeyState, [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszBuff, int cchBuff, uint wFlags, IntPtr dwhkl);


public static string KeyCodeToUnicode(System.Windows.Forms.Keys key)
{
    byte[] keyboardState = new byte[255];
    bool keyboardStateStatus = GetKeyboardState(keyboardState);

    if (!keyboardStateStatus)
    {
        return "";
    }

    uint virtualKeyCode = (uint)key;
    uint scanCode = MapVirtualKey(virtualKeyCode, 0);
    IntPtr inputLocaleIdentifier = GetKeyboardLayout(0);

    StringBuilder result = new StringBuilder();
    ToUnicodeEx(virtualKeyCode, scanCode, keyboardState, result, (int)5, (uint)0, inputLocaleIdentifier);

    return result.ToString();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Ace编辑器上的Keydown事件

来自分类Dev

使用Enter键无法在ContextMenuStrip上触发KeyDown事件吗?

来自分类Dev

onSelectRow方法内的Keydown事件

来自分类Dev

防止KeyDown事件识别SendKeys

来自分类Dev

使用Me.KeyDown无法检测到Ctrl + Shift + H

来自分类Dev

当另一个控件具有焦点时,窗体如何检测KeyDown事件?

来自分类Dev

删除KeyDown事件后的延迟?

来自分类Dev

在C ++中检测Enter / Return on Keydown事件

来自分类Dev

在单引号中检测两个连续的单引号

来自分类Dev

mac Swift多个keyDown事件

来自分类Dev

在KeyDown事件上检测星号键

来自分类Dev

removeEventListener不会删除keydown上的事件

来自分类Dev

捕获PictureBox上的KeyDown事件

来自分类Dev

页面上的WPF KeyDown事件

来自分类Dev

onSelectRow方法内的Keydown事件

来自分类Dev

防止KeyDown事件识别SendKeys

来自分类Dev

表单中每个文本框的KeyDown事件并检测回车

来自分类Dev

Keydown事件未触发

来自分类Dev

NSView不会捕获keyDown事件

来自分类Dev

删除KeyDown事件后的延迟?

来自分类Dev

在C ++中检测Enter / Return on Keydown事件

来自分类Dev

没有触发KeyDown事件

来自分类Dev

具有WPF KeyDown事件的多个键

来自分类Dev

使用WPF KeyDown事件了解多个键

来自分类Dev

检测多个Keyup / Keydown事件并在每个C#/ VB.Net上停止触发代码

来自分类Dev

在KeyDown事件上检测星号键

来自分类Dev

通过“ ESC”键触发事件时,未在keydown事件上提交表单

来自分类Dev

按住Shift键时的Keydown事件行为

来自分类Dev

VueJs keydown 事件堆积