1

如果程序已最小化或在系统托盘中,如何检测按两次 ctrl 键

我正在尝试开发 ac# 程序,当按下控制键两次时,主窗体将显示给用户。我找到了热键组合的示例,但这不是带有组合的热键,例如控制+其他键。这就像谷歌桌面应用程序,当按两次控制键时显示搜索框。

4

5 回答 5

1

这似乎是键盘挂钩WH_KEYBOARD)的情况。

于 2012-03-02T01:12:57.727 回答
1

您可以做的是每次按下键时捕获,并且可能在后台工作人员中比较时间差异。

给自己设置一个门槛,如果低于这个门槛,你会认为它是双击并做你需要做的事情。

未经测试的组件可能看起来像:

    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

于 2012-03-02T01:19:29.077 回答
1

使用建议的 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;
}
于 2012-03-02T01:45:35.220 回答
1

按照建议进行键盘挂钩。它在CodePlex中为您提供了很好的包装,无论您的应用程序处于何种状态,您都可以获得一个简单地引发键和鼠标事件的 .NET API。

于 2012-03-02T03:28:45.423 回答
0

更新: 已接受答案中提到的托管包装器 .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"); }}
});

有关更多信息,请参阅:检测键组合和序列

于 2018-01-24T13:52:31.933 回答