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

您可以 p/invoke keybd_event(更简单、更容易)或SendInput(更新且具有更多功能)函数,它们在低得多的级别模拟键盘输入。

于 2012-12-28T16:16:11.293 回答