2013-07-07 3 views
0
Process process; 

    // Read Contetnt Mouse click event 
    private SpeechSynthesizer readerSpeak; 
    private void btnSpeakContent_Click(object sender, EventArgs e) 
    { 
     if(richTextBoxThanglish.Text.Trim() == string.Empty) 
     { 
      if (process.HasExited == false) 
       process.Kill(); 
      MessageBoxWrapper.ShowWarning("Textbox is Empty.", "ABTS", "Textbox is Empty."); 
      process = Process.Start("narrator.exe"); 
     } 
     else 
     { 
      if (process.HasExited == false) 
       process.Kill(); 

      readerSpeak = new SpeechSynthesizer();     
      readerSpeak.SpeakAsync(richTextBoxThanglish.Text.ToString()); 

      if (process.HasExited == true) 
       process = Process.Start("narrator.exe"); 
     } 
    }  

    private void btnStopSpeak_Click(object sender, EventArgs e) 
    { 
     if (process.HasExited == true) 
      process = Process.Start("narrator.exe"); 

     if (!(readerSpeak == null)) 
     {     
      readerSpeak.Dispose(); 
     } 
    } 

Предположим, что у программы есть две кнопки: talkContent & stop_speak. Я запускаю процесс narrator.exe, чтобы получить рассказчик Windows. Я хочу прокрутить содержимое richtextbox без перекрытия голоса. Я знаю, что Synchronos говорит, но он приостанавливает мое приложение, пока sayContent не закончит. Мне нужно это со SpeakAsyn(). Есть ли способ добавить молчание в голосовой рассказчик? На самом деле мне нужна эта текстовая речь, после 3 секунд. Я использовал «System.Threading.Thread.Sleep (3000);». Но все же происходит перекрытие текста, Средство рассказчика & Строка в речь играет вместе.Как избежать рассказчика и строки в речи Перекрытие в C#?

Пожалуйста, помогите.

ответ

0

Возможно, вы захотите сделать связанный с процессом материал в фоновом потоке ... вот пример, используя BackgroundWorker. Он доступен в панели инструментов WinForms в Visual Studio, поэтому вы можете просто перетаскивать мышью в вашу форму.

Создать обработчик для BackgroundWorkerDoWork Событие. Здесь вы вызовете другой процесс в фоновом потоке. Вы можете дождаться завершения процесса здесь без остановки приложения.

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    process = Process.Start("narrator.exe"); 
    process.WaitForExit(); 
} 

Когда пользователь нажимает на кнопку, чтобы прочитать, вы можете просто проверить, если BackgroundWorker в настоящее время работает, и ничего не делать, если это так.

if(this.backgroundWorker1.IsBusy) return; 
+0

Спасибо за ваше время. Я исправил его с помощью события key_Leave. –

+0

Если вы хотите, вы можете отправить ответ самостоятельно (и принять его), чтобы документировать, как вы его исправили (с образцами кода и т. Д.), Поэтому любой, у кого есть эта проблема в будущем, будет знать, как его решить. –