4

在标准 .NET 中,存在 ToAscii/ToUnicode 和 MapVirtualKey 函数来处理此功能,尽管似乎尚未将等效函数或库引入 Metro/WinRT。如果 Metro/WinRT 中实际上没有公开的等效函数或库,那么这将使自定义文本输入框很难在美国以外的国家/地区推向市场。具体示例:在我的自定义控件中,如果法语键盘用户按下 è、ù、é 或 à 键,则无法将它们翻译成正确的字符。例如,è 使用 VirtualKey.Number7 的扫描码,据我所知,没有办法知道键盘布局,也没有简单的方法可以根据当前键盘布局翻译该扫描码。有没有人有这方面的一些信息?

4

3 回答 3

2

我想这取决于你在寻找什么。如果您正在寻找一个简单的英文字母或数字,您可以这样做:

private static char? ToChar(VirtualKey key, bool shift)
{
    // convert virtual key to char
    if (32 == (int)key)
        return ' ';

    VirtualKey search;

    // look for simple letter
    foreach (var letter in "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
    {
        if (Enum.TryParse<VirtualKey>(letter.ToString(), out search) && search.Equals(key))
            return (shift) ? letter : letter.ToString().ToLower()[0];
    }

    // look for simple number
    foreach (var number in "1234567890")
    {
        if (Enum.TryParse<VirtualKey>("Number" + number.ToString(), out search) && search.Equals(key))
            return number;
    }

    // not found
    return null;
}

祝你好运!

于 2014-03-06T23:51:13.327 回答
2

对于 WinRT(以 TextBox 为例,仅选择 Letters):

 CoreWindow.GetForCurrentThread().CharacterReceived += TextBox_CharacterReceived;
 void TextBox_CharacterReceived(CoreWindow sender, CharacterReceivedEventArgs args)
    {
        char c = Convert.ToChar(args.KeyCode);
        if (char.IsLetter(c))
        {
           ...
        }
    }

对于取消 de char 条目:

TextBox textBoxData;

void TextBox_KeyDown(object sender, KeyRoutedEventArgs e)
    {
        textBoxData = sender as TextBox;
        if (e.Key!=VirtualKey.Space)
        e.Handled = true;
    }

可选的:

void TextBox_Paste(object sender, TextControlPasteEventArgs e)
   {
       e.Handled = true;
   }

并修改 CharacterReceived:

if (char.IsLetter(c))
   {
     textBoxData.Text += c;
     textBoxData.SelectionStart = textBoxData.Text.Length;
    }

警告!如果您的 TextBox 有 MaxLength 您必须修改您的代码:

if (char.IsLetter(c) && textBoxData.Text.Length < textBoxData.MaxLength)
于 2015-08-31T16:09:03.903 回答
0

您可以使用 Win32 API 函数 MapVirtualKey 将虚拟键映射到一组值,其中一个是字符值。MapVirtualKey 似乎使用当前设置的键盘布局(未记录)。要使用指定的布局,您可以使用 MapVirtualKeyEx。

MapVirtualKey 不考虑是否按下 Shift。要在按下 Shift 时轻松获取信息,您可以使用 GetKeyState(不幸的是,WinRT 团队无法轻松获取修饰键的状态)。

以下是如何将虚拟键转换为字符的示例:

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

[DllImport("user32.dll")]
private static extern short GetKeyState(uint nVirtKey);

private const uint MAPVK_VK_TO_CHAR = 0x02;

private const uint VK_SHIFT = 0x10;

private char TranslateVirtualKeyIntoChar(VirtualKey key)
{
   char c = (char)MapVirtualKey((uint)key, MAPVK_VK_TO_CHAR);
   short shiftState = GetKeyState(VK_SHIFT);
   if (shiftState < 0)
   {
      // Shift is pressed
      c = char.ToUpper(c);
   }
   return c;
}

更新

不幸的是,此解决方案不适用于必须经过认证的 Windows 应用商店应用程序。认证失败,因为使用了 MapVirtualKey 和 GetKeyState 不受支持的 API。这也意味着这个解决方案很可能不会在 WinRT 下运行。

于 2012-12-02T08:46:54.707 回答