WindowsMobileアプリケーションのリモートコントロール機能のショートカットをシミュレートしたいと思います。可能なショートカットをサポートする必要があります(Ctrl+/またはAlt+を考えてくださいä)。
を使用keybd_event
すると、ショートカットを非常にうまくシミュレートできますが、この関数で許可されるのは仮想キーコードのみです。そこで、PostKeybdMessage
前景の窓に任意の文字を送ることができる機能を考えました。しかし、2つの呼び出しを組み合わせると、Windowsはショートカットを実行する代わりに、文字を出力するだけです。
これが私が試したことです:
- Ctrlキーをサイレントに送信する(
KEYEVENTF_SILENT
) - 通話に追加
KeyShiftAnyCtrlFlag
するPostKeybdMessage
- 呼び出しのバッファーとフラグで多くのことをしました
PostKeybdMessage
(これはかなり混乱します)
私の質問は次のとおりです。
PostKeybdMessage
ショートカットをシミュレートするために使用できますか、それとも時間を無駄にしているだけですか?可能であれば、コードサンプルで何を間違えましたか?- 特殊文字(ウムラウト、#、=、...)を一緒に送信するトリックはあり
keybd_event
ますか? - ショートカットをシミュレートする別の方法はありますか?
簡単なテストアプリケーション
public partial class ShortcutTest : Form
{
private const int KEYEVENTF_KEYUP = 0x0002;
private const int HWND_FOREGROUND = -1;
private const uint KEY_STATE_DOWN = 0x0080;
private const uint KEY_SHIFT_NO_CHARACTER = 0x00010000;
private const uint KEY_SHIFT_ANY_CONTROL = 0x40000000;
private const byte VK_CONTROL = 0x11; // Keys.ControlKey
[DllImport("coredll.dll", SetLastError = true)]
internal static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
[DllImport("coredll.dll")]
private static extern bool PostKeybdMessage(int hwnd, uint vKey, uint KeyStateFlags, uint cCharacters, uint[] pShiftStateBuffer, uint[] pCharacterBuffer);
public ShortcutTest()
{
InitializeComponent();
}
private void timer1_Tick(object sender, EventArgs e)
{
timer1.Enabled = false;
keybd_event((byte)Keys.ControlKey, 0, 0, 0);
// this would work: keybd_event((byte)Keys.X, 0, 0, 0);
// this won't work
SendChar('x');
//keybd_event((byte)Keys.X, 0, KEYEVENTF_KEYUP, 0);
keybd_event((byte)Keys.ControlKey, 0, KEYEVENTF_KEYUP, 0);
button1.Enabled = true;
}
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
button1.Enabled = false;
}
public void SendChar(char ch)
{
uint[] input = new uint[] { (uint)ch };
uint[] downStates = { KEY_STATE_DOWN | KEY_SHIFT_ANY_CONTROL };
uint[] upStates = { KEY_SHIFT_NO_CHARACTER | KEY_SHIFT_ANY_CONTROL };
PostKeybdMessage(HWND_FOREGROUND, 0, downStates[0], 1, downStates, input);
// tested with KeyShiftDeadFlag and some others, with \0 char ...
PostKeybdMessage(HWND_FOREGROUND, 0, upStates[0], 1, upStates, input);
}
}
編集:私はOpenNETCFの実装を調べたところ、SendKeys
それらは使用するkeybd_event
だけです(たとえば、「+ a」は失敗します)。