2012-01-07 13 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

원하는 모든 타이머를 사용할 수 있지만 문제가 무엇인지 확신 할 수 없습니다. –

관련 문제