2014-07-03 166 views
0

所以,我一直在嘗試使用SendKey.Send方法和for循環,並且出於某種原因,只有當我在那裏使用它時,它纔會陷入無限循環。我試過沒有它的代碼,並且出於某種原因。C#SendKey循環卡住

private void button1_Click(object sender, EventArgs e) 
    { 
     for (int i = 0; i < trackBar2.Value; i++) 
     { 
      SendKeys.Send("{ENTER}"); 
      System.Threading.Thread.Sleep(trackBar1.Value); 
     } 
    } 

什麼似乎是問題?

*編輯:這不可能是「Enter」鍵,因爲它與其他鍵和字符串,例如同樣的事情:

SendKey.Send("a"); 
+1

當trackBar2.Value被卡住時,它的價值是什麼? –

+0

回車沒有發送到button1,導致你遞歸地按下按鈕? – MicroVirus

+0

它介於1-150之間。我認爲這不重要,因爲我嘗試了各種價值觀。 @TimRogers – Dave

回答

3

你按下按鈕1,此時顯示的代碼將被執行。然後發送Enter到button1(因爲這仍然有焦點),導致代碼再次運行等。

因此,您創建了一個循環。

如果您嘗試使用發送的不同密鑰(例如a),則由於Thread.Sleep,程序會掛起一段時間,但之後應該再次變爲響應。

0

你可以嘗試在後臺線程中運行你的SendKeys.Send("{ENTER}");。我不知道爲什麼它會阻止你的主線程,但下面的方法正在工作。

static void Main() 
    { 
     // setup some form state 
     Form form = new Form(); 

     BackgroundWorker worker = new BackgroundWorker(); 
     worker.WorkerReportsProgress = true; 

     // start the worker when the form loads 
     form.Load += delegate 
     { 
      worker.RunWorkerAsync(); 
     }; 
     worker.DoWork += delegate 
     { 
      // this code happens on a background thread, so doesn't 
      // block the UI while running - but shouldn't talk 
      // directly to any controls 
      for (int i = 0; i < 500; i++) 
      { 
       worker.ReportProgress(0, "Item " + i); 
       Thread.Sleep(150); 
      } 
     }; 
     worker.ProgressChanged += delegate(object sender, 
      ProgressChangedEventArgs args) 
     { 
      SendKeys.Send("{Enter}"); 
     }; 
     Application.Run(form); 
    } 

經過五百次迭代後,我的應用程序迴應。