<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>TSF Aware : tour</title><link>http://blogs.msdn.com/tsfaware/archive/tags/tour/default.aspx</link><description>Tags: tour</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Text services: Vista Extensions (UI Elements)</title><link>http://blogs.msdn.com/tsfaware/archive/2007/05/16/text-services-vista-extensions-ui-elements.aspx</link><pubDate>Wed, 16 May 2007 17:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2412837</guid><dc:creator>Eric Brown</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/tsfaware/comments/2412837.aspx</comments><wfw:commentRss>http://blogs.msdn.com/tsfaware/commentrss.aspx?PostID=2412837</wfw:commentRss><wfw:comment>http://blogs.msdn.com/tsfaware/rsscomments.aspx?PostID=2412837</wfw:comment><description>&lt;P&gt;The TSF tour ends here, with a brief discussion of UI Elements in Vista&lt;/P&gt;
&lt;P&gt;If your text service wishes to be available in full-screen applications like games, it must implement &lt;A href="http://msdn2.microsoft.com/en-us/library/aa383175.aspx"&gt;ITfUIElement&lt;/A&gt;, and call the &lt;A href="http://msdn2.microsoft.com/en-us/library/aa383178.aspx"&gt;ITfUIElementMgr&lt;/A&gt; whenever the text service wants to display some UI. (See the discussion of &lt;A href="http://msdn2.microsoft.com/en-us/library/aa966970.aspx"&gt;UILess mode&lt;/A&gt; in MSDN.)&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 width=599 border=1&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;B&gt;How Obtained&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa383175.aspx"&gt;ITfUIElement&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;Passed to &lt;A href="http://msdn2.microsoft.com/en-us/library/aa383183.aspx"&gt;ITfUIElementMgr::BeginUIElement&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa383159.aspx"&gt;ITfToolTipUIElement&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;QI from &lt;A href="http://msdn2.microsoft.com/en-us/library/aa383175.aspx"&gt;ITfUIElement&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa381004.aspx"&gt;ITfCandidateListUIElementBehavior&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;QI from &lt;A href="http://msdn2.microsoft.com/en-us/library/aa383175.aspx"&gt;ITfUIElement&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa380892.aspx"&gt;ITfCandidateListUIElement&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;QI from &lt;A href="http://msdn2.microsoft.com/en-us/library/aa383175.aspx"&gt;ITfUIElement&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa382576.aspx"&gt;ITfReadingInformationUIElement&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;QI from &lt;A href="http://msdn2.microsoft.com/en-us/library/aa383175.aspx"&gt;ITfUIElement&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;Text services that implement&amp;nbsp;&amp;nbsp;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa383175.aspx"&gt;ITfUIElement&lt;/A&gt;&amp;nbsp;should also register in the &lt;SPAN style="FONT-SIZE: 8.5pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;STRONG&gt;GUID_TFCAT_TIPCAP_UIELEMENTENABLED&lt;/STRONG&gt;&lt;FONT face=Arial size=2&gt;&amp;nbsp;category, as well.&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Unfortunately, as of this date, I do not know of any sample text service that implements &lt;A href="http://msdn2.microsoft.com/en-us/library/aa383175.aspx"&gt;ITfUIElement&lt;/A&gt;.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2412837" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx">tsf</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tour/default.aspx">tour</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/Text+Services/default.aspx">Text Services</category></item><item><title>Text Services: Vista Extensions</title><link>http://blogs.msdn.com/tsfaware/archive/2007/05/15/text-service-extensions.aspx</link><pubDate>Tue, 15 May 2007 17:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2412424</guid><dc:creator>Eric Brown</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/tsfaware/comments/2412424.aspx</comments><wfw:commentRss>http://blogs.msdn.com/tsfaware/commentrss.aspx?PostID=2412424</wfw:commentRss><wfw:comment>http://blogs.msdn.com/tsfaware/rsscomments.aspx?PostID=2412424</wfw:comment><description>&lt;P&gt;In Windows Vista, TSF added the ability to run in locations where it had previously been disabled.&amp;nbsp; For example, TSF is now available on secure desktops, in full screen (DirectX) applications, and in MTA threads.&amp;nbsp; However, text services have to be aware of these new environments, and must tell TSF that it is aware of these environments.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;A text service that wishes to run in one of these new environments (e.g., UI-less mode, secure mode, or console mode) must implement &lt;A href="http://msdn2.microsoft.com/en-us/library/aa383142.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa383142.aspx"&gt;ITfTextInputProcessorEx&lt;/A&gt;&amp;nbsp;instead of &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628964.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628964.aspx"&gt;ITfTextInputProcessor&lt;/A&gt;:&amp;nbsp; &lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 width=599 border=1&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;B&gt;How Created&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/THEAD&gt;
&lt;TBODY&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 width=599 border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa383142.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa383142.aspx"&gt;ITfTextInputProcessorEx&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;TSF will CoCreateInstance() this interface.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;Next, text services that implement &lt;A href="http://msdn2.microsoft.com/en-us/library/aa383142.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa383142.aspx"&gt;ITfTextInputProcessorEx&lt;/A&gt; must also&amp;nbsp;register under one or more of the appropriate categories: &lt;B&gt;GUID_TFCAT_TIPCAP_COMLESS, GUID_TFCAT_TIPCAP_SECUREMODE, GUID_TFCAT_TIPCAP_UIELEMENTENABLED, &lt;/B&gt;or&lt;B&gt; GUID_TFCAT_TIPCAP_WOW16.&lt;/B&gt; &lt;/P&gt;
&lt;P&gt;What do these categories mean?&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=319&gt;
&lt;P&gt;&lt;B&gt;Category&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=319&gt;
&lt;P&gt;&lt;B&gt;Meaning&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=319&gt;
&lt;P&gt;&lt;B&gt;GUID_TFCAT_TIPCAP_SECUREMODE&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=319&gt;
&lt;P&gt;Text service will be launched on the secure desktop.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=319&gt;
&lt;P&gt;&lt;B&gt;GUID_TFCAT_TIPCAP_UIELEMENTENABLED&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=319&gt;
&lt;P&gt;Text service implements &lt;A href="http://msdn2.microsoft.com/en-us/library/aa383175.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa383175.aspx"&gt;ITfUIElement&lt;/A&gt;, and draws its UI accordingly.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=319&gt;
&lt;P&gt;&lt;B&gt;GUID_TFCAT_TIPCAP_COMLESS&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=319&gt;
&lt;P&gt;Text service can operate without COM. See below.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=319&gt;
&lt;P&gt;&lt;B&gt;GUID_TFCAT_TIPCAP_WOW16&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=319&gt;
&lt;P&gt;Text service can work with Win16 applications.&amp;nbsp; All text services in this category are assumed to be in the &lt;B&gt;GUID_TFCAT_TIPCAP_COMLESS&lt;/B&gt; category as well.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;H3&gt;Text Services without COM&lt;/H3&gt;
&lt;P&gt;Previous versions of the TSF Manager had a number of application compatibility problems with COM threading models, particularly with applications that were not TSF-aware.&amp;nbsp; In Vista, the TSF Manager can create text services without using COM (by loading the DLL directly and calling DllGetClassFactory).&amp;nbsp; However, there are obvious restrictions on text services - namely, that the service itself cannot use COM, either.&amp;nbsp; If a text service follows these restrictions, it can register under the &lt;B&gt;GUID_TFCAT_TIPCAP_COMLESS &lt;/B&gt;category, and be active in more applications.&lt;/P&gt;
&lt;P&gt;COM-less text services can still create COM objects,&amp;nbsp;but they cannot&amp;nbsp;use CoCreateInstance().&amp;nbsp; Instead, COM objects can be allocated off the heap, or ATL-based text services can use CComObject&amp;lt;T&amp;gt;::CreateInstance(). &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2412424" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx">tsf</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tour/default.aspx">tour</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/Text+Services/default.aspx">Text Services</category></item><item><title>Text Services:  Candidates</title><link>http://blogs.msdn.com/tsfaware/archive/2007/05/14/text-services-candidates.aspx</link><pubDate>Mon, 14 May 2007 17:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2412584</guid><dc:creator>Eric Brown</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/tsfaware/comments/2412584.aspx</comments><wfw:commentRss>http://blogs.msdn.com/tsfaware/commentrss.aspx?PostID=2412584</wfw:commentRss><wfw:comment>http://blogs.msdn.com/tsfaware/rsscomments.aspx?PostID=2412584</wfw:comment><description>&lt;P&gt;If your text service supports multiple interpretations of the same input, and you wish to allow users to correct the initial interpretation (for dictation, we call this 'correction'; IMEs tend to call it 'reconversion'), your text service will need to implement these interfaces.&amp;nbsp; Your service will also need to implement &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538970.aspx"&gt;ITfFnReconversion&lt;/A&gt; (so that applications can get these interfaces), and &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538979.aspx"&gt;ITfFunctionProvider&lt;/A&gt; (so that applications can get the &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538970.aspx"&gt;ITfFnReconversion&lt;/A&gt; interface).&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 width=599 border=1&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=193&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=406&gt;
&lt;P&gt;&lt;B&gt;How Obtained&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=193&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538492.aspx"&gt;ITfCandidateList&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=406&gt;
&lt;P&gt;Returned from &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538972.aspx"&gt;ITfFnReconversion::GetReconversion&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=193&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538497.aspx"&gt;ITfCandidateString&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=406&gt;
&lt;P&gt;Returned from &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538494.aspx"&gt;ITfCandidateList::GetCandidate&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=193&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538125.aspx"&gt;IEnumTfCandidates&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=406&gt;
&lt;P&gt;Returned from &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538493.aspx"&gt;ITfCandidateList::EnumCandidates&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;There is a &lt;A href="http://msdn.microsoft.com/archive/en-us/samples/internet/TextServicesFrameWork/CandidateList/default.asp"&gt;sample text service&lt;/A&gt; that implements candidates available on MSDN.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2412584" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx">tsf</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tour/default.aspx">tour</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/Text+Services/default.aspx">Text Services</category></item><item><title>Text Services:  Function Providers</title><link>http://blogs.msdn.com/tsfaware/archive/2007/05/11/text-services-function-providers.aspx</link><pubDate>Fri, 11 May 2007 17:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2412531</guid><dc:creator>Eric Brown</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/tsfaware/comments/2412531.aspx</comments><wfw:commentRss>http://blogs.msdn.com/tsfaware/commentrss.aspx?PostID=2412531</wfw:commentRss><wfw:comment>http://blogs.msdn.com/tsfaware/rsscomments.aspx?PostID=2412531</wfw:comment><description>&lt;P&gt;TSF allows text services to offer optional extension points through the &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538979.aspx"&gt;ITfFunctionProvider&lt;/A&gt; interface.&amp;nbsp; Indirection through the function provider allows text services to minimize memory usage and startup time by instantiating services when requested, rather than when loaded.&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 width=599 border=1&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;B&gt;How Obtained&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538979.aspx"&gt;ITfFunctionProvider&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;Obtained by QI from &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628964.aspx"&gt;ITfTextInputProcessor&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538978.aspx"&gt;ITfFunction&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;Returned from &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538981.aspx"&gt;ITfFunctionProvider::GetFunction&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;Text services that implement &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538979.aspx"&gt;ITfFunctionProvider&lt;/A&gt; must register the interface with the TSF manager by QueryInterface'ing the &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt; object for &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628942.aspx"&gt;ITfSourceSingle&lt;/A&gt;, and then calling &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628943.aspx"&gt;ITfSourceSingle::AdviseSingleSink()&lt;/A&gt;. &lt;/P&gt;
&lt;H3&gt;Standard Functions&lt;/H3&gt;
&lt;P&gt;These interfaces are implemented by a text service, and are all optional.&amp;nbsp; These interfaces are returned from a call to &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538981.aspx"&gt;ITfFunctionProvider::GetFunction&lt;/A&gt;, and all derive from &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538978.aspx"&gt;ITfFunction&lt;/A&gt;.&amp;nbsp; Note that your text service can implement other functions via &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538979.aspx"&gt;ITfFunctionProvider&lt;/A&gt;; these are just the predefined interfaces.&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 width=599 border=1&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;B&gt;When should a text service implement this?&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538976.aspx"&gt;ITfFnShowHelp&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;Implement this if your service has a help dialog.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538970.aspx"&gt;ITfFnReconversion&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;Implement this if your service supports candidates (&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538492.aspx"&gt;ITfCandidateList&lt;/A&gt;, et. al.)&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538963.aspx"&gt;ITfFnPropertyUIStatus&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;Implement this if you want to serialize your custom properties.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538925.aspx"&gt;ITfFnConfigure&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;Implement this if your text service has a configuration dialog.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538921.aspx"&gt;ITfFnBalloon&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;Think about implementing this if your text service implements &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628702.aspx"&gt;ITfLangBarItemBalloon&lt;/A&gt;.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2412531" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx">tsf</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tour/default.aspx">tour</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/Text+Services/default.aspx">Text Services</category></item><item><title>Text Services: Language Bar</title><link>http://blogs.msdn.com/tsfaware/archive/2007/05/10/text-services-language-bar.aspx</link><pubDate>Thu, 10 May 2007 17:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2412513</guid><dc:creator>Eric Brown</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/tsfaware/comments/2412513.aspx</comments><wfw:commentRss>http://blogs.msdn.com/tsfaware/commentrss.aspx?PostID=2412513</wfw:commentRss><wfw:comment>http://blogs.msdn.com/tsfaware/rsscomments.aspx?PostID=2412513</wfw:comment><description>&lt;P&gt;If your text service wishes to display some UI on the language bar, then your service will need to create objects that implement one (or more) of the following interfaces:&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 width=599 border=1&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;B&gt;How Obtained&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628701.aspx"&gt;ITfLangBarItem&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;Pass this base interface to ITfLangBarItemMgr::AddItem&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628717.aspx"&gt;ITfLangBarItemButton&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;Derived from &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628701.aspx"&gt;ITfLangBarItem&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628707.aspx"&gt;ITfLangBarItemBitmapButton&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;Derived from &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628701.aspx"&gt;ITfLangBarItem&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628706.aspx"&gt;ITfLangBarItemBitmap&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;Derived from &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628701.aspx"&gt;ITfLangBarItem&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628702.aspx"&gt;ITfLangBarItemBalloon&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;Derived from &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628701.aspx"&gt;ITfLangBarItem&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;If your text service has an object that implements &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628701.aspx"&gt;ITfLangBarItem&lt;/A&gt; (or one of its subclasses), and that object updates the item, that object must also implement &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628941.aspx"&gt;ITfSource&lt;/A&gt; (and call &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628738.aspx"&gt;ITfLangBarItemSink::OnUpdate&lt;/A&gt;) so that TSF can redraw the language bar correctly.&amp;nbsp; See the article in MSDN on &lt;A href="http://msdn2.microsoft.com/ms628993.aspx"&gt;Implementing a Language Bar Object&lt;/A&gt;, and the &lt;A href="http://msdn.microsoft.com/archive/en-us/samples/internet/TextServicesFrameWork/IconInLanguageBar/default.asp"&gt;sample source code&lt;/A&gt;.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2412513" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx">tsf</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tour/default.aspx">tour</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/Text+Services/default.aspx">Text Services</category></item><item><title>Text Service: Display Attributes</title><link>http://blogs.msdn.com/tsfaware/archive/2007/05/09/text-service-display-attributes.aspx</link><pubDate>Wed, 09 May 2007 17:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2412505</guid><dc:creator>Eric Brown</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/tsfaware/comments/2412505.aspx</comments><wfw:commentRss>http://blogs.msdn.com/tsfaware/commentrss.aspx?PostID=2412505</wfw:commentRss><wfw:comment>http://blogs.msdn.com/tsfaware/rsscomments.aspx?PostID=2412505</wfw:comment><description>If your text service wishes to display text in different colors (e.g., displaying the current composition in red), then your text service needs to implement these interfaces: 
&lt;TABLE class="" cellSpacing=0 cellPadding=0 width=599 border=1&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=187&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=412&gt;
&lt;P&gt;&lt;B&gt;How Obtained&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=187&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538873.aspx"&gt;ITfDisplayAttributeProvider&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=412&gt;
&lt;P&gt;Obtained by QI from &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628964.aspx"&gt;ITfTextInputProcessor&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=187&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538154.aspx"&gt;IEnumTfDisplayAttributeInfo&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=412&gt;
&lt;P&gt;Returned from &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538875.aspx"&gt;ITfDisplayAttributeProvider::EnumDisplayAttributeInfo&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=187&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538802.aspx"&gt;ITfDisplayAttributeInfo&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=412&gt;
&lt;P&gt;Returned from &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538877.aspx"&gt;ITfDisplayAttributeProvider::GetDisplayAttributeInfo&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;If you implement &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538873.aspx"&gt;ITfDisplayAttributeProvider&lt;/A&gt;, you must also understand how properties work (because display attributes are set via properties), and you must also register your text service as a display attribute property provider at install time, like this:&lt;/P&gt;
&lt;P&gt;ITfCategoryMgr::RegisterCategory(&amp;lt;clsid of text service&amp;gt;, GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER, &amp;lt;clsid of text service&amp;gt;);&lt;/P&gt;
&lt;P&gt;MSDN also mentions GUID_TFCAT_DISPLAYATTRIBUTEPROPERTY, but it doesn't seem to be used in the samples or in any text service I can find.&lt;/P&gt;
&lt;P&gt;A working example of a text service that implements display attributes can be found in &lt;A href="http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/samples/internet/textservicesframework/compositionstringunderline/default.asp"&gt;MSDN&lt;/A&gt;.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2412505" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx">tsf</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tour/default.aspx">tour</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/Text+Services/default.aspx">Text Services</category></item><item><title>Text Service Properties</title><link>http://blogs.msdn.com/tsfaware/archive/2007/05/08/text-service-properties.aspx</link><pubDate>Tue, 08 May 2007 17:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2412485</guid><dc:creator>Eric Brown</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/tsfaware/comments/2412485.aspx</comments><wfw:commentRss>http://blogs.msdn.com/tsfaware/commentrss.aspx?PostID=2412485</wfw:commentRss><wfw:comment>http://blogs.msdn.com/tsfaware/rsscomments.aspx?PostID=2412485</wfw:comment><description>&lt;P&gt;The next thing that I'd like to talk about are properties.&amp;nbsp; While the TSF manager implements basic property handling (via ITfProperty), a text service has the ability to customize the way TSF handles properties.&lt;/P&gt;
&lt;P&gt;If your text service wishes to attach private information to the inserted text, it can do so by calling &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628904.aspx"&gt;ITfProperty::SetValue&lt;/A&gt;.&amp;nbsp; If you need to control the lifetime of that information (for example, when the property is removed during edits, or how the property will be serialized, or if your data doesn't easily fit in a VARIANT), then your property object&amp;nbsp;needs to implement &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628892.aspx"&gt;ITfPropertyStore&lt;/A&gt;, and your text service needs to call &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628905.aspx"&gt;ITfProperty::SetValueStore&lt;/A&gt; instead of &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628904.aspx"&gt;ITfProperty::SetValue&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;If your text service has a property that implements &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628892.aspx"&gt;ITfPropertyStore&lt;/A&gt;, &lt;EM&gt;and&lt;/EM&gt; the properties are being serialized, then your text service also must implement &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538799.aspx"&gt;ITfCreatePropertyStore&lt;/A&gt; (so that your properties can be deserialized), and it's a good idea to implement &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538963.aspx"&gt;ITfFnPropertyUIStatus&lt;/A&gt;, as well.&amp;nbsp; (I'll talk more about &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538963.aspx"&gt;ITfFnPropertyUIStatus&lt;/A&gt;&amp;nbsp;later.)&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 width=599 border=1&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=187&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=412&gt;
&lt;P&gt;&lt;B&gt;How Obtained&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=187&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628892.aspx"&gt;ITfPropertyStore&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=412&gt;
&lt;P&gt;Passed to &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628905.aspx"&gt;ITfProperty::SetValueStore&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=187&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538799.aspx"&gt;ITfCreatePropertyStore&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=412&gt;
&lt;P&gt;Obtained by QI from &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628964.aspx"&gt;ITfTextInputProcessor&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;Properties can be of 3 styles - static, static-compact, and custom.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Static properties store simple variants.&amp;nbsp; TSF always discards static properties when the range is modified, and serializes static properties that are not of type VT_UNKNOWN.&lt;/P&gt;
&lt;P&gt;Static-compact properties are similar to static properties, except that the range data for the properties are not stored; therefore, if two adjacent text ranges have the identical static-compact property applied to them, the ranges will be collapsed.&amp;nbsp; This can make a difference if you're enumerating the ranges of text covered by a particular property.&lt;/P&gt;
&lt;P&gt;Custom properties store an &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628892.aspx"&gt;ITfPropertyStore&lt;/A&gt; object, which owns the data.&amp;nbsp; TSF will ask the &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628892.aspx"&gt;ITfPropertyStore&lt;/A&gt; object what to do when the range is modified or serialized.&lt;/P&gt;
&lt;P&gt;If your text service defines one or more properties (i.e., not one of the &lt;A href="http://msdn2.microsoft.com/ms629017.aspx"&gt;predefined properties&lt;/A&gt;), your text service must also register each property via the category manager at install time.&amp;nbsp;&amp;nbsp; You &lt;B&gt;&lt;EM&gt;must&lt;/EM&gt;&lt;/B&gt; register the property style so that TSF knows what to do when the text changes.&amp;nbsp; The property style is registered like this:&lt;/P&gt;
&lt;P&gt;ITfCategoryMgr::RegisterCategory(&amp;lt;clsid of text service&amp;gt;, GUID_TFCAT_PROPSTYLE_XXX, &amp;lt;guid of property&amp;gt;);&lt;/P&gt;
&lt;P&gt;If your text service stores ink or audio data in a property, your text service must also register the property in a property category, like this:&lt;/P&gt;
&lt;P&gt;ITfCategoryMgr::RegisterCategory(&amp;lt;clsid of text service&amp;gt;, GUID_TFCAT_PROP_XXX, &amp;lt;guid of property&amp;gt;);&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2412485" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx">tsf</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tour/default.aspx">tour</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/Text+Services/default.aspx">Text Services</category></item><item><title>Text Service Basics</title><link>http://blogs.msdn.com/tsfaware/archive/2007/05/07/text-service-basics.aspx</link><pubDate>Mon, 07 May 2007 17:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2412396</guid><dc:creator>Eric Brown</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/tsfaware/comments/2412396.aspx</comments><wfw:commentRss>http://blogs.msdn.com/tsfaware/commentrss.aspx?PostID=2412396</wfw:commentRss><wfw:comment>http://blogs.msdn.com/tsfaware/rsscomments.aspx?PostID=2412396</wfw:comment><description>&lt;P&gt;&amp;nbsp;We have finally finished looking at the interfaces that TSF implements for you.&amp;nbsp; Now we start looking at the interfaces that text services must implement.&amp;nbsp; The first step are the essential interfaces.&lt;/P&gt;
&lt;P&gt;Every text service must implement these two interfaces.&amp;nbsp; It may optionally implement other interfaces (described in future posts).&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 width=599 border=1&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;B&gt;How Created&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628964.aspx"&gt;ITfTextInputProcessor&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;TSF will CoCreateInstance() this interface.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538906.aspx"&gt;ITfEditSession&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;Your text service will create objects that implement this interface in order to read or write the document text.&amp;nbsp; TSF will call &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538908.aspx"&gt;ITfEditSession::DoEditSession&lt;/A&gt; when the application is ready to let your service access the document.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;H3&gt;Text Service Categories&lt;/H3&gt;
&lt;P&gt;All text services need to install themselves with the TSF manager; usually at DLL registration time, but this can also be done at setup time (which would keep the registration code out of the text service DLL).&amp;nbsp; Registration is not clearly described in either the samples or the MSDN documentation, so I'm going to walk through a couple of examples to show how it's done.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;A text service is installed in 3 steps.&amp;nbsp; All three steps write to the machine registry (HKLM), so you will need full admin rights.&lt;/P&gt;
&lt;P&gt;First, the text service must register as an in-proc COM server; this is identical to the usual COM registration process.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Second, the text service must register with TSF.&amp;nbsp; You do this by calling &lt;A href="http://msdn2.microsoft.com/aa381947.aspx"&gt;ITfInputProcessorProfileMgr::RegisterProfile&lt;/A&gt; .&amp;nbsp; This is the new Vista function that does all the registration in one step; in XP, registration required several steps.&amp;nbsp; This function talks about a ‘profile', without ever really defining what that is.&amp;nbsp; A ‘profile' is a combination of a text service, language ID, and, possibly, a replacement keyboard layout.&amp;nbsp; Text services are often specific to a particular language; for example, the Japanese IME is, rather obviously, only suited to typing Japanese, and won't be available in English. &lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=145&gt;
&lt;P&gt;&lt;B&gt;Parameter&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=493&gt;
&lt;P&gt;&lt;B&gt;Meaning&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=145&gt;
&lt;P&gt;rclsid&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=493&gt;
&lt;P&gt;CLSID of the text service being registered.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=145&gt;
&lt;P&gt;langid &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=493&gt;
&lt;P&gt;&amp;nbsp;The language id of the profile. &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=145&gt;
&lt;P&gt;guidProfile &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=493&gt;
&lt;P&gt;The GUID to identify the profile.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=145&gt;
&lt;P&gt;pchDesc &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=493&gt;
&lt;P&gt;&amp;nbsp;The (user-visible) name of the profile. &amp;nbsp;&amp;nbsp;(For example, ‘My Text Service'.)&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=145&gt;
&lt;P&gt;cchDesc &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=493&gt;
&lt;P&gt;The length of pchDesc. &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=145&gt;
&lt;P&gt;pchIconFile &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=493&gt;
&lt;P&gt;&amp;nbsp;The full path of the icon file. TSF displays this icon as part of the language bar.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=145&gt;
&lt;P&gt;cchFile &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=493&gt;
&lt;P&gt;&amp;nbsp;The length of pchIconFile. &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=145&gt;
&lt;P&gt;uIconIndex &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=493&gt;
&lt;P&gt;&amp;nbsp;The location of the icon within the icon file.&amp;nbsp; Often zero, if there's only one icon in the file.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=145&gt;
&lt;P&gt;hklSubstitute &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=493&gt;
&lt;P&gt;&amp;nbsp;The substitute keyboard layout of this profile. &amp;nbsp;&amp;nbsp;When this profile is active, the keyboard will use this keyboard layout instead of the default keyboard layout.&amp;nbsp; This can be NULL if your text service doesn't change the keyboard layout. &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=145&gt;
&lt;P&gt;dwPreferredLayout &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=493&gt;
&lt;P&gt;&amp;nbsp;Unused. Must be 0. &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=145&gt;
&lt;P&gt;bEnabledByDefault &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=493&gt;
&lt;P&gt;True if this profile is enabled by default. &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=145&gt;
&lt;P&gt;dwFlags &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=493&gt;
&lt;P&gt;Usually zero.&amp;nbsp; Refer to MSDN for more details. &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Third, the text service must register its categories.&amp;nbsp; This is done by calling &lt;A href="http://msdn2.microsoft.com/ms538584.aspx"&gt;ITfCategoryMgr::RegisterCategory&lt;/A&gt;.&amp;nbsp; It takes 3 GUIDs as parameters - the CLSID of the text service, the category GUID (almost always one of the &lt;A href="http://msdn2.microsoft.com/ms629012.aspx"&gt;predefined categories&lt;/A&gt;), and the GUID of the item being registered.&amp;nbsp; Every text service must register the TIP category (keyboard, speech, handwriting); it may also need to make other registration calls if it implements other functions, like display attributes or custom properties.&amp;nbsp; To register as a keyboard text service, the call would look like this:&lt;/P&gt;
&lt;P&gt;ITfCategoryMgr::RegisterCategory(&amp;lt;clsid of text service&amp;gt;, GUID_TFCAT_TIP_KEYBOARD, &amp;lt; clsid of text service &amp;gt;);&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2412396" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx">tsf</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tour/default.aspx">tour</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/Text+Services/default.aspx">Text Services</category></item><item><title>A Tour through TSF: Miscellaneous Functions</title><link>http://blogs.msdn.com/tsfaware/archive/2007/05/05/a-tour-through-tsf-miscellaneous-functions.aspx</link><pubDate>Sat, 05 May 2007 17:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2381755</guid><dc:creator>Eric Brown</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/tsfaware/comments/2381755.aspx</comments><wfw:commentRss>http://blogs.msdn.com/tsfaware/commentrss.aspx?PostID=2381755</wfw:commentRss><wfw:comment>http://blogs.msdn.com/tsfaware/rsscomments.aspx?PostID=2381755</wfw:comment><description>The last set of interfaces implemented by the TSF manager are the 'odd-ball' interfaces that don't really fall into any other logical groups.&amp;nbsp; 
&lt;H3&gt;Helpers&lt;/H3&gt;
&lt;P&gt;The interfaces in this category provide auxiliary services for applications or text services.&amp;nbsp; &lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 width=599 border=1&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;&lt;B&gt;How to Obtain&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538387.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538387.aspx"&gt;ITextStoreACPServices&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538395.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538395.aspx"&gt;ITextStoreACPSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538395.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538395.aspx"&gt;ITextStoreACPSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;Passed to &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538414.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538414.aspx"&gt;ITextStoreACP::AdviseSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538901.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538901.aspx"&gt;ITfEditRecord&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;Passed to &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628963.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628963.aspx"&gt;ITfTextEditSink::OnEndEdit&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&amp;nbsp; 
&lt;H3&gt;MSAA interoperability&lt;/H3&gt;
&lt;P&gt;These interfaces were originally created to allow TSF to interoperate with MSAA.&amp;nbsp; Unfortunately, no 3&lt;SUP&gt;rd&lt;/SUP&gt; party developers implemented the MSAA client support needed to make these interfaces work, so at this point, these interfaces are effectively obsolete.&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 width=265 border=1&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538090.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538090.aspx"&gt;IAnchor&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628809.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628809.aspx"&gt;ITfMSAAControl&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538453.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538453.aspx"&gt;ITextStoreAnchor&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538454.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538454.aspx"&gt;ITextStoreAnchorSink&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2381755" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx">tsf</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tour/default.aspx">tour</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/TSF+Manager/default.aspx">TSF Manager</category></item><item><title>A Tour through TSF: Language Bar</title><link>http://blogs.msdn.com/tsfaware/archive/2007/05/04/a-tour-through-tsf-language-bar.aspx</link><pubDate>Fri, 04 May 2007 17:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2381732</guid><dc:creator>Eric Brown</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/tsfaware/comments/2381732.aspx</comments><wfw:commentRss>http://blogs.msdn.com/tsfaware/commentrss.aspx?PostID=2381732</wfw:commentRss><wfw:comment>http://blogs.msdn.com/tsfaware/rsscomments.aspx?PostID=2381732</wfw:comment><description>&lt;P&gt;These interfaces manage the language bar and the items that display on the language bar.&amp;nbsp; These interfaces are used exclusively by text services, and will be discussed further in a future post.&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 width=599 border=1&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;&lt;B&gt;How to Obtain&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628748.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628748.aspx"&gt;ITfLangBarMgr&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;CoCreateInstance(CLSID_TF_LangBarMgr)&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628780.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628780.aspx"&gt;ITfMenu&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;Passed to:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628711.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628711.aspx"&gt;ITfLangBarItemBitmapButton::InitMenu&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628720.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628720.aspx"&gt;ITfLangBarItemButton::InitMenu&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628953.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628953.aspx"&gt;ITfSystemDeviceTypeLangBarItem&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628701.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628701.aspx"&gt;ITfLangBarItem&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628956.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628956.aspx"&gt;ITfSystemLangBarItem&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628780.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628780.aspx"&gt;ITfMenu&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa383169.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa383169.aspx"&gt;ITfTransitoryExtensionUIElement&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P mce_keep="true"&gt;QI on &lt;A class="" title=ITfUIElement href="http://msdn2.microsoft.com/aa383175.aspx" mce_href="http://msdn2.microsoft.com/aa383175.aspx"&gt;ITfUIElement&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2381732" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx">tsf</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tour/default.aspx">tour</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/TSF+Manager/default.aspx">TSF Manager</category></item><item><title>A Tour through TSF: Enumerators</title><link>http://blogs.msdn.com/tsfaware/archive/2007/05/03/a-tour-through-tsf-enumerators.aspx</link><pubDate>Thu, 03 May 2007 17:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2381683</guid><dc:creator>Eric Brown</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/tsfaware/comments/2381683.aspx</comments><wfw:commentRss>http://blogs.msdn.com/tsfaware/commentrss.aspx?PostID=2381683</wfw:commentRss><wfw:comment>http://blogs.msdn.com/tsfaware/rsscomments.aspx?PostID=2381683</wfw:comment><description>&lt;P&gt;The next set of TSF manager interfaces are&amp;nbsp;the&amp;nbsp;enumerators.&amp;nbsp; These are rather boring interfaces; they just enumerate things.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Generally speaking, the enumerators enumerate things owned by&amp;nbsp;the item that provides the enumerator.&amp;nbsp; For example, IEnumTfContexts is returned from ITfDocumentMgr.&amp;nbsp; Therefore, it enumerates the contexts owned by that document manager, and not by any other document manager.&amp;nbsp; Similarly, IEnumTfFunctionProviders is returned from ITfThreadMgr.&amp;nbsp; Therefore, it enumerates the function providers registered with that thread, and not any others.&lt;/P&gt;
&lt;P&gt;The only interesting&amp;nbsp;thing about these interfaces&amp;nbsp;is how you get them.&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 width=599 border=1&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;&lt;B&gt;How to Obtain&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538115.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538115.aspx"&gt;IEnumITfCompositionView&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538710.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538710.aspx"&gt;ITfContextComposition::FindComposition&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538135.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538135.aspx"&gt;IEnumTfContexts&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538891.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538891.aspx"&gt;ITfDocumentMgr::EnumContexts&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538164.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538164.aspx"&gt;IEnumTfDocumentMgrs&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628983.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628983.aspx"&gt;ITfThreadMgr::EnumDocumentMgrs&amp;nbsp;&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538172.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538172.aspx"&gt;IEnumTfFunctionProviders&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628984.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628984.aspx"&gt;ITfThreadMgr::EnumFunctionProviders&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538185.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538185.aspx"&gt;IEnumTfLangBarItems&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628727.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628727.aspx"&gt;ITfLangBarItemMgr::EnumItems&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538196.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538196.aspx"&gt;IEnumTfLanguageProfiles&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628558.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628558.aspx"&gt;ITfInputProcessorProfiles::EnumLanguageProfiles&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538218.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538218.aspx"&gt;IEnumTfProperties&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538785.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538785.aspx"&gt;ITfContext::EnumProperties&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538230.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538230.aspx"&gt;IEnumTfPropertyValue&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538798.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538798.aspx"&gt;ITfContext::TrackProperties&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538241.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538241.aspx"&gt;IEnumTfRanges&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628937.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628937.aspx"&gt;ITfReadOnlyProperty::EnumRanges&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;(and therefore, ITfProperty::EnumRanges)&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538905.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538905.aspx"&gt;ITfEditRecord::GetTextAndPropertyChanges&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa380866.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa380866.aspx"&gt;IEnumTfUIElements&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;ITfUIElementMgr::EnumUIElements&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2381683" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx">tsf</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tour/default.aspx">tour</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/TSF+Manager/default.aspx">TSF Manager</category></item><item><title>A Tour through TSF: Event sinks</title><link>http://blogs.msdn.com/tsfaware/archive/2007/05/02/a-tour-through-tsf-event-sinks.aspx</link><pubDate>Wed, 02 May 2007 17:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2341870</guid><dc:creator>Eric Brown</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/tsfaware/comments/2341870.aspx</comments><wfw:commentRss>http://blogs.msdn.com/tsfaware/commentrss.aspx?PostID=2341870</wfw:commentRss><wfw:comment>http://blogs.msdn.com/tsfaware/rsscomments.aspx?PostID=2341870</wfw:comment><description>&lt;P&gt;The interfaces in this category allow you to&amp;nbsp;be called back&amp;nbsp;when certain events happen on another interface.&amp;nbsp; These callbacks are generally referred to as 'event sinks'. &lt;/P&gt;
&lt;P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 width=599 border=1&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;&lt;B&gt;How to Obtain&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628941.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628941.aspx"&gt;ITfSource&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt;, &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx"&gt;ITfContext&lt;/A&gt;, &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538621.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538621.aspx"&gt;ITfCompartment&lt;/A&gt;, &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538984.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538984.aspx"&gt;ITfInputProcessorProfiles&lt;/A&gt;, &lt;A class="" title=ITfDocumentMgr href="http://msdn2.microsoft.com/ms538878.aspx" mce_href="http://msdn2.microsoft.com/ms538878.aspx"&gt;ITfDocumentMgr&lt;/A&gt;, or &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628701.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628701.aspx"&gt;ITfLangBarItem&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628942.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628942.aspx"&gt;ITfSourceSingle&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt; or &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx"&gt;ITfContext&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;H2&gt;
&lt;H3&gt;Event Sinks&lt;/H3&gt;&lt;/H2&gt;
&lt;P&gt;TSF can call your application or text service back when certain events occur.&amp;nbsp; Many event sinks are installed by a two-step process:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;1) Call QueryInterface() on a host interface (described in the table) for &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628941.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628941.aspx"&gt;ITfSource&lt;/A&gt;;&lt;/LI&gt;
&lt;LI&gt;2) Call &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628945.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628945.aspx"&gt;ITfSource::AdviseSink()&lt;/A&gt; with the target interface IID and the target interface pointer.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;You will get back a cookie that you will need to pass back to &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628946.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628946.aspx"&gt;ITfSource::UnadviseSink()&lt;/A&gt; when it's time to detach from the event source (e.g., when the host or target object is about to be destroyed, or the text service is uninitializing).&lt;/P&gt;
&lt;P&gt;Your application or text service must implement the target interface; these interfaces are typically implemented on the main object (i.e., the object that implements either &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538384.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538384.aspx"&gt;ITextStoreACP&lt;/A&gt; or &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628964.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628964.aspx"&gt;ITfTextInputProcessor&lt;/A&gt; for applications or text services, respectively).&lt;/P&gt;
&lt;P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 width=599 border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;B&gt;Target Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;B&gt;Hosting Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538490.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538490.aspx"&gt;ITfActiveLanguageProfileNotifySink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&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&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538621.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538621.aspx"&gt;ITfCompartment&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538718.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538718.aspx"&gt;ITfContextKeyEventSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx"&gt;ITfContext&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538869.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538869.aspx"&gt;ITfDisplayAttributeNotifySink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538910.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538910.aspx"&gt;ITfEditTransactionSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx"&gt;ITfContext&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628691.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628691.aspx"&gt;ITfKeyTraceEventSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628736.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628736.aspx"&gt;ITfLangBarItemSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628701.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628701.aspx"&gt;ITfLangBarItem&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628769.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628769.aspx"&gt;ITfLanguageProfileNotifySink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538984.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538984.aspx"&gt;ITfInputProcessorProfiles&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628879.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628879.aspx"&gt;ITfPreservedKeyNotifySink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628951.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628951.aspx"&gt;ITfStatusSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx"&gt;ITfContext&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628957.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628957.aspx"&gt;ITfSystemLangBarItemSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628701.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628701.aspx"&gt;ITfLangBarItem&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628962.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628962.aspx"&gt;ITfTextEditSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx"&gt;ITfContext&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628967.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628967.aspx"&gt;ITfTextLayoutSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx"&gt;ITfContext&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628969.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628969.aspx"&gt;ITfThreadFocusSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628973.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628973.aspx"&gt;ITfThreadMgrEventSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa383163.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa383163.aspx"&gt;ITfTransitoryExtensionSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P mce_keep="true"&gt;&lt;A class="" title=ITfDocumentMgr href="http://msdn2.microsoft.com/ms538878.aspx" mce_href="http://msdn2.microsoft.com/ms538878.aspx"&gt;ITfDocumentMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa383201.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa383201.aspx"&gt;ITfUIElementSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa383178.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa383178.aspx"&gt;ITfUIElementMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;H3&gt;Single sinks&lt;/H3&gt;
&lt;P&gt;Some event sources can only have a single sink attached.&amp;nbsp; Attaching an single event sink is similar to installing a regular event sink, except that you QueryInterface() for &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628942.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628942.aspx"&gt;ITfSourceSingle&lt;/A&gt; instead of &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628941.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628941.aspx"&gt;ITfSource&lt;/A&gt;; one then attaches the sink by calling &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628943.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628943.aspx"&gt;ITfSourceSingle::AdviseSingleSink().&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 width=599 border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;B&gt;Hosting Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538609.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538609.aspx"&gt;ITfCleanupContextSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx"&gt;ITfContext&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538601.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538601.aspx"&gt;ITfCleanupContextDurationSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;H3&gt;Specialized Sinks&lt;/H3&gt;
&lt;P&gt;Some event sinks are attached by calling specific methods.&amp;nbsp; The following table describes the installation method for these sinks:&lt;/P&gt;
&lt;P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 width=599 border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;B&gt;Installation Method&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628793.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628793.aspx"&gt;ITfMouseSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628805.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628805.aspx"&gt;ITfMouseTracker::AdviseMouseSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538654.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538654.aspx"&gt;ITfCompositionSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538713.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538713.aspx"&gt;ITfContextComposition::StartComposition&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628694.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628694.aspx"&gt;ITfLangBarEventSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628750.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628750.aspx"&gt;ITfLangBarMgr::AdviseEventSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628601.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628601.aspx"&gt;ITfKeyEventSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=334&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628677.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628677.aspx"&gt;ITfKeystrokeMgr::AdviseKeyEventSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2341870" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx">tsf</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tour/default.aspx">tour</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/TSF+Manager/default.aspx">TSF Manager</category></item><item><title>A Tour through TSF: Contexts and Ranges</title><link>http://blogs.msdn.com/tsfaware/archive/2007/05/01/a-tour-through-tsf-contexts-and-ranges.aspx</link><pubDate>Tue, 01 May 2007 17:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2316907</guid><dc:creator>Eric Brown</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/tsfaware/comments/2316907.aspx</comments><wfw:commentRss>http://blogs.msdn.com/tsfaware/commentrss.aspx?PostID=2316907</wfw:commentRss><wfw:comment>http://blogs.msdn.com/tsfaware/rsscomments.aspx?PostID=2316907</wfw:comment><description>&lt;P&gt;Our next stop&amp;nbsp;on our tour through TSF brings us to the two most heavily used&amp;nbsp;interfaces in text services:&amp;nbsp; Contexts and Ranges.&amp;nbsp; But first, a quick diversion to discuss the relationship between threads, documents, and contexts.&lt;/P&gt;
&lt;P mce_keep="true"&gt;The &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt; object is the primary object implemented by TSF.&amp;nbsp; TSF ensures that no more than one &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt; object exists in each thread.&amp;nbsp;&amp;nbsp; The &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt; object manages documents, text services, and handles focus changes between documents.&lt;/P&gt;
&lt;P mce_keep="true"&gt;The &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538878.aspx"&gt;ITfDocumentMgr&lt;/A&gt; object represents a logical document.&amp;nbsp; It isn't heavily used, though; its primary purpose is to be a container for edit contexts.&amp;nbsp; There is usually only one context in the document manager, although sometimes &lt;A href="http://msdn2.microsoft.com/ms538899.aspx"&gt;there can be two&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;The &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx"&gt;ITfContext&lt;/A&gt; object represents a view of the document that you can interact with; it manages selections, properties, &amp;amp; ranges.&lt;/P&gt;
&lt;H3&gt;Contexts&lt;/H3&gt;
&lt;P&gt;A context represents a view of the document that a text service can interact with.&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 border=1&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;&lt;B&gt;How to Obtain&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx"&gt;ITfContext&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;Varies widely.&amp;nbsp; Common examples:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538895.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538895.aspx"&gt;ITfDocumentMgr::GetTop()&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538890.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538890.aspx"&gt;ITfDocumentMgr::CreateContext()&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538779.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538779.aspx"&gt;ITfContextView&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538787.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538787.aspx"&gt;ITfContext::GetActiveView&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538705.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538705.aspx"&gt;ITfContextComposition&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx"&gt;ITfContext&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538734.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538734.aspx"&gt;ITfContextOwnerCompositionServices&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx"&gt;ITfContext&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538750.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538750.aspx"&gt;ITfContextOwnerServices&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx"&gt;ITfContext&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628595.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628595.aspx"&gt;ITfInsertAtSelection&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx"&gt;ITfContext&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628797.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628797.aspx"&gt;ITfMouseTracker&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx"&gt;ITfContext&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628906.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628906.aspx"&gt;ITfQueryEmbedded&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538703.aspx"&gt;ITfContext&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538653.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538653.aspx"&gt;ITfComposition&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538713.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538713.aspx"&gt;ITfContextComposition::StartComposition&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538660.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538660.aspx"&gt;ITfCompositionView&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;Passed to any of:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538745.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538745.aspx"&gt;ITfContextOwnerCompositionSink::OnStartComposition&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538747.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538747.aspx"&gt;ITfContextOwnerCompositionSink::OnUpdateComposition&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538743.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538743.aspx"&gt;ITfContextOwnerCompositionSink::OnEndComposition&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;Once you have a context (and usually an edit cookie - most of the things you can do with contexts can only be done from within edit sessions), you can start to manipulate the document.&amp;nbsp; &lt;/P&gt;
&lt;H3&gt;Ranges&lt;/H3&gt;
&lt;P&gt;These interfaces deal with pieces of text within a logical document.&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 border=1&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;&lt;B&gt;How to Obtain&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628908.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628908.aspx"&gt;ITfRange&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;Varies widely;&amp;nbsp; common instances are:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538792.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538792.aspx"&gt;ITfContext::GetSelection&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628909.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628909.aspx"&gt;ITfRangeACP&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628908.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628908.aspx"&gt;ITfRange&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=241&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628912.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628912.aspx"&gt;ITfRangeBackup&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=358&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538784.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538784.aspx"&gt;ITfContext::CreateRangeBackup&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2316907" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx">tsf</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tour/default.aspx">tour</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/TSF+Manager/default.aspx">TSF Manager</category></item><item><title>A Tour through TSF:  TSF Managers</title><link>http://blogs.msdn.com/tsfaware/archive/2007/04/30/a-tour-through-tsf-tsf-managers.aspx</link><pubDate>Mon, 30 Apr 2007 17:46:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2315189</guid><dc:creator>Eric Brown</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/tsfaware/comments/2315189.aspx</comments><wfw:commentRss>http://blogs.msdn.com/tsfaware/commentrss.aspx?PostID=2315189</wfw:commentRss><wfw:comment>http://blogs.msdn.com/tsfaware/rsscomments.aspx?PostID=2315189</wfw:comment><description>&lt;P&gt;The next stop&amp;nbsp;on the tour is an extended visit through the TSF manager interfaces.&amp;nbsp;Since TSF implements a lot of interfaces, I decided to break them up into separate posts.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I've also included a (very brief) description of how a text service (or application) would obtain an instance of each interface.&amp;nbsp; By default, an instance of the interface is returned by the method listed.&amp;nbsp; Some interfaces are obtained by calling QueryInterface() on the specified interface, other interfaces are passed as parameters to specified methods, and yet others are obtained by calling CoCreateInstance() with a particular CLSID. &lt;/P&gt;
&lt;P&gt;&amp;nbsp;This post describes the 'top-level' interfaces in TSF.&amp;nbsp; You either create them directly, or you obtain them either when your application initializes TSF, or when your text service is activated.&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 border=1&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=354&gt;
&lt;P&gt;&lt;B&gt;How to Obtain&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538500.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538500.aspx"&gt;ITfCategoryMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=354&gt;
&lt;P&gt;CoCreateInstance(CLSID_TF_CategoryMgr)&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538808.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538808.aspx"&gt;ITfDisplayAttributeMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=354&gt;
&lt;P&gt;CoCreateInstance(CLSID_TF_DisplayAttributeMgr)&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538878.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538878.aspx"&gt;ITfDocumentMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=354&gt;
&lt;P&gt;Application:&amp;nbsp; &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628981.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628981.aspx"&gt;ITfThreadMgr::CreateDocumentMgr&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Text Service: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628985.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628985.aspx"&gt;ITfThreadMgr::GetFocus&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628974.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628974.aspx"&gt;ITfThreadMgrEventSink::OnInitDocumentMgr&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628977.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628977.aspx"&gt;ITfThreadMgrEventSink::OnSetFocus&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628978.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628978.aspx"&gt;ITfThreadMgrEventSink::OnUninitDocumentMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa381941.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa381941.aspx"&gt;ItfInputProcessorProfileMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=354&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538984.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538984.aspx"&gt;ITfInputProcessorProfiles&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538984.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538984.aspx"&gt;ITfInputProcessorProfiles&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=354&gt;
&lt;P&gt;CoCreateInstance(CLSID_TF_InputProcessorProfiles)&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538985.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538985.aspx"&gt;ITfInputProcessorProfilesEx&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=354&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538984.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538984.aspx"&gt;ITfInputProcessorProfiles&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538987.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538987.aspx"&gt;ITfInputProcessorProfileSubstituteLayout&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=354&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538984.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538984.aspx"&gt;ITfInputProcessorProfiles&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=354&gt;
&lt;P&gt;Application: CoCreateInstance(CLSID_TF_ThreadMgr)&lt;/P&gt;
&lt;P&gt;Text Service: Passed to &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628965.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628965.aspx"&gt;ITfTextInputProcessor::Activate&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa383146.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa383146.aspx"&gt;ITfThreadMgrEx&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=354&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538615.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538615.aspx"&gt;ITfClientId&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=354&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538692.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538692.aspx"&gt;ITfConfigureSystemKeystrokeFeed&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=354&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628676.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628676.aspx"&gt;ITfKeystrokeMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=354&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628723.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628723.aspx"&gt;ITfLangBarItemMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=354&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628783.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628783.aspx"&gt;ITfMessagePump&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=354&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa383178.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa383178.aspx"&gt;ITfUIElementMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=354&gt;
&lt;P&gt;QI on &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628972.aspx"&gt;ITfThreadMgr&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Update (7/3):&amp;nbsp; I incorrectly listed &lt;A href="http://msdn2.microsoft.com/en-us/library/aa381941.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa381941.aspx"&gt;ItfInputProcessorProfileMgr&lt;/A&gt;&amp;nbsp;as an interface that could be directly created.&amp;nbsp; Gael pointed out that this was incorrect, and I've updated the table to list the correct method.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2315189" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx">tsf</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tour/default.aspx">tour</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/TSF+Manager/default.aspx">TSF Manager</category></item><item><title>TSF Application interfaces</title><link>http://blogs.msdn.com/tsfaware/archive/2007/04/27/tsf-application-interfaces.aspx</link><pubDate>Sat, 28 Apr 2007 01:36:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2291853</guid><dc:creator>Eric Brown</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/tsfaware/comments/2291853.aspx</comments><wfw:commentRss>http://blogs.msdn.com/tsfaware/commentrss.aspx?PostID=2291853</wfw:commentRss><wfw:comment>http://blogs.msdn.com/tsfaware/rsscomments.aspx?PostID=2291853</wfw:comment><description>&lt;P&gt;The first stop on the TSF tour is the application interfaces.&amp;nbsp; These are implemented by applications or text controls.&lt;/P&gt;
&lt;P&gt;An application (or text control) must implement &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538384.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538384.aspx"&gt;ITextStoreACP&lt;/A&gt; to be considered ‘TSF-aware'.&amp;nbsp; It may choose to implement any of the other interfaces described in the table below.&amp;nbsp; I also describe how TSF obtains an instance of each interface. &lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 width=643 border=1&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=102&gt;
&lt;P&gt;&lt;B&gt;Optional?&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=276&gt;
&lt;P&gt;&lt;B&gt;How Obtained?&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538384.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538384.aspx"&gt;ITextStoreACP&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=102&gt;
&lt;P&gt;No&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=276&gt;
&lt;P&gt;&lt;A&gt;Passed to &lt;/A&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538890.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538890.aspx"&gt;ITfDocumentMgr::CreateContext&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628582.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628582.aspx"&gt;ITfInputScope&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=102&gt;
&lt;P&gt;Yes&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=276&gt;
&lt;P&gt;Returned from &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538448.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538448.aspx"&gt;ITextStoreACP::RequestSupportedAttrs&lt;/A&gt; with GUID_PROP_INPUTSCOPE.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa382054.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa382054.aspx"&gt;ITfInputScope2&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=102&gt;
&lt;P&gt;Yes&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=276&gt;
&lt;P&gt;QI from &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628582.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628582.aspx"&gt;ITfInputScope&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628877.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628877.aspx"&gt;ITfPersistentPropertyLoaderACP&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=102&gt;
&lt;P&gt;Yes&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=276&gt;
&lt;P&gt;Passed to &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538394.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538394.aspx"&gt;ITextStoreACPServices::Unserialize&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628799.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628799.aspx"&gt;ITfMouseTrackerACP&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=102&gt;
&lt;P&gt;Yes&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=276&gt;
&lt;P&gt;QI from &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538384.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538384.aspx"&gt;ITextStoreACP&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538740.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538740.aspx"&gt;ITfContextOwnerCompositionSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=102&gt;
&lt;P&gt;Yes&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=276&gt;
&lt;P&gt;Passed to &lt;A href="http://msdn2.microsoft.com/en-us/library/ms538890.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms538890.aspx"&gt;ITfDocumentMgr::CreateContext&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa383201.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa383201.aspx"&gt;ITfUIElementSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=102&gt;
&lt;P&gt;Yes&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=276&gt;
&lt;P&gt;Passed to &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628945.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms628945.aspx"&gt;ITfSource::AdviseSink&lt;/A&gt; (see below)&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;Note: I put &lt;A href="http://msdn2.microsoft.com/en-us/library/aa383201.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa383201.aspx"&gt;ITfUIElementSink&lt;/A&gt; here because text services &lt;I&gt;never&lt;/I&gt; implement this interface, even though it's an event sink (described in a future post). &amp;nbsp;&amp;nbsp;Full-screen applications (or games) would implement this interface if they wish to control the UI drawn by text services.&amp;nbsp; (See the discussion of &lt;A href="http://msdn2.microsoft.com/en-us/library/aa966970.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa966970.aspx"&gt;UILess mode&lt;/A&gt; in MSDN.)&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=0 width=631 border=1&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;B&gt;Interface&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=366&gt;
&lt;P&gt;&lt;B&gt;When to implement&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538384.aspx"&gt;ITextStoreACP&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=366&gt;
&lt;P&gt;Always implement this.&amp;nbsp; &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628582.aspx"&gt;ITfInputScope&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=366&gt;
&lt;P&gt;Consider implementing this.&amp;nbsp; It's not hard, and some text services use it to improve recognition (e.g., Windows Speech Recognition knows about the URL input scope, and has special code for that).&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa382054.aspx"&gt;ITfInputScope2&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=366&gt;
&lt;P&gt;Implement this if you implemented &lt;A href="http://msdn2.microsoft.com/en-us/library/ms628582.aspx"&gt;ITfInputScope&lt;/A&gt;, and you need the extra functionality (string enumeration).&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628877.aspx"&gt;ITfPersistentPropertyLoaderACP&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=366&gt;
&lt;P&gt;Implement this if you support asynchronous property loading.&amp;nbsp; If you don't know what that means, you don't need to implement this.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms628799.aspx"&gt;ITfMouseTrackerACP&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=366&gt;
&lt;P&gt;Implement this to help handwriting recognition (I believe that you must implement this to get gestures).&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms538740.aspx"&gt;ITfContextOwnerCompositionSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=366&gt;
&lt;P&gt;Implement this if you need control over compositions.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=265&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa383201.aspx"&gt;ITfUIElementSink&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=366&gt;
&lt;P&gt;Only implement this if your application takes over the screen,&amp;nbsp;and you still want IMEs to work inside your application.&amp;nbsp; It's a fair amount of work to implement this.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2291853" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tsf/default.aspx">tsf</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/tour/default.aspx">tour</category><category domain="http://blogs.msdn.com/tsfaware/archive/tags/Applications/default.aspx">Applications</category></item></channel></rss>