【问题标题】:Simulate key stroke in any application在任何应用程序中模拟击键
【发布时间】:2012-12-13 10:10:19
【问题描述】:

如何在不是我的 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 只是模拟击键,所以我的钩子没有捕捉到它。有人想解决办法吗?

【问题讨论】:

  • 在此处查看酷炫的 Windows 输入模拟器库:inputsimulator.codeplex.com(不要将此作为答案发布,因为这些天有被诅咒的钻石版主正在删除)
  • @SimonMourier 他们为什么要删除它?
  • 因为答案中不允许链接(当周围没有文字时)(盲目应用是 - 我认为 - 愚蠢)。有关更多信息,请参阅 SO 的常见问题解答。
  • 太糟糕了,因为它正是我想要的。尝试在它周围加上一些文字并发布下面的链接,以便我可以接受它:P
  • @Simon:只要你的答案有足够的解释,人们 (1) 知道它是否有用,而无需关注链接,并且 (2) 如果链接断开,可以搜索一些东西,它应该避免被删除。

标签: c# winapi keyboard keyboard-hook


【解决方案1】:

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

我相信它是基于 Windows 的SendInput function

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 那么使用 SendInput,我的钩子应该能抓住它吗?即使 SendInput 在 KeyPressedEvent 内??
    • @PhaDaPhunk:如果你在钩子里调用SendInput,你可能会得到无限递归。
    • 真的。问题是它只有在满足特定条件时才会被调用
    猜你喜欢
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2020-06-14
    • 2015-11-01
    • 1970-01-01
    相关资源
    最近更新 更多