標準の .NET には、この機能を処理する ToAscii/ToUnicode および MapVirtualKey 関数が存在していましたが、Metro/WinRT には同等の関数またはライブラリが導入されていないようです。Metro/WinRT で公開されている同等の関数またはライブラリが実際に存在しない場合、米国以外の国でカスタム テキスト入力ボックスを市場に投入することは非常に困難になります。具体的な例: 私のカスタム コントロールでは、フランス語キーボードのユーザーが è、ù、é、または à キーを押すと、正しい文字に変換できません。たとえば、è は VirtualKey.Number7 のスキャン コードを使用しますが、私が知る限り、キーボード レイアウトを知る方法や、現在のキーボード レイアウトに基づいてそのスキャン コードを変換する簡単な方法はありません。これに関する情報を持っている人はいますか?
3 に答える
何を求めているかによると思います。簡単な英語の文字または数字を探している場合は、次のように簡単に実行できます。
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;
}
頑張ってください!
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)
Win32 API関数MapVirtualKeyを使用して、仮想キーを一連の値にマップできます。そのうちの1つは文字値です。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では実行されない可能性が高いことも意味します。