TSF注册种类不够,会造成win8以上系统或其部分程序切换不了,输入法图标不正常,部分特别的程序码不了字.
先看一下种类的注册的GUID值:
整理的如下:
1 GUID_TFCAT_CATEGORY_OF_TIP=={534C48C1-0607-4098-A521-4FC899C73E90}
2 GUID_TFCAT_TIP_KEYBOARD=={34745C63-B2F0-4784-8B67-5E12C8701A31}
3 GUID_TFCAT_TIP_SPEECH=={B5A73CD1-8355-426B-A161-259808F26B14}
4 GUID_TFCAT_TIP_HANDWRITING=={246ECB87-C2F2-4ABE-905B-C8B38ADD2C43}
5 GUID_TFCAT_TIPCAP_SECUREMODE=={49D2F9CE-1F5E-11D7-A6D3-00065B84435C}
6 GUID_TFCAT_TIPCAP_UIELEMENTENABLED=={49D2F9CF-1F5E-11D7-A6D3-00065B84435C}
7 GUID_TFCAT_TIPCAP_INPUTMODECOMPARTMENT=={CCF05DD7-4A87-11D7-A6E2-00065B84435C}
7 GUID_TFCAT_TIPCAP_COMLESS=={364215D9-75BC-11D7-A6EF-00065B84435C}
8 GUID_TFCAT_TIPCAP_WOW16=={364215DA-75BC-11D7-A6EF-00065B84435C}
9 GUID_TFCAT_TIPCAP_IMMERSIVESUPPORT=={13A016DF-560B-46CD-947A-4C3AF1E0E35D}
10 GUID_TFCAT_TIPCAP_SYSTRAYSUPPORT=={25504FB4-7BAB-4BC1-9C69-CF81890F0EF5}
11 GUID_TFCAT_PROP_AUDIODATA=={9B7BE3A9-E8AB-4D47-A8FE-254FA423436D}
12 GUID_TFCAT_PROP_INKDATA=={7C6A82AE-B0D7-4F14-A745-14F28B009D61}
13 GUID_TFCAT_PROPSTYLE_CUSTOM=={24AF3031-852D-40A2-BC09-8992898CE722}
GUID_TFCAT_PROP_AUDIODATA=={9B7BE3A9-E8AB-4D47-A8FE-254FA423436D}
14 GUID_TFCAT_PROPSTYLE_STATIC=={565FB8D8-6BD4-4CA1-B223-0F2CCB8F4F96}
15 GUID_TFCAT_PROPSTYLE_STATICCOMPACT=={85F9794B-4D19-40D8-8864-4E747371A66D}
16 GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER=={046B8C80-1647-40F7-9B21-B93B81AABC1B}
17 GUID_TFCAT_DISPLAYATTRIBUTEPROPERTY=={B95F181B-EA4C-4AF1-8056-7C321ABBB091}
整理的源码如下:
#include <iostream>
#include<string>
#include<msctf.h>
//要支持的种类
const GUID SupportCategories0[] =
{
GUID_TFCAT_CATEGORY_OF_TIP,
GUID_TFCAT_TIP_KEYBOARD,
GUID_TFCAT_TIP_SPEECH,
GUID_TFCAT_TIP_HANDWRITING,
GUID_TFCAT_TIPCAP_SECUREMODE,
GUID_TFCAT_TIPCAP_UIELEMENTENABLED,
GUID_TFCAT_TIPCAP_INPUTMODECOMPARTMENT,
GUID_TFCAT_TIPCAP_COMLESS,
GUID_TFCAT_TIPCAP_WOW16,
GUID_TFCAT_TIPCAP_IMMERSIVESUPPORT,
GUID_TFCAT_TIPCAP_SYSTRAYSUPPORT,
GUID_TFCAT_PROP_AUDIODATA,
GUID_TFCAT_PROP_INKDATA,
GUID_TFCAT_PROPSTYLE_CUSTOM,
GUID_TFCAT_PROPSTYLE_STATIC,
GUID_TFCAT_PROPSTYLE_STATICCOMPACT,
GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER,
GUID_TFCAT_DISPLAYATTRIBUTEPROPERTY
};
static BOOL CLSIDToStringA(REFGUID refGUID, char* pchA)
{
static const BYTE GuidMap[] = { 3, 2, 1, 0, '-', 5, 4, '-', 7, 6, '-',
8, 9, '-', 10, 11, 12, 13, 14, 15 };
static const char szDigits[] = "0123456789ABCDEF";
int i;
char* p = pchA;
const BYTE* pBytes = (const BYTE*)&refGUID;
*p++ = '{';
for (i = 0; i < sizeof(GuidMap); i++)
{
if (GuidMap[i] == '-')
*p++ = '-';
else
{
*p++ = szDigits[(pBytes[GuidMap[i]] & 0xF0) >> 4];
*p++ = szDigits[(pBytes[GuidMap[i]] & 0x0F)];
}
}
*p++ = '}';
*p = '\0';
return TRUE;
}
int main()
{
char c[100] = { 0 };
GUID guid;
guid = GUID_TFCAT_CATEGORY_OF_TIP;
CLSIDToStringA(guid, c);
std::cout << "1 GUID_TFCAT_CATEGORY_OF_TIP==" << c << "\n";
guid = GUID_TFCAT_TIP_KEYBOARD;
CLSIDToStringA(guid, c);
std::cout << "2 GUID_TFCAT_TIP_KEYBOARD==" << c << "\n";
guid = GUID_TFCAT_TIP_SPEECH;
CLSIDToStringA(guid, c);
std::cout << "3 GUID_TFCAT_TIP_SPEECH==" << c << "\n";
guid = GUID_TFCAT_TIP_HANDWRITING;
CLSIDToStringA(guid, c);
std::cout << "4 GUID_TFCAT_TIP_HANDWRITING==" << c << "\n";
guid = GUID_TFCAT_TIPCAP_SECUREMODE;
CLSIDToStringA(guid, c);
std::cout << "5 GUID_TFCAT_TIPCAP_SECUREMODE==" << c << "\n";
guid = GUID_TFCAT_TIPCAP_UIELEMENTENABLED;
CLSIDToStringA(guid, c);
std::cout << "6 GUID_TFCAT_TIPCAP_UIELEMENTENABLED==" << c << "\n";
guid = GUID_TFCAT_TIPCAP_INPUTMODECOMPARTMENT;
CLSIDToStringA(guid, c);
std::cout << "7 GUID_TFCAT_TIPCAP_INPUTMODECOMPARTMENT==" << c << "\n";
guid = GUID_TFCAT_TIPCAP_COMLESS;
CLSIDToStringA(guid, c);
std::cout << "7 GUID_TFCAT_TIPCAP_COMLESS==" << c << "\n";
guid = GUID_TFCAT_TIPCAP_WOW16;
CLSIDToStringA(guid, c);
std::cout << "8 GUID_TFCAT_TIPCAP_WOW16==" << c << "\n";
guid = GUID_TFCAT_TIPCAP_IMMERSIVESUPPORT;
CLSIDToStringA(guid, c);
std::cout << "9 GUID_TFCAT_TIPCAP_IMMERSIVESUPPORT==" << c << "\n";
guid = GUID_TFCAT_TIPCAP_SYSTRAYSUPPORT;
CLSIDToStringA(guid, c);
std::cout << "10 GUID_TFCAT_TIPCAP_SYSTRAYSUPPORT==" << c << "\n";
guid = GUID_TFCAT_PROP_AUDIODATA;
CLSIDToStringA(guid, c);
std::cout << "11 GUID_TFCAT_PROP_AUDIODATA==" << c << "\n";
guid = GUID_TFCAT_PROP_INKDATA;
CLSIDToStringA(guid, c);
std::cout << "12 GUID_TFCAT_PROP_INKDATA==" << c << "\n";
guid = GUID_TFCAT_PROPSTYLE_CUSTOM;
CLSIDToStringA(guid, c);
std::cout << "13 GUID_TFCAT_PROPSTYLE_CUSTOM==" << c << "\n";
guid = GUID_TFCAT_PROP_AUDIODATA;
CLSIDToStringA(guid, c);
std::cout << "GUID_TFCAT_PROP_AUDIODATA==" << c << "\n";
guid = GUID_TFCAT_PROPSTYLE_STATIC;
CLSIDToStringA(guid, c);
std::cout << "14 GUID_TFCAT_PROPSTYLE_STATIC==" << c << "\n";
guid = GUID_TFCAT_PROPSTYLE_STATICCOMPACT;
CLSIDToStringA(guid, c);
std::cout << "15 GUID_TFCAT_PROPSTYLE_STATICCOMPACT==" << c << "\n";
guid = GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER;
CLSIDToStringA(guid, c);
std::cout << "16 GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER==" << c << "\n";
guid = GUID_TFCAT_DISPLAYATTRIBUTEPROPERTY;
CLSIDToStringA(guid, c);
std::cout << "17 GUID_TFCAT_DISPLAYATTRIBUTEPROPERTY==" << c << "\n";
std::cin.get();
return 0;
}
得出最上面结果的代码如下:
#include <iostream>
#include<string>
#include<msctf.h>
//要支持的种类
const GUID SupportCategories0[] =
{
GUID_TFCAT_CATEGORY_OF_TIP,
GUID_TFCAT_TIP_KEYBOARD,
GUID_TFCAT_TIP_SPEECH,
GUID_TFCAT_TIP_HANDWRITING,
GUID_TFCAT_TIPCAP_SECUREMODE,
GUID_TFCAT_TIPCAP_UIELEMENTENABLED,
GUID_TFCAT_TIPCAP_INPUTMODECOMPARTMENT,
GUID_TFCAT_TIPCAP_COMLESS,
GUID_TFCAT_TIPCAP_WOW16,
GUID_TFCAT_TIPCAP_IMMERSIVESUPPORT,
GUID_TFCAT_TIPCAP_SYSTRAYSUPPORT,
GUID_TFCAT_PROP_AUDIODATA,
GUID_TFCAT_PROP_INKDATA,
GUID_TFCAT_PROPSTYLE_CUSTOM,
GUID_TFCAT_PROPSTYLE_STATIC,
GUID_TFCAT_PROPSTYLE_STATICCOMPACT,
GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER,
GUID_TFCAT_DISPLAYATTRIBUTEPROPERTY
};
static BOOL CLSIDToStringA(REFGUID refGUID, char* pchA)
{
static const BYTE GuidMap[] = { 3, 2, 1, 0, '-', 5, 4, '-', 7, 6, '-',
8, 9, '-', 10, 11, 12, 13, 14, 15 };
static const char szDigits[] = "0123456789ABCDEF";
int i;
char* p = pchA;
const BYTE* pBytes = (const BYTE*)&refGUID;
*p++ = '{';
for (i = 0; i < sizeof(GuidMap); i++)
{
if (GuidMap[i] == '-')
*p++ = '-';
else
{
*p++ = szDigits[(pBytes[GuidMap[i]] & 0xF0) >> 4];
*p++ = szDigits[(pBytes[GuidMap[i]] & 0x0F)];
}
}
*p++ = '}';
*p = '\0';
return TRUE;
}
int main()
{
char c[100] = { 0 };
for (GUID guid : SupportCategories0)
{
CLSIDToStringA(guid, c);
std::cout << c << "\n";
}
GUID guid;
guid=GUID_TFCAT_CATEGORY_OF_TIP;
CLSIDToStringA(guid, c);
std::cout <<"GUID_TFCAT_CATEGORY_OF_TIP======="<< c << "\n";
guid = GUID_TFCAT_DISPLAYATTRIBUTEPROPERTY;
CLSIDToStringA(guid, c);
std::cout << "GUID_TFCAT_DISPLAYATTRIBUTEPROPERTY=======" << c << "\n";
std::cin.get();
return 0;
}
tsf输入法注册种类在注册表产生注册项如下:
tsf输入法中注册种类和卸载种类的C++代码如下:
//要支持的种类
const GUID SupportCategories0[] =
{
//GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER,
//GUID_TFCAT_TIPCAP_IMMERSIVESUPPORT,
//GUID_TFCAT_TIPCAP_SYSTRAYSUPPORT,
//GUID_TFCAT_TIP_KEYBOARD,
//GUID_TFCAT_TIPCAP_COMLESS,
//GUID_TFCAT_TIPCAP_WOW16,
//GUID_TFCAT_TIPCAP_SECUREMODE,
//GUID_TFCAT_TIPCAP_UIELEMENTENABLED,
//GUID_TFCAT_TIPCAP_INPUTMODECOMPARTMENT
//GUID_TFCAT_TIP_SPEECH,
//GUID_TFCAT_TIP_HANDWRITING,
GUID_TFCAT_CATEGORY_OF_TIP,
GUID_TFCAT_TIP_KEYBOARD,
GUID_TFCAT_TIPCAP_SECUREMODE,
GUID_TFCAT_TIPCAP_UIELEMENTENABLED,
GUID_TFCAT_TIPCAP_INPUTMODECOMPARTMENT,
GUID_TFCAT_TIPCAP_COMLESS,
GUID_TFCAT_TIPCAP_WOW16,
GUID_TFCAT_TIPCAP_IMMERSIVESUPPORT,
GUID_TFCAT_TIPCAP_SYSTRAYSUPPORT,
GUID_TFCAT_PROP_AUDIODATA,
GUID_TFCAT_PROP_INKDATA,
GUID_TFCAT_PROPSTYLE_CUSTOM,
GUID_TFCAT_PROPSTYLE_STATIC,
GUID_TFCAT_PROPSTYLE_STATICCOMPACT,
GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER,
GUID_TFCAT_DISPLAYATTRIBUTEPROPERTY
};
BOOL RegisterCategories()
{
CComPtr<ITfCategoryMgr>pCategoryMgr;
HRESULT hr;
hr = pCategoryMgr.CoCreateInstance(CLSID_TF_CategoryMgr, NULL, CLSCTX_INPROC_SERVER);
if (hr != S_OK)
return FALSE;
BOOL flag = TRUE;
for(GUID guid : SupportCategories0)
{
hr = pCategoryMgr->RegisterCategory(c_clsidTextService, guid, c_clsidTextService);
if (hr != S_OK)
flag = FALSE;
}
return flag;
}
void UnregisterCategories()
{
CComPtr<ITfCategoryMgr>pCategoryMgr;
HRESULT hr;
hr = pCategoryMgr.CoCreateInstance(CLSID_TF_CategoryMgr, NULL, CLSCTX_INPROC_SERVER);
if (hr != S_OK)
return;
for (GUID guid : SupportCategories0)
pCategoryMgr->UnregisterCategory(c_clsidTextService, guid, c_clsidTextService);
}