@キーの識別子を教えてもらえますか?
たとえば、keys.EscapeはESCキー用です。@のためにそれが何であるか知りたいです
ありがとうございました。
KeyCodeは、 KeyDownイベントとKeyUpイベントで取得するものです。これはシフトされた文字であるため、キーボードのレイアウトによって異なります。私の知る限り、ほとんどのキーボードは2桁より上にあり、(WinForms)をチェックすることを意味します。しかし、ほとんどの国際的なキーボードでは、これは機能しません。e.Shift && e.KeyCode == Keys.D2
ただし、KeyPressイベントの処理の方がはるかに信頼性が高いことに注意してください。e.KeyChar == '@'
編集:私はこのページをざっと見てみました、そしてほとんどの国際的なキーボードはキーの"
上に2
あり、Alt-何かを使ってを取得し@
ます。
@は数字2と同じキーであるため、私のキーボードではKeys.D2です。
ただし、KeyPressイベントを処理する場合は、KeyPressEventArgs.KeyCharプロパティを持つ引数でKeyPressEventArgsを取得します。また、このプロパティには、キーコードではなく文字が含まれています。
@のような入力キーを認識するためにKeyDownイベントを使用しないでください。仮想キーコード(KeyEventArgs.KeyData)から入力キーへの変換は、キーボードレイアウトによって異なります。おそらく英国と米国では異なりますが、どこかで搾り取るポンドがあります。そして、極東の場所にあるキーボードでは確かに異なります。
代わりにKeyPressedイベントを使用してください。
まず、キーボードレイアウトを調べるために必要なOS呼び出しをラップするクラスが必要です。
public class KeyboardPointer : IDisposable
{
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
static extern short VkKeyScanEx(char ch, IntPtr dwhkl);
[DllImport("user32.dll")]
static extern bool UnloadKeyboardLayout(IntPtr hkl);
[DllImport("user32.dll")]
static extern IntPtr LoadKeyboardLayout(string pwszKLID, uint Flags);
private readonly IntPtr pointer;
public KeyboardPointer(int klid)
{
pointer = LoadKeyboardLayout(klid.ToString("X8"), 1);
}
public KeyboardPointer(CultureInfo culture)
:this(culture.KeyboardLayoutId){}
public void Dispose()
{
UnloadKeyboardLayout(pointer);
GC.SuppressFinalize(this);
}
~KeyboardPointer()
{
UnloadKeyboardLayout(pointer);
}
public bool GetKey(char character, out Keys key)
{
short keyNumber = VkKeyScanEx(character, pointer);
if(keyNumber == -1)
{
key = Keys.None;
return false;
}
key = (System.Windows.Forms.Keys)(((keyNumber & 0xFF00) << 8) | (keyNumber & 0xFF));
return true;
}
}
次に、実行する場合:
Keys atKey;
bool hasAtKey;
using(var keyboard = new KeyboardPointer(CultureInfo.CurrentCulture))
hasAtKey = keyboard.GetKey('@', out atKey);
hasAtKey
キーボードにのキーの組み合わせがある場合はtrueになります@
。この場合atKey
、対応する値が保持され、そうでない場合は。が保持されKeys.None
ます。
たとえば、実行するとatKey
値Keys.Oemtilde | Keys.Shift
が含まれますが、渡すようにコードを変更すると、がCultureInfo.GetCultureInfo("en-US")
含まれますKeys.D2 | Keys.Shift
。
ご覧のとおりKeyboardPointer
、カルチャと数値IDの両方を受け入れるように記述されているため、カルチャのプライマリキーボードだけでなく、Dvorakレイアウトなどのその他のレイアウトも使用できます。
上記はすべてWindowsのUser32関数への呼び出しを使用しているため、他のプラットフォームでは別のアプローチが必要になります。