检测 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

在KeyDown事件上检测星号键

来自分类Dev

在KeyDown事件上检测星号键

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

捕获PictureBox上的KeyDown事件

来自分类Dev

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

来自分类Dev

Keydown事件未触发

来自分类Dev

VueJs keydown 事件堆积

来自分类Dev

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

来自分类Dev

具有WPF KeyDown事件的多个键

来自分类Dev

使用WPF KeyDown事件了解多个键

来自分类Dev

按住Shift键时的Keydown事件行为

来自分类Dev

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

来自分类Dev

Ace编辑器上的Keydown事件

来自分类Dev

removeEventListener不会删除keydown上的事件

来自分类Dev

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

来自分类Dev

删除KeyDown事件后的延迟?

来自分类Dev

onSelectRow方法内的Keydown事件

来自分类Dev

防止KeyDown事件识别SendKeys

来自分类Dev

mac Swift多个keyDown事件

来自分类Dev

页面上的WPF KeyDown事件

来自分类Dev

onSelectRow方法内的Keydown事件

来自分类Dev

防止KeyDown事件识别SendKeys

来自分类Dev

NSView不会捕获keyDown事件

来自分类Dev

删除KeyDown事件后的延迟?

来自分类Dev

没有触发KeyDown事件