2

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はキーストロークをシミュレートしているだけなので、フックはそれをキャッチしません。誰かが回避策を考えていますか?

4

2 に答える 2

6

複雑さをすべて隠すこの非常にクールなライブラリを使用することをお勧めします。Windows入力シミュレーターは、http://inputsimulator.codeplex.com/から入手できます。

WindowsのSendInput関数に基づいていると思います。

于 2012-12-28T16:37:53.830 に答える
2

keybd_event(はるかに単純で簡単な)または(より新しく、より多くの機能を備えた)関数をp /呼び出しできますSendInput。これらの関数は、はるかに低いレベルでキーボード入力をシミュレートします。

于 2012-12-28T16:16:11.293 に答える