我需要做什么:
我需要从特定应用程序捕获所有快捷键按下,例如 Ctrl + S 。任何关键组合,即使它不是该应用程序的快捷方式。
然后,我的中途应用程序捕获这些密钥需要验证这些密钥组合,并检查我们正在运行的另一个应用程序是否可以响应该密钥,以及是否可以将命令发送给它。
到目前为止我有什么:
由于我们编写了其他应用程序,因此我们可以轻松发送要处理的密钥,这不是问题。我可以得到应用程序的窗口句柄。我需要捕获快捷键。这个应用程序我知道它是用C ++构建的。我希望找到一种方法来捕获Winforms中等效的以下事件:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
现在一切都在前进关键部分按预期工作。我只是错过了该句柄上的键的捕获。我真的不想冒险自己勾住整个键盘并检测是否在我的应用程序中完成击键,我是否需要取消键或继续该过程。我也希望只获得关键组合事件。当他输入文本框或其他任何东西时,我宁愿不接收那个家伙的所有信件。我真的在寻找以 CTRL , ALT , SHIFT 或其任意组合开头的任何东西
我想做的例子:
不受控制的应用程序:Notepad.exe 我的中途应用程序:ShortcutHandler.exe 我的目标应用程序:A.exe,B.exe
ShortcutHandler.exe将侦听Notepad.Exe快捷方式,然后将它们转发到A.exe和B.exe
情况:
1 - in Notepad.exe press CTRL+H for replace
2 - ShortcutHandler.exe detect CTRL+H pressed on Notepad.exe
3 - ShortcutHandler.exe Analyse CTRL+H and knows it need to do some task
4 - ShortcutHandler.exe call Save on A.exe in reaction to CTRL+H in Notepad.exe
5 - ShortcutHandler.exe call Print report in B.exe in reaction to CTRL+H in Notepad.exe
答案 0 :(得分:3)
前段时间我必须做一些像你这样的事情,所以我找到了这篇文章:A Simple C# Keyboard Hook,并且我能够做到我需要的东西。
但这是一个复杂的代码,正如你所说,你不希望得到所有关键。对于我的程序,我创建了一个(low + high) >>> 1
类,可以轻松使用上一篇文章中获得的代码。
因此,您可以使用KeyboardHook
类来执行代码片段代码:
KeyboardHook
PS:如果你把它放在你的ShortcutHandler应用程序上,应用程序仍会获得密钥。
以下是// Put this on the begin of your form (like the constructor on FormLoad).
var hook = new KeyboardHook();
hook.KeyDown += (sender, e) =>
{
// e.Control is a bool property if true Control is press.
// e.Shift is a bool property if true Shift is press.
// e.Key has a key that was press.
// This if ignores anything that don't begin with Control or Shift.
if(!e.Control && !e.Shift) return;
// your code below:
if(e.Control && e.Key == Keys.H)
{
// do your code here.
// like: Analyse CTRL+H and knows it need to do some task.
}
};
hook.Start(); // Until here goes in the begin of your form.
// Put this on the end of your form (like in the Dispose or FormClose).
hook.Release();
hook.Dispose();
代码:
KeyboardHook