[英]ImmGetContext returns zero always
我想制作韓語鍵盤記錄器。
為此,我需要檢查當前(前景)window 的 IME 模式。
我嘗試使用ImmGetContext
function 來實現這一點,但ImmGetContext(GetForegroundWindow())
始終返回零。
我該如何解決這個問題?
#include <iostream>
#include <stdio.h>
#include <Windows.h>
#include <immdev.h>
#include <imm.h>
#include <TlHelp32.h>
#pragma comment(lib, "imm32")
using namespace std;
void WINAPI GetProcessNameByProcessID(DWORD dwProcessID, LPWSTR lpszProcessName, size_t nMaxCount) {
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (hSnapshot != INVALID_HANDLE_VALUE) {
PROCESSENTRY32 processEntry;
processEntry.dwSize = sizeof(processEntry);
Process32First(hSnapshot, &processEntry);
do {
if (processEntry.th32ProcessID == dwProcessID) {
wcscpy_s(lpszProcessName, nMaxCount, processEntry.szExeFile);
break;
}
} while (Process32Next(hSnapshot, &processEntry));
CloseHandle(hSnapshot);
}
}
int main() {
//LoadLibrary(L"imm32.dll");
while (true) {
WCHAR szName[100];
DWORD foregroundProcess;
HWND foregroundWindow = GetForegroundWindow();
GetWindowThreadProcessId(foregroundWindow, &foregroundProcess);
GetProcessNameByProcessID(foregroundProcess, szName, 100);
HIMC hIMC;
DWORD dwConv, dwSent;
if (!(hIMC = ImmGetContext(foregroundWindow))) return 1; //Error
ImmSetOpenStatus(hIMC, true);
ImmGetConversionStatus(hIMC, &dwConv, &dwSent);
wcout << szName << L"(" << foregroundProcess << L") : "
<< (dwConv & IME_CMODE_HANGEUL ? L"KOREAN" : L"ENGLISH") << endl;
ImmReleaseContext(foregroundWindow, hIMC);
Sleep(1000);
}
return 0;
}
#include <iostream>
#include <Windows.h>
#pragma comment (lib, "imm32.lib")
#define IMC_GETOPENSTATUS 0x0005
using namespace std;
int main() {
while (true) {
HWND hIME = ImmGetDefaultIMEWnd(GetForegroundWindow());
LRESULT status = SendMessage(hIME, WM_IME_CONTROL, IMC_GETOPENSTATUS, 0);
cout << (status ? "Korean" : "English") << endl;
Sleep(100);
}
return 0;
}
< 參考資料 >
ImmGetDefaultIMEWnd Function
https://learn.microsoft.com/ko-kr/windows/win32/api/imm/nf-imm-immgetdefaultimewnd
WM_IME_CONTROL 消息
https://learn.microsoft.com/en-us/windows/win32/intl/wm-ime-control
IMC_GETOPENSTATUS(0x5) & IMC_GETCONVERSIONMODE(0x1)
https://learn.microsoft.com/en-us/previous-versions/windows/embedded/ms920838(v=msdn.10) https://learn.microsoft.com/en-us/previous-versions/windows/嵌入式/ms920931(v=msdn.10)
IMC_GETOPENSTATUS 和 IMC_GETCONVERSIONMODE 在 Windows 10 中沒有得到官方支持。但是,它似乎幾乎是實現我想要的東西的唯一方法,而且效果很好。 希望本文對您有所幫助。 (谷歌翻譯)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.