【问题标题】:Check keypress after another keypress in console application (GetAsyncKeyState C#)在控制台应用程序中的另一个按键后检查按键(GetAsyncKeyState C#)
【发布时间】:2020-10-16 00:04:34
【问题描述】:

我想检查用户是否会在第一次按下后再次按下以在一段时间内实现暂停功能。控制台窗口不在焦点上,所以我不能使用 Console.Read()

while (true)
        {
            if (GetAsyncKeyState(0x21) != 0) 
                break;  //work just fine, if ESC press it exit while
            if (GetAsyncKeyState(0x05) != 0)
            {
                sw.Start();
                while (sw.ElapsedMilliseconds < 2000)
                {
                    // if side mouse button is press, it wait 2sec, work just fine
                }
                sw.Reset();
            }
            if (GetAsyncKeyState(0x42) != 0)
            {

                while (GetAsyncKeyState(0x42) == 0)
                {

                   // wait the second B pressing to resume  but it dosen't work

                }
             
            }

  main_function();

}

这段代码似乎不起作用,我用 writeline 检查了 GetAsyncKeyState,它似乎在几毫秒内获得了按键状态,因此暂停 cicle 将结束。 我似乎在控制台 c# 中我不能使用 c# 具有的特殊功能来检查它。

谢谢!

【问题讨论】:

  • 您在寻找什么按键?你想知道他们是否多次按下它?...还是按住它?有什么理由不在循环中使用Console.Read()?详细说明这里应该发生的事情。
  • 如果有人按下 B,我只想暂停主循环,当他们再次按下它时恢复它,所以在循环开始时,我只检查 B 是否被按下(0x42),如果如果再次按下。前两个检查工作正常。
  • 看看previous SO answer 是否适合你。从技术上讲,它是一个从不显示表单的 WinForms 应用程序,但它允许您捕获按键。可以使用类似的技术来使用 WH_MOUSE_LL 捕获鼠标。

标签: c# keypress


【解决方案1】:

解决办法是:

    // if pressed the first time
    if (GetAsyncKeyState('B'))
    {
        //if previously detected and still held down
        while (!((GetAsyncKeyState('B')) & 0b1000'0000'0001)) 
        {
            //wait in here
        }

        //if key not pressed
        while (!GetAsyncKeyState('B')) 
        {
            //wait in here
        }

        //if you get here, B was pressed, released and pressed again
    }

我不建议将 GetASyncKeyState 用于快速简单的概念证明,因为您将在下面阅读。

来自MSDN

返回值 类型:短

如果函数成功,则返回值指定自上次调用 GetAsyncKeyState 以来是否按下了键,以及该键当前是向上还是向下。如果设置了最高有效位,则按键按下,如果设置了最低有效位,则在上一次调用 GetAsyncKeyState 之后按键被按下。

重要提示:

虽然返回值的最低有效位指示自上次查询以来是否已按下键,但由于 Windows 的抢占式多任务性质,另一个应用程序可以调用 GetAsyncKeyState 并接收“最近按下”位而不是你的申请。严格保留返回值的最低有效位的行为是为了与 16 位 Windows 应用程序(非抢占式)兼容,不应依赖。

【讨论】:

    猜你喜欢
    • 2021-12-16
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 2016-03-07
    • 2020-11-29
    • 2010-11-18
    相关资源
    最近更新 更多