2012-01-07 19 views
-1

私は5秒間隔でテキスト行を入力するプログラムを書いています。さて、私がしようとしているのは、各文字の間に小さなスペースを置いて、文字でテキスト文字を入力する関数を追加することです。私はThread.Sleepを使用しようとしていますが、私のプログラムがクラッシュしてしまい、理由がわかりません。間隔で文字を入力する方法は?

これを正しく行うにはどうすればよいですか?

private void Interval(object sender, EventArgs e) 
    { 
     if (cbPause.Checked == false) 
     { 
      SendKeys.Send(txtText.Text + "{enter}"); 

      if (tbType.SelectedTab == tbInterval) tmrInterval.Interval = int.Parse(nudInterval.Value.ToString()); 
      if (tbType.SelectedTab == tbRange) tmrInterval.Interval = random.Next(int.Parse(nudMin.Value.ToString()), int.Parse(nudMax.Value.ToString())); 
     } 
     else if (cbPause.Checked == true) 
     { 
      Random random = new Random(); 

      foreach (char character in charList) 
      { 
       SendKeys.Send(character.ToString()); 
       Thread.Sleep(1000); 
      } 

      SendKeys.Send("{enter}"); 
     } 
    } 

    private void btnStart_Click(object sender, EventArgs e) 
    { 
     if (txtText.TextLength < 1 || txtText.Text == string.Empty) 
     { 
      lblMessage.Text = "You must type text to proceed!"; 
      btnStart.Enabled = false; 
     } 
     else 
     { 
      foreach (char character in txtText.Text) 
      { 
       charList.Add(character); 
      } 

      if (tbType.SelectedTab == tbInterval) 
      { 
       tmrDelay.Enabled = true; 

       txtText.Enabled = false; 
       nudInterval.Enabled = false; 
       nudMin.Enabled = false; 
       nudMax.Enabled = false; 
       btnStart.Enabled = false; 
       btnStop.Enabled = true; 
      } 

      if (tbType.SelectedTab == tbRange) 
      { 
       tmrDelay.Enabled = true; 
       tbType.Enabled = false; 
       txtText.Enabled = false; 
       nudInterval.Enabled = false; 
       nudMin.Enabled = false; 
       nudMax.Enabled = false; 
       btnStart.Enabled = false; 
       btnStop.Enabled = true; 
      } 

      lblMessage.Text = "Starting auto typing in: 3"; 
     } 
    } 
+4

コードヒントを:もしあなたが 'if(x == true){/ * ... * /} else if(x == false){/ * ... * /}' {/ * ... * /} else {/ * ... * /} '。 – Ryan

+0

また、あなたは何を得ているのですか? – Ryan

+0

@minitech、まったく、リモートマシンからログアウトするまでハングアップしません。 – HelpNeeder

答えて

3

あなたがThread.Sleepを呼び出した場合、これはあなたのGUIのスレッドをハングアップする予定です。

私がやることは、System.Windows.Forms.Timerを使用し、すべてTickに次の文字を入力してください。

public partial class Form1 : Form 
{ 
    Timer timer; 
    string str; 
    int char_num; 

    public Form1() 
    { 
     InitializeComponent(); 
     timer = new Timer(); 
     timer.Tick += timer_Tick; 
    } 

    void timer_Tick(object sender, EventArgs e) 
    { 
     SendKeys.Send(str.Substring(char_num++, 1)); 
     if (char_num == str.Length) 
      timer.Stop(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     textBox1.Focus(); 
     str = "Jonathon"; 
     char_num = 0; 
     timer.Interval = 1000; 
     timer.Start(); 
    } 
} 

注:それは明白でなければ、このコードはtextBox1Clickイベントがbutton1_Click()に配線されていボタンでフォームが必要です。

あなたが最初の文字をすぐに送信する場合、あなたは次の行を追加して、タイマーを起動したときにすぐにTickハンドラを呼び出すことにより、「ごまかす」ことができます。

timer_Tick(null, EventArgs.Empty); 
+0

私はこれを試しましたが、私は別の[スレッド](http://stackoverflow.com/questions/8764338/how-to-run-timer-inside-of-timer)で説明したように、これを行う方法を理解できませんでした。 )。 – HelpNeeder

+0

まあ、私はタイマーを使う方法のアイディアをいくらか得ます。 2つのタイマーを使用しているだけで、すでに2つのタイマーを使用しているときに問題がありました。 – HelpNeeder

+0

あなたは、あなたが望む全てのタイマーを持つことができますが、私はその問題が何であるか分かりません。 –

関連する問題