10

現在、VkKeyScanWin32 APIのメソッドを使用して、文字を仮想キーコードに変換しています。しかし、これが抱えていると思われる問題は、小さなアルファベットを渡すと正常に機能するのに対し、大文字のアルファベットを渡すと、適切なキーコードが返されず、同様に「(」や「}」などの特殊文字が返されることです。 "。

どうすればこれを行うことができますか?とにかく、文字列に大文字または特殊文字が含まれているかどうかを考慮せずに、文字列を仮想の同等のものに直接変換することはできますか?

ありがとう

4

1 に答える 1

10

要件が何であるか、より具体的には適切なキーコードであると考えるものを明確にする必要があります。ドキュメントVkKeyScanで指定されているように、戻り値の下位バイトに仮想キーコードを返し、上位バイトにシフト状態を返します。

これは、メソッド'('の入力として文字を使用する以下のコードスニペットに示されています。VkKeyScan

[DllImport("user32.dll")]static extern short VkKeyScan(char ch);

static void Main(string[] args)
{
    var helper = new Helper { Value = VkKeyScan('(') };

    byte virtualKeyCode = helper.Low;
    byte shiftState = helper.High;

    Console.WriteLine("{0}|{1}", virtualKeyCode, (Keys)virtualKeyCode);
    Console.WriteLine("SHIFT pressed: {0}", (shiftState & 1) != 0);
    Console.WriteLine("CTRL pressed: {0}", (shiftState & 2) != 0);
    Console.WriteLine("ALT pressed: {0}", (shiftState & 4) != 0);
    Console.WriteLine();

    Keys key = (Keys)virtualKeyCode;

    key |= (shiftState & 1) != 0 ? Keys.Shift : Keys.None;
    key |= (shiftState & 2) != 0 ? Keys.Control : Keys.None;
    key |= (shiftState & 4) != 0 ? Keys.Alt : Keys.None;

    Console.WriteLine(key);
    Console.WriteLine(new KeysConverter().ConvertToString(key));
}

[StructLayout(LayoutKind.Explicit)]
struct Helper
{
    [FieldOffset(0)]public short Value;
    [FieldOffset(0)]public byte Low;
    [FieldOffset(1)]public byte High;
}

このスニペットを実行すると、次の出力が得られます。

// 56|D8
// SHIFT pressed: True
// CTRL pressed: False
// ALT pressed: False
// 
// D8, Shift
// Shift+8
于 2010-05-29T11:45:08.790 に答える