2017-07-18 27 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

相關問題