【发布时间】:2018-10-11 06:15:20
【问题描述】:
我尝试了一些代码来获取韩国操作系统 win7 和 win10 中 ImmGetCandidateList() 的“汉字列表”。
我正在制作游戏。我在游戏中需要一个汉字列表。 当我在 Windows7 中运行时,我可以使用 ImmGetCandidateList() 获取汉字列表。 但是,在Windows10中运行时,无法获取HanjaList。
我不知道为什么会这样。
代码
DWORD dwBufLen = 0;
LPCANDIDATELIST pCandiList = (LPCANDIDATELIST)new CHAR[1024];
HHOOK gHook;
LRESULT CALLBACK WinHookCallBack(INT nCode, WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT* lpWp = (CWPSTRUCT*)lParam;
switch (lpWp->message)
{
case WM_IME_NOTIFY:
{
if (lpWp->wParam == IMN_OPENCANDIDATE)
{
return 0;
}
HIMC hImc = ImmGetContext(hWnd);
memset(pCandiList, 0, sizeof(CHAR) * 1024);
dwBufLen = ImmGetCandidateList(hImc, 0, pCandiList, 0);
ImmReleaseContext(hWnd, hImc);
}break;
default:
break;
}
return CallNextHookEx(gHook, nCode, lpWp->wParam, lpWp->lParam);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
HWND hWndEdit = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("edit"), TEXT("test"), WS_CHILD | WS_VISIBLE, 100, 20, 140, 20, hWnd, NULL, NULL, NULL);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
gHook = SetWindowsHookEx(WH_CALLWNDPROC, WinHookCallBack, GetModuleHandle(NULL), GetWindowThreadProcessId(hWnd, NULL));
HWND hWndIME = ImmGetDefaultIMEWnd(hWnd);
ShowOwnedPopups(hWndIME, false);
return TRUE;
}
我为 IME 测试做了一个简单的 win32 项目。 我尝试了两种方法。
当我专注于 Textfield 之外时。 dwBufLen 大于零。 但是,当我关注 Textfield 时。 dwBufLen 为零。我可以看到默认的候选窗口。
我认为当默认候选窗口禁用时,我可以获得汉字列表。
当我关注文本字段时如何获得汉字列表。
我需要一个在 MyProject 中使用的汉字候选列表。
感谢您阅读我的帖子。 :)
【问题讨论】:
标签: ime