#include <easyx\graphics.h>
#include <conio.h>
#include <windows.h>
#include <string>
using namespace std;
void GetIMEString(HWND hWnd,string& str)
{
HIMC hIMC=ImmGetContext(hWnd);//获取HIMC
if (hIMC)
{
//这里先说明一下,以输入“中国”为例
//切换到中文输入法后,输入“zhongguo”,这个字符串称作IME组成字符串
//而在输入法列表中选择的字符串“中国”则称作IME结果字符串
static bool flag=false;//输入完成标记:在输入中时,IME组成字符串不为空,置true;输入完成后,IME组成字符串为空,置false
DWORD dwSize=ImmGetCompositionStringW(hIMC,GCS_COMPSTR,NULL,0); //获取IME组成输入的字符串的长度
if (dwSize>0)//如果IME组成字符串不为空,且没有错误(此时dwSize为负值),则置输入完成标记为true
{
if (flag==false)
{
flag=true;
}
}
else if (dwSize==0&&flag) //如果IME组成字符串为空,并且标记为true,则获取IME结果字符串
{
int iSize; //IME结果字符串的大小
LPSTR pszMultiByte=NULL;//IME结果字符串指针
int ChineseSimpleAcp=936;//宽字节转换时中文的编码
WCHAR *lpWideStr=NULL;//宽字节字符数组
dwSize=ImmGetCompositionStringW(hIMC,GCS_RESULTSTR,NULL,0);//获取IME结果字符串的大小
if (dwSize>0) //如果IME结果字符串不为空,且没有错误
{
dwSize+=sizeof(WCHAR);//大小要加上NULL结束符
//为获取IME结果字符串分配空间
if (lpWideStr)
{
delete []lpWideStr;
lpWideStr=NULL;
}
lpWideStr=new WCHAR[dwSize];
memset(lpWideStr,0,dwSize); //清空结果空间
ImmGetCompositionStringW(hIMC,GCS_RESULTSTR,lpWideStr,dwSize);//获取IME结果字符串,这里获取的是宽字节
iSize=WideCharToMultiByte(ChineseSimpleAcp,0,lpWideStr,-1,NULL,0,NULL,NULL);//计算将IME结果字符串转换为ASCII标准字节后的大小
//为转换分配空间
if (pszMultiByte)
{
delete [] pszMultiByte;
pszMultiByte=NULL;
}
pszMultiByte=new char[iSize+1];
WideCharToMultiByte(ChineseSimpleAcp,0,lpWideStr,-1,pszMultiByte,iSize,NULL,NULL);//宽字节转换
pszMultiByte[iSize]='\0';
str+=pszMultiByte;//添加到string中
//释放空间
if (lpWideStr)
{
delete []lpWideStr;
lpWideStr=NULL;
}
if (pszMultiByte)
{
delete [] pszMultiByte;
pszMultiByte=NULL;
}
}
flag=false;
}
ImmReleaseContext(hWnd,hIMC);//释放HIMC
}
}
void main()
{
initgraph(640, 480); // 创建绘图窗口 HWND hWnd=GetHWnd();
BeginBatchDraw(); // 设置批绘图模式
string str;
while(true)
{
if (kbhit()) //如果是ASCII输入
{
char c=getch();
if (c=='\b')
{
if (str.length()>0)
{
if (str.at(str.length()-1)&0x8000)
str.erase(str.end()-1);
str.erase(str.end()-1);
}
}
else if (c==27) { }
else {
str+=c;
}
}
else //除此之外,检测是否有IME输入,如果有,则将输入结果添加到string中
{
GetIMEString(hWnd,str);
}
if (str.length()>100)
str="";
outtextxy(0,0,str.c_str());
FlushBatchDraw();
// 延时
Sleep(15);
cleardevice();
}
closegraph();
}
#include <conio.h>
#include <windows.h>
#include <string>
using namespace std;
void GetIMEString(HWND hWnd,string& str)
{
HIMC hIMC=ImmGetContext(hWnd);//获取HIMC
if (hIMC)
{
//这里先说明一下,以输入“中国”为例
//切换到中文输入法后,输入“zhongguo”,这个字符串称作IME组成字符串
//而在输入法列表中选择的字符串“中国”则称作IME结果字符串
static bool flag=false;//输入完成标记:在输入中时,IME组成字符串不为空,置true;输入完成后,IME组成字符串为空,置false
DWORD dwSize=ImmGetCompositionStringW(hIMC,GCS_COMPSTR,NULL,0); //获取IME组成输入的字符串的长度
if (dwSize>0)//如果IME组成字符串不为空,且没有错误(此时dwSize为负值),则置输入完成标记为true
{
if (flag==false)
{
flag=true;
}
}
else if (dwSize==0&&flag) //如果IME组成字符串为空,并且标记为true,则获取IME结果字符串
{
int iSize; //IME结果字符串的大小
LPSTR pszMultiByte=NULL;//IME结果字符串指针
int ChineseSimpleAcp=936;//宽字节转换时中文的编码
WCHAR *lpWideStr=NULL;//宽字节字符数组
dwSize=ImmGetCompositionStringW(hIMC,GCS_RESULTSTR,NULL,0);//获取IME结果字符串的大小
if (dwSize>0) //如果IME结果字符串不为空,且没有错误
{
dwSize+=sizeof(WCHAR);//大小要加上NULL结束符
//为获取IME结果字符串分配空间
if (lpWideStr)
{
delete []lpWideStr;
lpWideStr=NULL;
}
lpWideStr=new WCHAR[dwSize];
memset(lpWideStr,0,dwSize); //清空结果空间
ImmGetCompositionStringW(hIMC,GCS_RESULTSTR,lpWideStr,dwSize);//获取IME结果字符串,这里获取的是宽字节
iSize=WideCharToMultiByte(ChineseSimpleAcp,0,lpWideStr,-1,NULL,0,NULL,NULL);//计算将IME结果字符串转换为ASCII标准字节后的大小
//为转换分配空间
if (pszMultiByte)
{
delete [] pszMultiByte;
pszMultiByte=NULL;
}
pszMultiByte=new char[iSize+1];
WideCharToMultiByte(ChineseSimpleAcp,0,lpWideStr,-1,pszMultiByte,iSize,NULL,NULL);//宽字节转换
pszMultiByte[iSize]='\0';
str+=pszMultiByte;//添加到string中
//释放空间
if (lpWideStr)
{
delete []lpWideStr;
lpWideStr=NULL;
}
if (pszMultiByte)
{
delete [] pszMultiByte;
pszMultiByte=NULL;
}
}
flag=false;
}
ImmReleaseContext(hWnd,hIMC);//释放HIMC
}
}
void main()
{
initgraph(640, 480); // 创建绘图窗口 HWND hWnd=GetHWnd();
BeginBatchDraw(); // 设置批绘图模式
string str;
while(true)
{
if (kbhit()) //如果是ASCII输入
{
char c=getch();
if (c=='\b')
{
if (str.length()>0)
{
if (str.at(str.length()-1)&0x8000)
str.erase(str.end()-1);
str.erase(str.end()-1);
}
}
else if (c==27) { }
else {
str+=c;
}
}
else //除此之外,检测是否有IME输入,如果有,则将输入结果添加到string中
{
GetIMEString(hWnd,str);
}
if (str.length()>100)
str="";
outtextxy(0,0,str.c_str());
FlushBatchDraw();
// 延时
Sleep(15);
cleardevice();
}
closegraph();
}