如果程序已最小化或在系统托盘中,如何检测按两次 ctrl 键
我正在尝试开发 ac# 程序,当按下控制键两次时,主窗体将显示给用户。我找到了热键组合的示例,但这不是带有组合的热键,例如控制+其他键。这就像谷歌桌面应用程序,当按两次控制键时显示搜索框。
如果程序已最小化或在系统托盘中,如何检测按两次 ctrl 键
我正在尝试开发 ac# 程序,当按下控制键两次时,主窗体将显示给用户。我找到了热键组合的示例,但这不是带有组合的热键,例如控制+其他键。这就像谷歌桌面应用程序,当按两次控制键时显示搜索框。
这似乎是键盘挂钩(WH_KEYBOARD
)的情况。
您可以做的是每次按下键时捕获,并且可能在后台工作人员中比较时间差异。
给自己设置一个门槛,如果低于这个门槛,你会认为它是双击并做你需要做的事情。
未经测试的组件可能看起来像:
private readonly DateTime _originDateTime = new DateTime(0);
private DateTime _lastKeyPress;
挂钩工人:
_backgroundWorker = new BackgroundWorker { WorkerSupportsCancellation = false };
_backgroundWorker.DoWork += DoBackgroundWork;
_backgroundWorker.RunWorkerAsync();
实现 DoBackgroundWork 方法:
private void DoBackgroundWork(object sender, DoWorkEventArgs doWorkEventArgs)
{
do
{
if (_lastKeyPress != _originDateTime)
{
Thread.Sleep(DelayInMilliseconds);
DateTime now = DateTime.Now;
TimeSpan delta = now - _lastKeyPress;
if (delta < new TimeSpan(0, 0, 0, 0, DelayInMilliseconds))
{
continue;
}
}
//do stuff
} while (true);
}
并且不要忘记捕获密钥:
private void SomeEvent_KeyDown(object sender, KeyEventArgs e)
{
_lastKeyPress = DateTime.Now;
}
这是基于XPath Visualizer
使用建议的 foxx1337 之类的键盘挂钩,然后执行以下操作:
int triggerThreshold = 500; //This would be equivalent to .5 seconds
int lastCtrlTick = 0;
private void OnCtrlPress()
{
int thisCtrlTick = Environment.TickCount;
int elapsed = thisCtrlTick - lastCtrlTick;
if (elapsed <= triggerThreshold)
{
LaunchYourAppOrWhatever();
}
lastCtrlTick = thisCtrlTick;
}
按照建议进行键盘挂钩。它在CodePlex中为您提供了很好的包装,无论您的应用程序处于何种状态,您都可以获得一个简单地引发键和鼠标事件的 .NET API。
更新: 已接受答案中提到的托管包装器 .NET 库已移至此处。现在还有一个nuget 包 MouseKeyHook可用。
最近添加了对检测快捷键、组合键和序列的支持。这是一个使用示例:
void DoSomething()
{
Console.WriteLine("You pressed UNDO");
}
Hook.GlobalEvents().OnCombination(new Dictionary<Combination, Action>
{
{Combination.FromString("Control+Z"), DoSomething},
{Combination.FromString("Shift+Alt+Enter"), () => { Console.WriteLine("You Pressed FULL SCREEN"); }}
});
有关更多信息,请参阅:检测键组合和序列