2016-01-13 113 views
2

我正在製作一個小程序,顯示numlock或capslock是否開啓或關閉(因爲我的筆記本電腦沒有這些LED,所以我覺得這樣做會很有趣)。我試圖實現的是,如果按下鍵或不按鍵,文本將會改變。到目前爲止,我所做的是程序顯示自己運行程序之前是否打開或關閉。如何讓程序對變化做出反應?如何無休止地檢查按鍵是否被按下?

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 


namespace WindowsFormsApplication3 
{ 
    public partial class Form1 : Form 
    { 

     [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)] 
     public static extern short GetKeyState(int keyCode); 


     public Form1() 
     { 

      InitializeComponent(); 

     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      looper(); 
     } 

     public void looper() 
     { 
      cLock_check(); 
      nLock_check(); 
      sLock_check(); 
     } 

     public void cLock_check() 
     { 
      bool CapsLock = (((ushort)GetKeyState(0x14)) & 0xffff) != 0; 

      if (CapsLock) 
       lbl_cLock_onOff.Text = "ON"; 
      else 
       lbl_cLock_onOff.Text = "OFF"; 
     } 
     public void nLock_check() 
     { 
      bool NumLock = (((ushort)GetKeyState(0x90)) & 0xffff) != 0; 
      if (NumLock) 
       lbl_nLock_onOff.Text = "ON"; 
      else 
       lbl_nLock_onOff.Text = "OFF"; 
     } 
     public void sLock_check() 
     { 
      bool ScrollLock = (((ushort)GetKeyState(0x91)) & 0xffff) != 0; 
      if (ScrollLock) 
       lbl_sLock_onOff.Text = "ON"; 
      else 
       lbl_sLock_onOff.Text = "OFF"; 
     } 
    } 
} 
+0

嘗試使用常量而不是幻數來更好地解釋您的含義 – TheLethalCoder

回答

1

創建一個定時器對象,給它一個合理的區間(對於大多數「響應」 UI發出300毫秒爲宜),並設置節拍處理程序調用looper方法:

Timer checkState; 

public Form1() 
{ 
    InitializeComponent(); 

    checkState = new Timer { Interval = 300}; 
    checkState.Tick += (o,e) => looper(); 
    chechState.Start(); 
} 
+0

這不是完成任務的最佳方式,更有效的方法是嚮應用程序添加消息過濾器,該過濾器會自動爲您捕獲所有按鍵 – TheLethalCoder

2

你應執行全局鍵盤掛鉤,如this article中所述。請將vkCodeVK_NUMLOCKVK_CAPITALVK_SCROLL進行比較,然後調用您的相關更新功能。

相關問題