2014-09-10 79 views
1

因此,我的表單構造函數中有一個無限循環,它將從Twitch.tv API加載json字符串。但是這個應用程序將從任務欄運行。所以我設置了全球熱鍵,當用戶點擊F1時,應該顯示一個消息框。我面臨的問題是在循環中嘗試檢測按鍵。我需要循環的原因是我需要知道什麼時候抽動拖纜已經聯機或脫機。我嘗試做一個Windows服務,所以我不必做無限循環,但我無法檢測服務中的按鍵。我知道最好的行動方式是擺脫循環,但我不知道如何。這是代碼。檢測鍵無限循環時按下

private KeyHandler ghk; 
    private System.Timers.Timer liveTime = new System.Timers.Timer(); 
    UserInfo info; 

    public Form1() 
    { 
     InitializeComponent(); 
     ghk = new KeyHandler(Keys.F1, this); 
     ghk.Register(); 

     while (true) 
     { 
      using (var webClient = new System.Net.WebClient()) 
      { 
       var json = webClient.DownloadString("https://api.twitch.tv/kraken/streams/lirik"); 
       // Now parse with JSON.Net 
       info = new UserInfo(json); 
      } 

      info.streamLive(); 

      if (info.streamLive() && !liveTime.Enabled) 
      { 
       liveTime.Start(); 
      } 

      if (!info.streamLive()) 
      { 
       liveTime.Stop(); 
      } 
     } 
    } 

    private void HandleHotkey() 
    { 
     MessageBox.Show("hello"); 
    } 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == Constants.WM_HOTKEY_MSG_ID) 
      HandleHotkey(); 
     base.WndProc(ref m); 
    } 
} 

回答

2

好了,最簡單的解決方法是運行在另一個線程的無限循環,所以它不會阻止你的主線程,這將使其能夠收到和處理事件,像這樣:

new Thread(delegate() { 

while(true) 
{ 
//... 
} 

}).Start(); 
+0

完美正是我需要的! – Valener 2014-09-10 23:03:20