[英]ImmGetContext returns zero always
I want to make Korean key logger.我想制作韩语键盘记录器。
To do that, I need to check IME mode of the current(foreground) window.为此,我需要检查当前(前景)window 的 IME 模式。
I tried to implement this using the ImmGetContext
function, but ImmGetContext(GetForegroundWindow())
returns zero always.我尝试使用ImmGetContext
function 来实现这一点,但ImmGetContext(GetForegroundWindow())
始终返回零。
How can I fix this problem?我该如何解决这个问题?
#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;
}
< References > < 参考资料 >
ImmGetDefaultIMEWnd Function ImmGetDefaultIMEWnd Function
https://learn.microsoft.com/ko-kr/windows/win32/api/imm/nf-imm-immgetdefaultimewnd https://learn.microsoft.com/ko-kr/windows/win32/api/imm/nf-imm-immgetdefaultimewnd
WM_IME_CONTROL Message WM_IME_CONTROL 消息
https://learn.microsoft.com/en-us/windows/win32/intl/wm-ime-control https://learn.microsoft.com/en-us/windows/win32/intl/wm-ime-control
IMC_GETOPENSTATUS(0x5) & IMC_GETCONVERSIONMODE(0x1) 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/embedded/ms920931(v=msdn.10) 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 and IMC_GETCONVERSIONMODE are not officially supported in Windows 10. However, it seems to be almost the only way to implement what I want, and it works fine. IMC_GETOPENSTATUS 和 IMC_GETCONVERSIONMODE 在 Windows 10 中没有得到官方支持。但是,它似乎几乎是实现我想要的东西的唯一方法,而且效果很好。 I hope this article is helpful.希望本文对您有所帮助。 (Google Translate) (谷歌翻译)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.