Text Services: Vista Extensions

In Windows Vista, TSF added the ability to run in locations where it had previously been disabled.  For example, TSF is now available on secure desktops, in full screen (DirectX) applications, and in MTA threads.  However, text services have to be aware of these new environments, and must tell TSF that it is aware of these environments.

 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 ITfTextInputProcessorEx instead of ITfTextInputProcessor

Interface

How Created

ITfTextInputProcessorEx

TSF will CoCreateInstance() this interface.

Next, text services that implement ITfTextInputProcessorEx must also register under one or more of the appropriate categories: GUID_TFCAT_TIPCAP_COMLESS, GUID_TFCAT_TIPCAP_SECUREMODE, GUID_TFCAT_TIPCAP_UIELEMENTENABLED, or GUID_TFCAT_TIPCAP_WOW16.

What do these categories mean?

Category

Meaning

GUID_TFCAT_TIPCAP_SECUREMODE

Text service will be launched on the secure desktop.

GUID_TFCAT_TIPCAP_UIELEMENTENABLED

Text service implements ITfUIElement, and draws its UI accordingly.

GUID_TFCAT_TIPCAP_COMLESS

Text service can operate without COM. See below.

GUID_TFCAT_TIPCAP_WOW16

Text service can work with Win16 applications.  All text services in this category are assumed to be in the GUID_TFCAT_TIPCAP_COMLESS category as well.

Text Services without COM

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.  In Vista, the TSF Manager can create text services without using COM (by loading the DLL directly and calling DllGetClassFactory).  However, there are obvious restrictions on text services - namely, that the service itself cannot use COM, either.  If a text service follows these restrictions, it can register under the GUID_TFCAT_TIPCAP_COMLESS category, and be active in more applications.

COM-less text services can still create COM objects, but they cannot use CoCreateInstance().  Instead, COM objects can be allocated off the heap, or ATL-based text services can use CComObject<T>::CreateInstance().