簡體   English   中英

ImmGetContext 總是返回零

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM