山东大学软件工程应用于实践——WeaselTSF(三)

2021SC@SDUSC

文章目录


本篇首先分析下WeaselTSF包里Register.h以及Register.cpp这两个文件。

Register.h

#pragma once

#include "Globals.h"

BOOL RegisterProfiles();
void UnregisterProfiles();
BOOL RegisterCategories();
void UnregisterCategories();
BOOL RegisterServer();
void UnregisterServer();

Register.cpp

#include "stdafx.h"
#include "Register.h"
#include <strsafe.h>
#include <VersionHelpers.hpp>

#define CLSID_STRLEN 38  // strlen("{xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx}")

static const char c_szInfoKeyPrefix[] = "CLSID\\";
static const char c_szTipKeyPrefix[] = "Software\\Microsft\\CTF\\TIP\\";
static const char c_szInProcSvr32[] = "InprocServer32";
static const char c_szModelName[] = "ThreadingModel";

HKL FindIME()
{
   
	HKL hKL = NULL;
	WCHAR key[9];
	HKEY hKey;
	LSTATUS ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts", 0, KEY_READ, &hKey);
	if (ret == ERROR_SUCCESS)
	{
   
		for (DWORD id = (0xE0200000 | TEXTSERVICE_LANGID); hKL == NULL && id <= (0xE0FF0000 | TEXTSERVICE_LANGID); id += 0x10000)
		{
   
			StringCchPrintfW(key, _countof(key), L"%08X", id);
			HKEY hSubKey;
			ret = RegOpenKeyExW(hKey, key, 0, KEY_READ, &hSubKey);
			if (ret == ERROR_SUCCESS)
			{
   
				WCHAR data[32];
				DWORD type;
				DWORD size = sizeof data;
				ret = RegQueryValueExW(hSubKey, L"Ime File", NULL, &type, (LPBYTE)data, &size);
				if (ret == ERROR_SUCCESS && type == REG_SZ && _wcsicmp(data, L"weasel.ime") == 0)
					hKL = (HKL)id;
			}
			RegCloseKey(hSubKey);
		}
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值