<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">TSF Aware</title><subtitle type="html">Dictation, Windows Speech Recognition, and Text Services Framework.</subtitle><id>http://blogs.msdn.com/tsfaware/atom.xml</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/tsfaware/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/tsfaware/atom.xml" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2007-11-05T07:00:00Z</updated><entry><title>Finding out when WSR shows a window (or, a concise guide to IUIAutomationRegistrar)</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/tsfaware/archive/2009/08/25/finding-out-when-wsr-shows-a-window-or-a-concise-guide-to-iuiautomationregistrar.aspx" /><id>http://blogs.msdn.com/tsfaware/archive/2009/08/25/finding-out-when-wsr-shows-a-window-or-a-concise-guide-to-iuiautomationregistrar.aspx</id><published>2009-08-25T21:53:30Z</published><updated>2009-08-25T21:53:30Z</updated><content type="html">&lt;p&gt;When WSR shows a window (for example, the alternates dialog, the Disambiguation Numbers UI, or the dictation scratchpad), that window does not take focus.&amp;#160; &lt;/p&gt;  &lt;p&gt;These windows do not take focus because these windows could alter the state of the application that WSR is talking to.&amp;#160; For example, if you’re renaming a file in Windows Explorer, when the focus goes away, the file gets renamed.&lt;/p&gt;  &lt;p&gt;Unfortunately, though, accessibility applications often have problems finding these windows, even though these windows fire the standard WinEvents (several types of windows are plain dialogs, for example).&lt;/p&gt;  &lt;p&gt;In Windows 7, WSR fires a custom UI Automation event when it shows or hides one of its custom windows (Disambiguation Numbers, dictation scratchpad, Alternates, Spelling, Pronunciation, Switch Windows, or Launch Application).&lt;/p&gt;  &lt;p&gt;To do this, WSR uses the &lt;a href="http://msdn.microsoft.com/en-us/library/dd388290(VS.85).aspx"&gt;IUIAutomationRegistrar&lt;/a&gt; interface.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd388291(VS.85).aspx"&gt;IUIAutomationRegistrar::RegisterEvent&lt;/a&gt; defines a new event ID given a GUID and a name.&amp;#160; If multiple applications register an event using the same GUID and name, they all get the same event ID.&amp;#160; The event ID can also be used in a call to &lt;a href="http://msdn.microsoft.com/en-us/library/dd373640(VS.85).aspx"&gt;SetWinEventHook&lt;/a&gt;, if your application is using WinEvents.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Beware&lt;/strong&gt;: all registrations are &lt;em&gt;invalidated&lt;/em&gt; when you release the IUIAutomationRegistrar interface pointer!&amp;#160; So you &lt;strong&gt;must&lt;/strong&gt; retain the interface pointer until you no longer wish to process events.&amp;#160; (MSDN doesn’t make this clear.)&lt;/p&gt;  &lt;p&gt;So, if you want to find out when WSR is showing one of its custom windows, call &lt;a href="http://msdn.microsoft.com/en-us/library/dd388291(VS.85).aspx"&gt;IUIAutomationRegistrar::RegisterEvent&lt;/a&gt; with these two event declarations, and check for these events in your event processing code.&lt;/p&gt;  &lt;p&gt;const GUID GUID_ShowEvent = {&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 0x3891149e, 0x7190, 0x47d0, {0xa5, 0x18, 0xca, 0x1c, 0xdb, 0x40, 0xf7, 0xe3}    &lt;br /&gt;&amp;#160; };    &lt;br /&gt;#define UI_SHOW&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; L&amp;quot;Microsoft.Speech.UI.Shown&amp;quot; &lt;/p&gt;  &lt;p&gt;const GUID GUID_HideEvent = {&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 0x987a1c35, 0x597b, 0x4947, {0x9e, 0xf8, 0xe7, 0xa6, 0x81, 0x42, 0xfd, 0x11}    &lt;br /&gt;&amp;#160; };    &lt;br /&gt;#define UI_HIDDEN&amp;#160;&amp;#160;&amp;#160; L&amp;quot;Microsoft.Speech.UI.Hidden&amp;quot;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9883979" width="1" height="1"&gt;</content><author><name>Eric Brown</name><uri>http://blogs.msdn.com/members/Eric+Brown.aspx</uri></author><category term="WSR" scheme="http://blogs.msdn.com/tsfaware/archive/tags/WSR/default.aspx" /><category term="Accessibility" scheme="http://blogs.msdn.com/tsfaware/archive/tags/Accessibility/default.aspx" /></entry><entry><title>Why you need to actually test instead of just looking at the source code</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/tsfaware/archive/2009/05/15/why-you-need-to-actually-test-instead-of-just-looking-at-the-source-code.aspx" /><id>http://blogs.msdn.com/tsfaware/archive/2009/05/15/why-you-need-to-actually-test-instead-of-just-looking-at-the-source-code.aspx</id><published>2009-05-15T21:43:12Z</published><updated>2009-05-15T21:43:12Z</updated><content type="html">&lt;p&gt;In a previous &lt;a href="http://blogs.msdn.com/tsfaware/archive/2007/12/22/things-the-documentation-left-out-part-n.aspx"&gt;post&lt;/a&gt;, I mentioned that you need to set the GUID_PROP_COMPOSING property across text in a composition, or else Windows XP will terminate the composition.&lt;/p&gt;  &lt;p&gt;That’s true.&lt;/p&gt;  &lt;p&gt;I then provided a code snippet to set that property. &lt;/p&gt;  &lt;p&gt;That snippet is wrong.&lt;/p&gt;  &lt;p&gt;It turns out that you can’t set the GUID_PROP_COMPOSING property via ITfProperty::SetValue.&amp;#160; If you try, you’ll get a &lt;a href="http://msdn.microsoft.com/en-us/library/ms629001(vs.85).aspx"&gt;TF_E_READONLY&lt;/a&gt; error (even if you are in a read-write edit session), which can cause great consternation.&lt;/p&gt;  &lt;p&gt;Instead, you need to call &lt;a href="http://msdn.microsoft.com/en-us/library/ms538689(VS.85).aspx"&gt;ITfComposition::ShiftStart&lt;/a&gt; and/or &lt;a href="http://msdn.microsoft.com/en-us/library/ms538684(VS.85).aspx"&gt;ITfComposition::ShiftEnd&lt;/a&gt; to set the bounds of the composition after changing the text in your composition.&lt;/p&gt;  &lt;p&gt;These calls update the GUID_PROP_COMPOSING property internally.&lt;/p&gt;  &lt;p&gt;Sorry for the confusion.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9619132" width="1" height="1"&gt;</content><author><name>Eric Brown</name><uri>http://blogs.msdn.com/members/Eric+Brown.aspx</uri></author><category term="Text Services" scheme="http://blogs.msdn.com/tsfaware/archive/tags/Text+Services/default.aspx" /></entry><entry><title>What’s new in Windows Speech Recognition?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/tsfaware/archive/2009/01/29/what-s-new-in-windows-speech-recognition.aspx" /><id>http://blogs.msdn.com/tsfaware/archive/2009/01/29/what-s-new-in-windows-speech-recognition.aspx</id><published>2009-01-29T18:00:00Z</published><updated>2009-01-29T18:00:00Z</updated><content type="html">&lt;P&gt;Now that the Beta of Windows 7 is out, it’s time to talk about the improvements and new features in Windows Speech Recognition.&lt;/P&gt;
&lt;P&gt;For Windows 7, we focused primarily on improving the user experience and removing the “rough spots” that we did not have time to fix in Vista.&lt;/P&gt;
&lt;P&gt;First and foremost, we focused on performance.&amp;nbsp; &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;We rewrote the logic that builds the “say what you see” grammar to use the new native UI Automation API (instead of the MSAA IAccessible API).&amp;nbsp; This dramatically reduces the number of cross-process COM calls (by an order of magnitude), and speeds up the grammar generation by about 5-6 times. &lt;/LI&gt;
&lt;LI&gt;The document harvester also has substantial performance improvements; &lt;/LI&gt;
&lt;LI&gt;Building the “start application” grammar also runs much faster, as well. &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Second, we focused on usability.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Dictation into TSF-unaware applications works &lt;STRONG&gt;much&lt;/STRONG&gt; better than it did before.&amp;nbsp; Now, when you dictate into an unaware application, the dictation scratchpad appears. 
&lt;UL&gt;
&lt;LI&gt;You can use the scratchpad as a temporary document, and it is even voice, mouse, and keyboard-enabled; you can type, use the arrow keys for navigation, or use the mouse or voice commands to select and correct text before inserting the finished text into the unaware application. &lt;/LI&gt;
&lt;LI&gt;If you don’t like the scratchpad, you can turn it off, and your dictations will be directly inserted into the unaware application. &lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;
&lt;LI&gt;Sleep mode works &lt;STRONG&gt;much&lt;/STRONG&gt; better than it did before; false recognitions of “start listening” have been greatly reduced. &lt;/LI&gt;
&lt;LI&gt;We simplified the transitions between OFF and SLEEP mode; for security reasons, we now default to OFF after “stop listening”; although users can change the default to SLEEP mode.&amp;nbsp; (We call this “voice activation” in the Control Panel and First Time User Experience.) &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Third, we looked at accuracy.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;The SR engine now uses the WASAPI audio stack, so we support array microphones and echo cancellation; this vastly improves WSR’s accuracy when used without a headset. &lt;/LI&gt;
&lt;LI&gt;Document harvesting runs periodically, rather than just at startup; this lets the harvester pick up new documents as you create them, rather than having to wait for you to reload speech. &lt;/LI&gt;
&lt;LI&gt;You can upload your training data to Microsoft, so that we can improve the recognizers in the future.&amp;nbsp; (You have to initiate this, incidentally; we will not upload any data without your explicit consent.)&lt;/LI&gt;
&lt;LI&gt;The Chinese recognizer has substantial accuracy improvements as well.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Lastly, we did a few tweaks to the recognizer.&amp;nbsp; In Vista, 3rd party applications couldn’t tell whether the shared recognizer was ON or SLEEPing.&amp;nbsp; For Win7, there are new APIs that expose SLEEP mode.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9378890" width="1" height="1"&gt;</content><author><name>Eric Brown</name><uri>http://blogs.msdn.com/members/Eric+Brown.aspx</uri></author><category term="dictation" scheme="http://blogs.msdn.com/tsfaware/archive/tags/dictation/default.aspx" /><category term="WSR" scheme="http://blogs.msdn.com/tsfaware/archive/tags/WSR/default.aspx" /></entry><entry><title>The TSF Samples are Here!</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/tsfaware/archive/2008/11/14/the-tsf-samples-are-here.aspx" /><id>http://blogs.msdn.com/tsfaware/archive/2008/11/14/the-tsf-samples-are-here.aspx</id><published>2008-11-14T23:03:05Z</published><updated>2008-11-14T23:03:05Z</updated><content type="html">&lt;p&gt;The TSF samples (long missing from MSDN) have finally been uploaded to the &lt;a href="http://code.msdn.microsoft.com/tsf"&gt;MSDN Code Gallery&lt;/a&gt;.&amp;#160; The documentation is also available (in plain-text form) in each sample.&amp;#160; MSDN’s web page should be updated soon to point to the code gallery.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9077367" width="1" height="1"&gt;</content><author><name>Eric Brown</name><uri>http://blogs.msdn.com/members/Eric+Brown.aspx</uri></author><category term="tsf" scheme="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx" /></entry><entry><title>Where are the TSF Samples?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/tsfaware/archive/2008/10/22/where-are-the-tsf-samples.aspx" /><id>http://blogs.msdn.com/tsfaware/archive/2008/10/22/where-are-the-tsf-samples.aspx</id><published>2008-10-22T23:57:41Z</published><updated>2008-10-22T23:57:41Z</updated><content type="html">&lt;p&gt;Many people have emailed me asking about the TSF samples on MSDN.&amp;#160; They’re supposed to be on MSDN code gallery, although they don’t appear to be there.&lt;/p&gt;  &lt;p&gt;They are, however, part of the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=F26B1AA4-741A-433A-9BE5-FA919850BDBF&amp;amp;displaylang=en"&gt;Windows SDK&lt;/a&gt;. After installation, you'll find them in %programfiles%\Microsoft SDKs\Windows\v6.1\Samples\winui\Input\tsf.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;There are actually more samples in the Windows SDK than were on MSDN, including some examples of how to write a text store, as well as how to interact with TSF in UILess mode.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9011695" width="1" height="1"&gt;</content><author><name>Eric Brown</name><uri>http://blogs.msdn.com/members/Eric+Brown.aspx</uri></author><category term="tsf" scheme="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx" /><category term="Text Services" scheme="http://blogs.msdn.com/tsfaware/archive/tags/Text+Services/default.aspx" /><category term="Applications" scheme="http://blogs.msdn.com/tsfaware/archive/tags/Applications/default.aspx" /><category term="TSF Manager" scheme="http://blogs.msdn.com/tsfaware/archive/tags/TSF+Manager/default.aspx" /></entry><entry><title>More ways to fix problems with dictation</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/tsfaware/archive/2008/09/05/more-ways-to-fix-problems-with-dictation.aspx" /><id>http://blogs.msdn.com/tsfaware/archive/2008/09/05/more-ways-to-fix-problems-with-dictation.aspx</id><published>2008-09-05T22:21:00Z</published><updated>2008-09-05T22:21:00Z</updated><content type="html">&lt;p&gt;One common cause of dictation not working is that CTFMon is not running.&amp;#160; This is a helper process used by the Text Services Framework to implement things like global compartments and the like.&lt;/p&gt;  &lt;p&gt;If dictation is not working, try running this command from an elevated command prompt:&lt;/p&gt;  &lt;p&gt;schtasks /Query /TN \Microsoft\Windows\TextServicesFramework\MsCtfMonitor&lt;/p&gt;  &lt;p&gt;(all on one line)&lt;/p&gt;  &lt;p&gt;You should get some output that looks like this:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="3"&gt;TaskName&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next Run Time&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Status     &lt;br /&gt;=================== =============&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; =======      &lt;br /&gt;MsCtfMonitor&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; N/A&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Running&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;If the status doesn’t say ‘Running’, then you need to restart CTFMon like this:&lt;/p&gt;  &lt;p&gt;schtasks /Run /TN \Microsoft\Windows\TextServicesFramework\MsCtfMonitor&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Run the query again, and verify that the MsCtfMonitor task is running.&lt;/p&gt;  &lt;p&gt;Once it is, restart Windows Speech Recognition, and dictation should work again.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8926767" width="1" height="1"&gt;</content><author><name>Eric Brown</name><uri>http://blogs.msdn.com/members/Eric+Brown.aspx</uri></author><category term="dictation" scheme="http://blogs.msdn.com/tsfaware/archive/tags/dictation/default.aspx" /><category term="TSF Manager" scheme="http://blogs.msdn.com/tsfaware/archive/tags/TSF+Manager/default.aspx" /></entry><entry><title>Inline Dictation commands</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/tsfaware/archive/2008/08/26/inline-dictation-commands.aspx" /><id>http://blogs.msdn.com/tsfaware/archive/2008/08/26/inline-dictation-commands.aspx</id><published>2008-08-27T02:15:20Z</published><updated>2008-08-27T02:15:20Z</updated><content type="html">&lt;p&gt;I’ve heard from a number of sources that there isn’t any good documentation about the ‘inline’ dictation commands.&amp;#160; These commands can be uttered in the middle of a dictation stream (in other words, you don’t have to stop speaking to use these commands), and are used to guide the Speech Recognition Engine to produce the desired results.&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="400" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="200"&gt;&lt;strong&gt;Command&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="200"&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;tab&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Inserts a &amp;lt;tab&amp;gt; character.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;new-line&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Inserts a new line character and forces the next word to be capitalized.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;new-paragraph&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Inserts two new line characters and forces the next word to be capitalized.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;caps &amp;lt;word&amp;gt;&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Capitalizes the first letter of &amp;lt;word&amp;gt;.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;no caps &amp;lt;word&amp;gt;&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Lowercases &amp;lt;word&amp;gt;.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;all caps &amp;lt;word&amp;gt;&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Uppercases &amp;lt;word&amp;gt;.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;no space&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Does not insert a space before the next word.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;literal &amp;lt;argument&amp;gt;&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Does not perform any inverse text normalization on &amp;lt;argument&amp;gt;.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;numeral &amp;lt;argument&amp;gt;&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Forces &amp;lt;argument&amp;gt; into numeric form, if possible.&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;h2&gt;Simple Examples&lt;/h2&gt;  &lt;p&gt;Tab, new-line, new-paragraph, caps, no caps, and all caps are pretty straightforward:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="400" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="200"&gt;&lt;strong&gt;User Input&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="200"&gt;&lt;strong&gt;Recognition Result&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;king &lt;em&gt;tab&lt;/em&gt; county&lt;/td&gt;        &lt;td valign="top" width="200"&gt;king&amp;lt;tab&amp;gt;county&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;this is a test &lt;em&gt;new-line&lt;/em&gt; this is another test&lt;/td&gt;        &lt;td valign="top" width="200"&gt;This is a test          &lt;br /&gt;This is another test&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;this is a test &lt;em&gt;new-paragraph&lt;/em&gt; this is another test&lt;/td&gt;        &lt;td valign="top" width="200"&gt;This is a test          &lt;br /&gt;          &lt;br /&gt;This is another test&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;&lt;em&gt;no caps&lt;/em&gt; C I A&lt;/td&gt;        &lt;td valign="top" width="200"&gt;cia&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;C I A&lt;/td&gt;        &lt;td valign="top" width="200"&gt;CIA&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;I have &lt;em&gt;caps&lt;/em&gt; in my closet&lt;/td&gt;        &lt;td valign="top" width="200"&gt;I have In my closet&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;I have &lt;em&gt;all caps&lt;/em&gt; nothing&lt;/td&gt;        &lt;td valign="top" width="200"&gt;I have NOTHING&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;I have &lt;em&gt;no space&lt;/em&gt; available&lt;/td&gt;        &lt;td valign="top" width="200"&gt;I haveavailable&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h2&gt;Examples using &amp;lt;literal&amp;gt;&lt;/h2&gt;  &lt;p&gt;In order to understand what &amp;lt;literal&amp;gt; does, you need to know what Inverse Text Normalization does.&amp;#160; Inverse Text Normalization is the process of converting spoken forms into a preferred textual representation.&amp;#160;&amp;#160; Some examples are:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="400" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="200"&gt;&lt;strong&gt;User Input&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="200"&gt;&lt;strong&gt;Recognition Result&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;doctor smith&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Dr. Smith&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;period&lt;/td&gt;        &lt;td valign="top" width="200"&gt;.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;united states of america&lt;/td&gt;        &lt;td valign="top" width="200"&gt;United States of America&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;three hundred and five&lt;/td&gt;        &lt;td valign="top" width="200"&gt;305&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;The &amp;lt;literal&amp;gt; command prevents that conversion from occurring, and forces the text to be input exactly as spoken.&lt;/p&gt;  &lt;h2&gt;Examples using &amp;lt;numeral&amp;gt;&lt;/h2&gt;  &lt;p&gt;The best way to describe the &amp;lt;numeral&amp;gt; command is to give some examples:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="400" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="200"&gt;&lt;strong&gt;User Input&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="200"&gt;&lt;strong&gt;Recognition Result&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;&lt;em&gt;numeral&lt;/em&gt; two&lt;/td&gt;        &lt;td valign="top" width="200"&gt;2&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;two&lt;/td&gt;        &lt;td valign="top" width="200"&gt;two&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;&lt;em&gt;numeral&lt;/em&gt; twelve&lt;/td&gt;        &lt;td valign="top" width="200"&gt;12&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;twelve&lt;/td&gt;        &lt;td valign="top" width="200"&gt;12&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;&lt;em&gt;numeral&lt;/em&gt; four eight seven six two three&lt;/td&gt;        &lt;td valign="top" width="200"&gt;487623&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;four eight seven six two three&lt;/td&gt;        &lt;td valign="top" width="200"&gt;four eight seven six two three&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;numeral one and a half million&lt;/td&gt;        &lt;td valign="top" width="200"&gt;1,500,000&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;numeral one point five million&lt;/td&gt;        &lt;td valign="top" width="200"&gt;1.5 million&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;numeral one point four five&lt;/td&gt;        &lt;td valign="top" width="200"&gt;1.45&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;If the phrase cannot be interpreted as a number, then the numeral command does nothing:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="400" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="200"&gt;User Input&lt;/td&gt;        &lt;td valign="top" width="200"&gt;recognition result&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;numeral I want to go to the store&lt;/td&gt;        &lt;td valign="top" width="200"&gt;I want to go to the store&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Note that this phrase has a possible number (to –&amp;gt; two –&amp;gt; 2), but the intervening words deactivate the command.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8898517" width="1" height="1"&gt;</content><author><name>Eric Brown</name><uri>http://blogs.msdn.com/members/Eric+Brown.aspx</uri></author><category term="dictation" scheme="http://blogs.msdn.com/tsfaware/archive/tags/dictation/default.aspx" /></entry><entry><title>Crypto History</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/tsfaware/archive/2008/07/11/crypto-history.aspx" /><id>http://blogs.msdn.com/tsfaware/archive/2008/07/11/crypto-history.aspx</id><published>2008-07-11T20:01:02Z</published><updated>2008-07-11T20:01:02Z</updated><content type="html">&lt;p&gt;David LeBlanc wrote an excellent &lt;a href="http://blogs.msdn.com/david_leblanc/archive/2008/07/03/office-crypto-follies.aspx"&gt;overview&lt;/a&gt; of encrypted documents in Office.&amp;#160; A long, long time ago, I worked on the Word conversions team (it wasn’t even called Office then).&amp;#160; As part of my job, I wrote a document encryption filter.&amp;#160; &lt;/p&gt;  &lt;p&gt;More specifically, I wrote (around 1990 or so) a document obfuscation filter.&amp;#160; I say ‘obfuscation’ because one of the requirements was that the password had to be stored with the (encrypted) document.&amp;#160;&amp;#160; Of course, that rendered any possible security null and void, but the customer needed to be able to recover documents with forgotten passwords.&lt;/p&gt;  &lt;p&gt;When David talks about XOR obfuscation, I believe that the incredibly weak security was a ‘feature’, not a bug – quite a few companies wanted to be able to prevent casual snoopers from reading their documents, but also wanted to be able to recover from a forgotten password.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Data_Encryption_Standard"&gt;DES&lt;/a&gt; was a standard in 1990 (it didn’t really fall until 1998), and I know the Office devs had an implementation around to use, as my manager wrote a real encryption filter using DES a couple of months after I wrote my obfuscation filter.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8721675" width="1" height="1"&gt;</content><author><name>Eric Brown</name><uri>http://blogs.msdn.com/members/Eric+Brown.aspx</uri></author><category term="random" scheme="http://blogs.msdn.com/tsfaware/archive/tags/random/default.aspx" /></entry><entry><title>What Isn’t TSF good for?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/tsfaware/archive/2008/06/25/what-isn-t-tsf-good-for.aspx" /><id>http://blogs.msdn.com/tsfaware/archive/2008/06/25/what-isn-t-tsf-good-for.aspx</id><published>2008-06-25T21:03:00Z</published><updated>2008-06-25T21:03:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;Well, for one thing, it’s not that great for grabbing the current selection in the foreground application.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;There are several problems here:&lt;/P&gt;
&lt;P&gt;1) You have to get your text service loaded into the target application. This can be slow.&lt;/P&gt;
&lt;P&gt;2) Once your text service is loaded, you can only really work with TSF-enabled applications, which, sadly, are few and far between.&lt;/P&gt;
&lt;P mce_keep="true"&gt;What do I recommend?&amp;nbsp; There aren’t any really good solutions.&amp;nbsp; MSAA doesn’t have good text support.&amp;nbsp; UI Automation doesn’t have good native support (although it works very nicely in managed applications, and has good text support).&amp;nbsp; You can use the clipboard, but users tend to be somewhat attached to their clipboard contents.&amp;nbsp; (Saving &amp;amp; restoring the clipboard is possible, but can be tricky – application vendors will often register private clipboard formats that contain pointers which get invalidated when the clipboard changes.&amp;nbsp; When you put the clipboard back, you will crash the application.&amp;nbsp; Most vendors don’t do that, but it’s something you should be aware of.)&lt;/P&gt;
&lt;P&gt;If you do decide to use the clipboard, then &lt;A href="http://www.clipboardextender.com/?page_id=6"&gt;this guy&lt;/A&gt; has implemented a pretty fancy &lt;A href="http://www.thornsoft.com/" mce_href="http://www.thornsoft.com/"&gt;clipboard manager&lt;/A&gt;, and has a good discussion of various traps &amp;amp; pitfalls with the clipboard.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8652639" width="1" height="1"&gt;</content><author><name>Eric Brown</name><uri>http://blogs.msdn.com/members/Eric+Brown.aspx</uri></author><category term="tsf" scheme="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx" /><category term="random" scheme="http://blogs.msdn.com/tsfaware/archive/tags/random/default.aspx" /></entry><entry><title>When Dictation doesn't Work</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/tsfaware/archive/2008/05/22/when-dictation-doesn-t-work.aspx" /><id>http://blogs.msdn.com/tsfaware/archive/2008/05/22/when-dictation-doesn-t-work.aspx</id><published>2008-05-23T02:17:40Z</published><updated>2008-05-23T02:17:40Z</updated><content type="html">&lt;p&gt;WSR Dictation should &lt;strong&gt;always&lt;/strong&gt; work in Wordpad.&amp;#160; If you're having problems with dictation, make sure it works in Wordpad.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;If dictation doesn&amp;#8217;t work in WordPad:&lt;/p&gt;  &lt;p&gt;1)&amp;#160; Start regedit, go to the key HKEY_CURRENT_USER\Software\Microsoft\Speech\Preferences\en-us\ and remove any value named DictationEnabled.&lt;/p&gt;  &lt;p&gt;If there is no registry key named DictationEnabled, then &lt;/p&gt;  &lt;p&gt;2)&amp;#160; Check %windir%\ime\sptip.dll - it should exist, be 128KB in size, and have a file version of 6.0.6001.17128 and a product version of 6.0.6000.16386.&lt;/p&gt;  &lt;p&gt;3)&amp;#160; The file %windir%\ime\en-us\sptip.dll.mui should also exist.&lt;/p&gt;  &lt;p&gt;4)&amp;#160; Make sure ctfmon.exe is running.&amp;#160; It should start at login (there is a scheduled task that starts it).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;If dictation works in WordPad, but doesn't work in your application:&lt;/p&gt;  &lt;p&gt;Your application probably doesn't support TSF.&amp;#160; Complain to your vendor.&amp;#160; You can enable a (very limited) version of dictation by checking 'Enable Dictation Everywhere' in the Windows Speech Recognition context menu.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8535121" width="1" height="1"&gt;</content><author><name>Eric Brown</name><uri>http://blogs.msdn.com/members/Eric+Brown.aspx</uri></author><category term="dictation" scheme="http://blogs.msdn.com/tsfaware/archive/tags/dictation/default.aspx" /></entry><entry><title>Categories</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/tsfaware/archive/2008/03/14/categories.aspx" /><id>http://blogs.msdn.com/tsfaware/archive/2008/03/14/categories.aspx</id><published>2008-03-14T17:00:36Z</published><updated>2008-03-14T17:00:36Z</updated><content type="html">&lt;p&gt;In an earlier post on &lt;a href="http://blogs.msdn.com/tsfaware/archive/2007/05/30/what-is-a-keyboard.aspx"&gt;keyboards&lt;/a&gt;, I talked briefly about text service categories.&amp;#160; I'd like to talk more about categories.&lt;/p&gt;  &lt;p&gt;TSF will make sure that at most one text service in any category is enabled at any given time.&lt;/p&gt;  &lt;p&gt;So, for example, you can enable one text service with &lt;b&gt;GUID_TFCAT_TIP_KEYBOARD&lt;/b&gt;, one text service with &lt;b&gt;GUID_TFCAT_TIP_SPEECH&lt;/b&gt;, and one text service with &lt;strong&gt;GUID_TFCAT_TIP_HANDWRITING&lt;/strong&gt;, and all three text services will be active at the same time.&lt;/p&gt;  &lt;p&gt;But if you &lt;a href="http://msdn2.microsoft.com/en-us/library/aa381942.aspx"&gt;enable another text service&lt;/a&gt; with &lt;b&gt;GUID_TFCAT_TIP_KEYBOARD&lt;/b&gt;, the first one will be deactivated.&amp;#160; &lt;/p&gt;  &lt;p&gt;If you don't want this to happen, then you should call &lt;a href="http://msdn2.microsoft.com/en-us/library/ms538584(VS.85).aspx"&gt;RegisterCategory&lt;/a&gt; with your own category GUID.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8186114" width="1" height="1"&gt;</content><author><name>Eric Brown</name><uri>http://blogs.msdn.com/members/Eric+Brown.aspx</uri></author><category term="tsf" scheme="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx" /><category term="Text Services" scheme="http://blogs.msdn.com/tsfaware/archive/tags/Text+Services/default.aspx" /></entry><entry><title>Visual Studio 2008 issues</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/tsfaware/archive/2008/01/17/visual-studio-2008-issues.aspx" /><id>http://blogs.msdn.com/tsfaware/archive/2008/01/17/visual-studio-2008-issues.aspx</id><published>2008-01-18T01:52:49Z</published><updated>2008-01-18T01:52:49Z</updated><content type="html">&lt;p&gt;If you're building a text service DLL, you almost certainly don't want to use Visual Studio 2008's compiler.&amp;#160; The problem is that Visual Studio 2008 uses a new C Runtime Library, and if you build your text service with Visual Studio, your text service likely won't load in all applications.&amp;#160; (Plus, you would have to redistribute the C Runtime Library.)&lt;/p&gt;  &lt;p&gt;What to do instead?&lt;/p&gt;  &lt;p&gt;Well, I would recommend installing the Vista (or XP) DDK and use the &lt;a href="http://ddkwizard.assarbad.net/"&gt;DDKWizard&lt;/a&gt; instead.&amp;#160; The DDK comes with its own C/C++ compiler that uses the C Runtime Library that ships with the OS (and won't cause problems with other applications), and the DDKWizard will let you use all of Visual Studio's awesome capabilities.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7144329" width="1" height="1"&gt;</content><author><name>Eric Brown</name><uri>http://blogs.msdn.com/members/Eric+Brown.aspx</uri></author><category term="Text Services" scheme="http://blogs.msdn.com/tsfaware/archive/tags/Text+Services/default.aspx" /></entry><entry><title>Things the Documentation left out, part N</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/tsfaware/archive/2007/12/22/things-the-documentation-left-out-part-n.aspx" /><id>http://blogs.msdn.com/tsfaware/archive/2007/12/22/things-the-documentation-left-out-part-n.aspx</id><published>2007-12-22T18:00:00Z</published><updated>2007-12-22T18:00:00Z</updated><content type="html">&lt;P&gt;I recently had two people ask me the same question:&lt;/P&gt;
&lt;P&gt;"Why can't I insert more than one character into a composition on Notepad?"&lt;/P&gt;
&lt;P&gt;It's actually a bit more complicated than that, since this behavior only appears to happen on Windows XP with a US English text service.&amp;nbsp; (Japanese text services appear to work correctly.)&lt;/P&gt;
&lt;P&gt;I just had a chance to figure out what was going on here, and, since it doesn't seem to be documented anywhere else, I thought I'd post the answer so that the next poor sod doesn't have to spend eternity scratching his head wondering why he can't get it to work.&lt;/P&gt;
&lt;P&gt;After a longish debugging bout, and a bunch of searching through the XP source code, I have the answer.&lt;/P&gt;
&lt;P&gt;The answer is that there's a Text Event Sink attached to the TSF-unaware context, and when the context changes, this event sink looks to see if the changed text has the GUID_PROP_COMPOSING property attached to it.&amp;nbsp; If it doesn't, it terminates the composition.&lt;/P&gt;
&lt;P&gt;So, if you want to have your text services insert more than one character into a composition, you need to make sure that your text has the GUID_PROP_COMPOSING property set to 1.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;I had previously written some code to manage this property.&amp;nbsp; However, you cannot explicitly set the GUID_PROP_COMPOSING property -&lt;/P&gt;
&lt;P&gt;ITfProperty::SetValue() will return TF_E_READONLY if you do.&lt;/P&gt;
&lt;P&gt;What you &lt;STRONG&gt;do&lt;/STRONG&gt; need to do is use the ITfComposition::ShiftStart and ITfComposition::ShiftEnd methods to move the start and ending points of your composition to cover the text.&amp;nbsp; These methods will update the GUID_PROP_COMPOSING property directly.&lt;/P&gt;
&lt;P&gt;&lt;STRIKE&gt;The code to do that would look like this:&lt;/STRIKE&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRIKE&gt;&lt;/STRIKE&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRIKE&gt;BOOL CTextService::_SetCompositionComposing(TfEditCookie ec, ITfContext *pContext)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ITfRange *pRangeComposition;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ITfProperty *pComposingProperty;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HRESULT hr; &lt;/STRIKE&gt;
&lt;P&gt;&lt;STRIKE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // the composition requires a range and the context it lives in&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_pComposition-&amp;gt;GetRange(&amp;amp;pRangeComposition) != S_OK)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return FALSE; &lt;/STRIKE&gt;
&lt;P&gt;&lt;STRIKE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = E_FAIL; &lt;/STRIKE&gt;
&lt;P&gt;&lt;STRIKE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // get our the display attribute property&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (pContext-&amp;gt;GetProperty(GUID_PROP_COMPOSING, &amp;amp;pComposingProperty) == S_OK)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VARIANT var;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // set the value over the range&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var.vt = VT_I4; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var.lVal = 1; &lt;/STRIKE&gt;
&lt;P&gt;&lt;STRIKE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pComposingProperty-&amp;gt;SetValue(ec, pRangeComposition, &amp;amp;var); &lt;/STRIKE&gt;
&lt;P&gt;&lt;STRIKE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pComposingProperty-&amp;gt;Release();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/STRIKE&gt;
&lt;P&gt;&lt;STRIKE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pRangeComposition-&amp;gt;Release();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (hr == S_OK);&lt;BR&gt;} &lt;/STRIKE&gt;
&lt;P&gt;&lt;STRIKE&gt;When you're ready to finalize your composition, you should clear the property over the composed text by calling ITfProperty::Clear(). &lt;/STRIKE&gt;
&lt;P&gt;Note that none of the sample text services do this.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6831043" width="1" height="1"&gt;</content><author><name>Eric Brown</name><uri>http://blogs.msdn.com/members/Eric+Brown.aspx</uri></author><category term="Text Services" scheme="http://blogs.msdn.com/tsfaware/archive/tags/Text+Services/default.aspx" /><category term="Applications" scheme="http://blogs.msdn.com/tsfaware/archive/tags/Applications/default.aspx" /></entry><entry><title>Oops!</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/tsfaware/archive/2007/11/14/oops.aspx" /><id>http://blogs.msdn.com/tsfaware/archive/2007/11/14/oops.aspx</id><published>2007-11-14T21:01:48Z</published><updated>2007-11-14T21:01:48Z</updated><content type="html">&lt;p&gt;If you've tried to use the modified version of Scintilla that I described in my &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/07/Dictation/"&gt;MSDN article&lt;/a&gt;, you will find that the zipped sources don't actually have the changes that I made.&amp;nbsp; That was my fault; when I was packaging the sources, I had two versions of ScintillaWin.cxx around, and I picked the newer one, which (sigh) was the wrong one.&amp;nbsp; Anyway, here's a link to the correct version of &lt;a href="http://cid-c57822bc3c7d1873.skydrive.live.com/self.aspx/Public/ScintillaWin.cxx"&gt;ScintillaWin.cxx with TSF support&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6219479" width="1" height="1"&gt;</content><author><name>Eric Brown</name><uri>http://blogs.msdn.com/members/Eric+Brown.aspx</uri></author><category term="tsf" scheme="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx" /><category term="dictation" scheme="http://blogs.msdn.com/tsfaware/archive/tags/dictation/default.aspx" /><category term="Applications" scheme="http://blogs.msdn.com/tsfaware/archive/tags/Applications/default.aspx" /></entry><entry><title>ITfCompartmentEventSink::OnChange means what it says...</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/tsfaware/archive/2007/11/05/itfcompartmenteventsink-onchange-means-what-it-says.aspx" /><id>http://blogs.msdn.com/tsfaware/archive/2007/11/05/itfcompartmenteventsink-onchange-means-what-it-says.aspx</id><published>2007-11-05T18:00:00Z</published><updated>2007-11-05T18:00:00Z</updated><content type="html">&lt;P&gt;I&amp;nbsp;got caught by this recently.&amp;nbsp; &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538625.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538625.aspx"&gt;ITfCompartmentEventSink::OnChange&lt;/A&gt; means what it says.&amp;nbsp; If you repeatedly store the same value into a global compartment, the event sinks will not fire.&amp;nbsp; If you store a different value into the compartment, the event sinks fire just fine.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5822820" width="1" height="1"&gt;</content><author><name>Eric Brown</name><uri>http://blogs.msdn.com/members/Eric+Brown.aspx</uri></author><category term="tsf" scheme="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx" /><category term="Text Services" scheme="http://blogs.msdn.com/tsfaware/archive/tags/Text+Services/default.aspx" /></entry></feed>