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”等弹出框。在网上找了很久了,一直不知道怎么解决,请高手指点! 你可以找个小输入法逆向一下,比如智能ABC、超强二笔 JuncoJet 发表于 2020-10-29 10:27
你可以找个小输入法逆向一下,比如智能ABC、超强二笔
找过了,源码文件太多了,都不知道怎么看。逆向的话,目前水平还差点。能看懂一点,通过dll分析能看到那些输入法也是用的这些函数,比如imeinquire之类的。但是我的就是不行,他们的ime文件包含一些其他的东西,看不懂。 最近流出的xp源码里面有智能abc输入法源码,楼主有兴趣的话不妨参考下 本帖最后由 seeyou_shj 于 2020-10-29 13:08 编辑
5omggx 发表于 2020-10-29 11:04
最近流出的xp源码里面有智能abc输入法源码,楼主有兴趣的话不妨参考下
多谢楼主,我去搜一下看看。
水平不够,看不懂。。。
页:
[1]