文字列またはcharをキーオブジェクトに変換します
質問
次のコードを使用する場合:
for (int i = 0; i < text.Length; i++)
{
char c = text[i];
Keys k = (Keys)(byte)c;
MessageBox.Show(c.ToString() + "|" + k.ToString());
}
大文字のみで正しい変換を得ることができます。問題は、小文字のキャラクターも複製できる必要があり、コンバージョンエラーが発生していることです。たとえば、「e」は「numpad5」に変換され、「e」は「e」に正しく変換されます。これを攻撃するにはどうすればよいですか?入力文字列を撮影し、開発しようとしているマクロプレーヤーの仮想キープレスを作成します。
解決
それは間違ったアプローチのようです。使用を検討しましたか Sendkeys?
他のヒント
Keys
列挙は、キーが押されたときに生成された文字の文字値のまっすぐなコピーではありません。時にはそうですが、そうでないこともあります。各キープレスの値がエンコードされる方法は、 ドキュメンテーション:
このクラスには、キーボード入力の処理に使用する定数が含まれています。キーは、キーコードと単一の整数値に結合されたモディファイ因子のセットで構成されるキー値によって識別されます。キー値の4つの左桁には、キーコードが含まれています(これはWindows仮想キーコードと同じです)。キー値の4桁には、シフト、コントロール、およびALTキー用の修飾子ビットが含まれています。
答えは、必要な文字の逆ルックアップテーブルを構築することです。コードはさらに最適化できますが、自明です。必要に応じて、特別な文字を明示的に追加できます。
また、あなたの空想が必要な場合にも、辞書を同時に構築することができます。マルチキーチャーには些細な拡張機能が必要ですが、とにかくキーに直接マッピングされません。あなたがそれを要求する場合、あなたの閲覧と可能な拡張のために:
using System.Windows.Forms;
static ImmutableDictionary<char, Keys> CharVKeyLookup;
static void PopulateVKeyCharDictionary(){
var keyboardStateNormal = new byte[255]; //All keys up
var keyboardStateShift = new byte[255];
keyboardStateShift[(int)Keys.ShiftKey] = 0x80;
var charlookup = new Dictionary<char, Keys>();
for (var i = 1; i < (int) Keys.OemClear; i++){
var keys = (Keys) i;
//Verbose condition to ignore unnecessary conversions - probably a quicker way e.g. statically
if (keys == Keys.Enter || keys == Keys.Tab || keys == Keys.Space
|| (keys >= Keys.D0 && keys <= Keys.D9)
|| (keys >= Keys.A && keys <= Keys.Z)
|| (keys >= Keys.Multiply && keys <= Keys.Divide)
|| (keys >= Keys.Oem1 && keys <= Keys.Oem102)){
var normal = KeyCodeToUnicode(keys);
var shift = KeyCodeToUnicode(keys, true);
if (normal.Item2 == 1) //Ignore wierdos - extend this if you need it
charlookup[normal.Item1[0]]=keys;
if (shift.Item2 ==1)
charlookup[shift.Item1[0]]=keys|Keys.Shift; //Incl shift mod
}
}
charlookup['\n'] = Keys.Return;
charlookup['\r'] = Keys.Return;
CharVKeyLookup = charlookup.ToImmutableDictionary();
}
/// <returns>string if it exists and return code. -1=dead char, 0=no translation, 1=1 char, 2=special char </returns>
public static Tuple<string, int> KeyCodeToUnicode(Keys key, byte[] keyboardState){
var scanCode = MapVKToScanCode(key);
var result = new StringBuilder(10,10);
var language = InputLanguage.CurrentInputLanguage.Handle;//Or other method such as GetKeyboardLayout
var returnState = ToUnicodeEx(key, scanCode, keyboardState, result, 10, 0, language);
return new Tuple<string, int>(result.ToString(),returnState);
}
[DllImport("user32.dll")]
internal static extern int ToUnicodeEx(Keys wVirtKey, uint wScanCode, byte[] lpKeyState, [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszBuff, int cchBuff, uint wFlags, IntPtr dwhkl);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
internal static extern IntPtr GetKeyboardLayout(int dwLayout);
所属していません StackOverflow