2015-06-26 7 views
1

Я попытался использовать IspObjectToken :: DisplayUI из SAPI 5.4 в C#, и я не знаю, какие именно параметры для этого.IspObjectToken :: DisplayUI

void ISpObjectToken.DisplayUI(ref _RemotableHandle HWndParent, string pszTitle, string pszTypeOfUI,IntPtr pvExtraData, uint cbExtraData,object punkObject) 

Я знаю, что мы должны поставить нуль для pszTitle, и pszTypeOfUI мы должны использовать один из поддерживаемых UI как MicTraining или AddRemoveWord, но я ничего не знаю об остальной части этого. Я использую Windows 7 на своем ноутбуке.

Редактировать: Это код, который я написал, и, очевидно, он не работает.

private void button1_Click(object sender, EventArgs e) 
    { 
     int pfSupported; 
     string extradata = "test\0"; 
     IntPtr pvExtraData = Marshal.StringToHGlobalUni(extradata); 
     uint cbExtraData = (uint)extradata.Length * sizeof(Char); 
     Speechlib._RemotableHandle rh = new Speechlib._RemotableHandle(); 
     rh = getRemotableHandle(this.Handle); 
     ISpObjectToken isot = (ISpObjectToken)new SpObjectToken(); 

     isot.IsUISupported("AddRemoveWord", pvExtraData, cbExtraData, null, out pfSupported); 
     if (pfSupported == 1) 
     { 
      isot.DisplayUI(ref rh, null, "AddRemoveWord", pvExtraData, cbExtraData, null); 
     } 
    } 
    SpeechLib._RemotableHandle getRemotableHandle(IntPtr handle) 
    { 
     IntPtr address = Marshal.AllocHGlobal(IntPtr.Size); 
     Marshal.WriteIntPtr(address, handle); 
     return (SpeechLib._RemotableHandle)Marshal.PtrToStructure(address, typeof(SpeechLib._RemotableHandle)); 
    } 

ответ

1

Вы всегда можете передать null и 0 (в зависимости от ситуации), чтобы получить поведение по умолчанию для типа пользовательского интерфейса.

Если вам нужно определенное поведение, то то, что вы проходите, зависит от типа пользовательского интерфейса и от базового движка.

Для механизма Microsoft Desktop SR параметр pUnkObject всегда должен быть NULL. Для этого параметра нет (интересных) допустимых ненулевых значений. pvExtraData и cbExtraData могут быть не-NULL, если pszTypeOfUI либо SPDUI_UserTraining, либо SPDUI_AddRemoveWord.

Когда pszTypeOfUI является SPDUI_AddRemoveWord, тогда pvExtraData может быть стандартной строкой с нулевым символом, содержащей слово для добавления к лексике. cbExtraData должен быть размером строки в байтах, включая завершающий нуль.

Когда pszTypeOfUI равно SPDUI_UserTraining, тогда pvExtraData должен быть double-null-terminated string, содержащий набор учебных предложений. cbExtraData должен быть размером всей строки в байтах, включая оба прекращающих значения null.

Я подробно расскажу о своих blog.

+0

Спасибо большое за подробное объяснение. Я был бы очень благодарен, если бы вы просто взглянули на код, который я добавил к этому вопросу. Еще раз спасибо. –

+0

@ lesley-gushurst имеет довольно разумную реализацию. –

+0

Если мы воспользуемся ниже, можем ли мы использовать его для «AddPronunciation»? Потому что это вызовет окно произношения, но оно не добавит к нему слова. Вы знаете какое-либо решение для этого? Использует 'IspObjectToken' вместо' ISpeechRecognizer' помощь для решения этой проблемы? Большое спасибо. –

0

Кажется, что ваш код немного сложнее. С правильными ссылками, включением System.Speech и SpeechLib, я получил следующее, чтобы работать и запускать диалог AddRemoveWord.

using SpeechLib; 
using System.Runtime.InteropServices; 
using System.Runtime.InteropServices.ComTypes; 
private void button1_Click(object sender, EventArgs e) 
     { 
      SpSharedRecoContext spSharedRecoCtx = new SpSharedRecoContext(); 
      ISpeechRecognizer ispSpeechReco = spSharedRecoCtx.Recognizer; 
      if (ispSpeechReco.IsUISupported("AddRemoveWord", null)) 
      { 
       ispSpeechReco.DisplayUI(this.Handle.ToInt32(), "Additional Training", "AddRemoveWord", "Example"); 
      } 
     } 

Эрик также охватывает как сделать пользовательские грамматики обучения с использованием DisplayUI() here

+0

Большое спасибо Лесли. –