【问题标题】:Capture keystroke without focus in console在控制台中捕获没有焦点的击键
【发布时间】:2012-06-14 20:03:33
【问题描述】:

我知道有一个关于 Windows 窗体的问题,但它在控制台中不起作用,或者至少我无法让它起作用。即使控制台没有焦点,我也需要捕获按键。

【问题讨论】:

  • @saluce:全局键盘挂钩有很多正当的理由(当然也有不正当的理由)。
  • @saluce 我正在制作一个程序,这样我就可以在输入某些组合键时运行代码

标签: c# events console key


【解决方案1】:

您也可以在控制台应用程序中创建全局键盘挂钩。

这是完整的工作代码:
https://docs.microsoft.com/en-us/archive/blogs/toub/low-level-keyboard-hook-in-c

您创建了一个控制台应用程序,但必须添加对System.Windows.Forms 的引用才能使其工作。控制台应用程序没有理由不能引用该 dll。

我刚刚使用此代码创建了一个控制台应用程序,并验证了它是否按下了每个键,无论控制台应用程序是否具有焦点。

编辑

主线程将运行 Application.Run() 直到应用程序退出,例如通过调用 Application.Exit()。完成其他工作的最简单方法是启动一个新任务来执行该工作。这是执行此操作的链接代码中 Main() 的修改版本

public static void Main()
{
    var doWork = Task.Run(() =>
        {
            for (int i = 0; i < 20; i++)
            {
                Console.WriteLine(i);
                Thread.Sleep(1000);
            }
            Application.Exit(); // Quick exit for demonstration only.  
        });

    _hookID = SetHook(_proc);

    Application.Run();

    UnhookWindowsHookEx(_hookID);
}

注意

可能提供退出控制台应用程序的方法,例如根据您的特定需求按下特殊组合键时。在

【讨论】:

  • 为什么投反对票?它回答了问题并经过验证可以正常工作。
  • 应用程序卡在 Application.Run() 行。我怎样才能将此功能集成到现有的控制台应用程序中而无需等待击键?
  • @EricJ。只是为了澄清仅仅阻止 Main 返回是行不通的。需要致电Application.Run()
  • @fabriciorissetto:你是对的,那个编辑是错误的。我修好了。
  • 最后一句话的其余部分在哪里?
猜你喜欢
  • 2010-11-12
  • 2014-01-15
  • 2012-05-30
  • 2020-04-28
  • 2015-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多