0

WinForms、C#、AxMsTscNotSafeForScripting ツールを使用して小さなクライアントを作成し、VM で Win+R を送信する必要があります (はい、RunDialog を使用せずにアプリをリモートで起動する方法がありますが、そうする必要があります)。という名前の素敵なライブラリをすぐに見つけましInputSimulatorた。これは、メイン マシンですべてを正しくシミュレートしますが、VM には影響しません。

実際には、全体stringをメモ帳に送信できますが、VirtualKeyCodes を処理するときは何も起こりません。Google をもう少し深く掘り下げた後、WindowsAPI.SendInputwith methods の使用法を見つけまし void PressKey(char ch, bool press) void KeyDown(ushort scanCode) void KeyUp(ushort scanCode)た。

PressKeyは VM で動作していますが、KeyDown必要KeyUpな と が正しくありません。たとえば、81 は「Q」の ScanCode ですが、「.」と出力されます。メモ帳では、82 は "R" ですが、"0" になり、91 では何も表示されません。これは Windows キーです。キーボードでキーを押すと、すべてが機能するため、KeyPreview、EnableWindowsKey などの設定に問題はありません。どちらのシステムも Win7、Oracle VM VirtualBox です。

私の方法が絶望的であっても、プログラムで Win+R を VM に送信する別の方法は何ですか? 助けていただければ幸いです。

4

1 に答える 1

0

機能している理由は、それが期待するPressKeyASCII を提供しているためです。char

KeyDownKeyUpが機能しない理由は、まだ ASCII 値を指定しているためですが、スキャン コードが必要です。スキャン コードは ASCII コードと同じではありません。82 (0x52) は一般的なスキャンコード テーブルの"R"いずれにもありません。表 2 と 3 の両方で NumPad 0 であり、観察された動作と一致しています。

MapVirtualKey(Ex)を使用して、ASCII コードまたは仮想キー コードをスキャン コードに変換する必要があります。

(表 2 と 3 の両方で) 0x13のように見えます"R"が、WinKey はすべての表で異なるコードを持っているため、値をハードコードするのではなく、実行時に を使用して取得する必要がありますMapVirtualKeyEx

于 2014-12-01T15:21:18.787 に答える