C#アプリケーションではないウィンドウでキーストロークをシミュレートするにはどうすればよいですか?
現在使用してSendKeys.Send()
いますが、動作しません。私はグローバルキーボードフックを持っているので、キーボードから直接入力をキャッチしSendKeys.Send()
、実際のキーボードストロークのようには見えません。
この方法で実際のキーストロークをシミュレートするのが最善です。どのアプリケーションを使用していても、プログラムは誰かがキーを押したかのようにそれをキャッチします。
私は問題の一部を見つけたと思います。これは、キーが押された場合に呼び出されるイベントです。
static void KeyBoardHook_KeyPressed(object sender, KeyPressedEventArgs e)
{
// Writes the pressed key in the console (it works)
Console.WriteLine(e.KeyCode.ToString());
// Check if pressed key is Up Arrow (it works and enters the condition)
if(e.KeyCode == Keys.Up)
{
// Send the key again. (does not work)
SendKeys.Send("{UP}");
}
}
私はこの方法でそれを試しました:
static void KeyBoardHook_KeyPressed(object sender, KeyPressedEventArgs e)
{
// Writes the pressed key in the console (it works)
Console.WriteLine(e.KeyCode.ToString());
// Check if pressed key is Up Arrow (it works and enters the condition)
if(e.KeyCode == Keys.Up)
{
// Send the key again. (does not work)
PostMessage(proc.MainWindowHandle,WM_KEYDOWN, VK_UP,0);
}
}
しかし、それも機能しません。イベント内でキーを送信したので、キーが押されたためにそれ自体が呼び出されますか?誰かがそれを必要とする場合に備えて、上記のコード。
[STAThread]
static void Main(string args)
{
KeyBoardHook.CreateHook();
KeyBoardHook.KeyPressed += KeyBoardHook_KeyPressed;
Application.Run();
KeyBoardHook.Dispose();
}
クラスが必要な場合は、KeyBoardHook
私も投稿できます。
私の推測では、私のキーボードフックは低レベルのキーボード出力をキャッチしており、SendKeys
はキーストロークをシミュレートしているだけなので、フックはそれをキャッチしません。誰かが回避策を考えていますか?