seeyou_shj 发表于 2020-10-29 10:09

c++编写ime输入法,遇到问题

研究输入法编程,很长时间了,一直没入门。网上搜到了很多资料,也尝试自己写了一点代码,可是编译成dll文件,后缀修改为ime,在注册表注册该输入法之后,只能获取到dllmain函数返回,其他的imeinquire等函数都没有返回值。不知道是什么原因?

附上dll函数的内容,请高手指点一下,多谢!

#include <Dimm.h>
#include <Windows.h>
#pragma "imm32.lib"
HINSTANCEhInst;
BOOL WINAPI ImeInquire(IMEINFO *lpImeInfo, LPTSTR lpszWndCls, DWORD dwSystemInfoFlags)
{
        MessageBox(NULL, LPCSTR("ImeInquire"), LPCSTR("world"), NULL);
        if (!lpImeInfo) { //简单出错处理
                return FALSE;
        }

        lpImeInfo->dwPrivateDataSize = 0;
        lpImeInfo->fdwProperty =IME_PROP_UNICODE |IME_PROP_SPECIAL_UI;
        lpImeInfo->fdwConversionCaps =        IME_CMODE_NATIVE | IME_CMODE_NOCONVERSION;
        lpImeInfo->fdwSentenceCaps = 0;
        lpImeInfo->fdwUICaps = UI_CAP_ROT90;
        lpImeInfo->fdwSCSCaps = SCS_CAP_COMPSTR | SCS_CAP_MAKEREAD;
        lpImeInfo->fdwSelectCaps = (DWORD)0;

        return (TRUE);
}

BOOL WINAPI ImeConfigure(HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
{
        MessageBox(NULL, LPCSTR("ImeConfigure"), LPCSTR("world"), NULL);
        return true;
}

BOOL WINAPI ImeSelect(HIMC hIMC, BOOL fSelect)
{
        MessageBox(NULL, LPCSTR("ImeSelect"), LPCSTR("world"), NULL);
        return true;
}

BOOL WINAPI ImeProcessKey(HIMC hIMC, UINT uKey, LPARAM lKeyData, CONST LPBYTE lpbKeyState)
{
        MessageBox(NULL, LPCSTR("ImeProcessKey"), LPCSTR("world"), NULL);
        return true;
}
UINT WINAPI ImeToAsciiEx(UINT uVKey, UINT uScanCode, CONST LPBYTE lpbKeyState, LPDWORD lpdwTransKey, UINT fuState, HIMC hIMC)
{
        MessageBox(NULL, LPCSTR("ImeToAsciiEx"), LPCSTR("world"), NULL);
        return true;
}

BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD dwFunction, LPVOID lpNot)
{
        MessageBox(NULL, LPCSTR("DllMain"), LPCSTR("world"), NULL);
        switch (dwFunction)
        {
        case DLL_PROCESS_ATTACH:
                MessageBox(NULL, LPCSTR("DllMain==>DLL_PROCESS_ATTACH"), LPCSTR("world"), NULL);
#ifdef _MY_DEBUG
                if (nDebugLevel) {
                        if ((DebugLogFile = _tfopen(DEBUGLOGFILE, "w")) == NULL)
                                MessageBox(NULL, "can not open Debuglogfile", "debug", MB_OK);
                        DebugLog(1, (DebugLogFile, "Entry in\n"));
                }
#endif
                break;

        case DLL_PROCESS_DETACH:
                MessageBox(NULL, LPCSTR("DllMain==>DLL_PROCESS_DETACH"), LPCSTR("world"), NULL);
                /*UnregisterClass(UICLASSNAME, hInst);
                UnregisterClass(COMPCLASSNAME, hInst);
                UnregisterClass(CANDCLASSNAME, hInst);
                UnregisterClass(STATUSCLASSNAME, hInst);

                DestroyDictionary();*/

#ifdef _MY_DEBUG
                if (nDebugLevel) {
                        DebugLog(1, (DebugLogFile, "Entry out\n"));
                        if (DebugLogFile != NULL)
                                fclose(DebugLogFile);
                }
#endif
                break;

        case DLL_THREAD_ATTACH:
                MessageBox(NULL, LPCSTR("DllMain==>DLL_THREAD_ATTACH"), LPCSTR("world"), NULL);
                break;

        case DLL_THREAD_DETACH:
                MessageBox(NULL, LPCSTR("DllMain==>DLL_THREAD_DETACH"), LPCSTR("world"), NULL);
                break;
        }
        return TRUE;
}

以上代码编译dll,后缀修改为ime,拷贝到system32目录,修改注册表后,加载的时候能弹出“DllMain==>DLL_PROCESS_ATTACH”等几个dllmain函数的对话框,说明dll成功加载了。可是无论是按键还是退出,都没有“ImeProcessKey”“ImeInquire”等弹出框。在网上找了很久了,一直不知道怎么解决,请高手指点!

JuncoJet 发表于 2020-10-29 10:27

你可以找个小输入法逆向一下,比如智能ABC、超强二笔

seeyou_shj 发表于 2020-10-29 10:53

JuncoJet 发表于 2020-10-29 10:27
你可以找个小输入法逆向一下,比如智能ABC、超强二笔

找过了,源码文件太多了,都不知道怎么看。逆向的话,目前水平还差点。能看懂一点,通过dll分析能看到那些输入法也是用的这些函数,比如imeinquire之类的。但是我的就是不行,他们的ime文件包含一些其他的东西,看不懂。

5omggx 发表于 2020-10-29 11:04

最近流出的xp源码里面有智能abc输入法源码,楼主有兴趣的话不妨参考下

seeyou_shj 发表于 2020-10-29 11:08

本帖最后由 seeyou_shj 于 2020-10-29 13:08 编辑

5omggx 发表于 2020-10-29 11:04
最近流出的xp源码里面有智能abc输入法源码,楼主有兴趣的话不妨参考下
多谢楼主,我去搜一下看看。

水平不够,看不懂。。。
页: [1]
查看完整版本: c++编写ime输入法,遇到问题