2017-07-18 31 views
0

我一直在C#中使用GetAsyncKeyState,我不明白我在这里做错了什么,我希望这输出到控制台,每次我按空间,但它没有。我在这个小问题上花费了很长时间,需要你的帮助!为什么在持有所需密钥时不输出我的文本?

namespace key_input 
{ 
    class Program 
    { 

     #region DLLS 
     [DllImport("User32.dll")] 
     private static extern short GetAsyncKeyState(int vKey); 
     #endregion 

     static void Main(string[] args) 
     { 

      if (true) 
      { 
       Console.ReadLine(); 
       while (GetAsyncKeyState(32) > 0) 
       { 
        Console.WriteLine("You are pressing the spacebar!"); 
       } 
      } 

     } 
    } 
} 
+2

[GetAsyncKeyState文档](https://msdn.microsoft.com/en-us/library/windows/desktop/ms646293(V = vs.85)的.aspx)'备注:GetAsyncKeyState功能可与鼠标按钮.' –

+0

当你的代码开始时,它会触击'ReadLine'方法并等待你按下Enter键。一旦你按下Enter键,代码就会继续进入while循环并检查键的状态。如果没有按下,程序将运行到'Main'方法的末尾并立即退出。如果空格键在检查时没有按下,它将从'while'循环中退出。 –

+1

@ blaze_125 - 此方法不能使用鼠标按钮。文档中的这种说法意味着它可以使用鼠标按钮_also_。 –

回答

1

这不会像您的代码段那样使用Interop服务,但最终的结果似乎就是您要做的。

using System; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      while (Console.ReadKey().Key == ConsoleKey.Spacebar) 
      { 
       Console.WriteLine("pressed it"); 
      } 
     } 
    } 
} 
+0

我其实很熟悉这个开始,谢谢你分享它!但使用这似乎有一个延迟,我正在寻找一个没有输入延迟的解决方案。例如,如果您使用此方法保存空间,它将输入写入控制台,然后延迟继续显示输入。 – enyap

+0

带我尝试了解你刚才所说的话......但是......我看到了你所说的“延迟”。如果您进行“单次按压”,则每个空格键都会立即写入控制台。但是,如果您持有空格键,则第一个实例会立即写入控制台,但实例2+在“延迟”后开始显示。是吗? –

+0

是的,GetAsyncKeyState没有这样的延迟。如果它有这样的延迟,我试图制作的程序就不会那么好,所以我需要它在没有延迟的情况下进行注册。 – enyap

相关问题