在任何应用程序中模拟键击

时间:2012-12-28 04:18:54

标签: c# winapi keyboard keyboard-hook

如何在不是我的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只是模拟击键,所以我的钩子没有抓住它。有人想过一个解决方法吗?

2 个答案:

答案 0 :(得分:6)

我建议你使用这个非常酷的库来掩盖你的所有复杂性,这里提供的Windows输入模拟器:http://inputsimulator.codeplex.com/

我认为它基于Windows“SendInput function

答案 1 :(得分:2)

您可以p /调用keybd_event(更简单,更简单)或SendInput(更新且功能更强)的功能,可以在更低的级别模拟键盘输入。 / p>