在中文2000 Professional下,用API hook了TextOutA、TextOutW、ExtTextOutA、ExtTextOutW等函数后,发现一个很奇怪的问题。比如,我自己编写的函数是
  HookExtTextOutW(HDC hdc,
                  int X,
                  int Y,
                  UINT fuOptions,
                  CONST RECT *lprc,
                  LPCWSTR lpString,
                  INT cbCount,
                  CONST INT *lpDx)该函数用来取代GDI32中的ExtTextOutW,当为桌面设置Terminal或者System字体时,lpString中存放的是实际桌面上的字符串,可是当把桌面字体设置为Tahoma或者宋体时,lpString中得到的却是乱码,请问lpString和字体是什么关系?谢谢!

解决方案 »

  1.   

    HookExtTextOutW 
    W 带表宽字符
    lpString 返回的是 unicode 字符即宽字符!
    如果这个字串中有英文你调试时看到的就是乱码!
      

  2.   

    我觉得不是Unicode的问题,Unicode我已经处理过了,代码如下: int cbLen;
    char szBuff[MAX_TEXTBUFFER_LEN*2];
    int nIndex;
    int nOldLen, nNewLen, nNewChars;
    DWORD dwRet;
            cbLen = WideCharToMultiByte(GetACP(), 0, 
    lpString , cbCount, 
    szBuff, MAX_TEXTBUFFER_LEN*2, NULL, NULL);
    szBuff[cbLen] = 0x00;打印szBuff里的内容,得到的是乱码,但是乱码只出现在资源管理器的右侧窗口中,而且只有在选择“图标”或者“缩略图”查看方式时才有乱码,设置“列表”和“详细资料”查看方式时也是好的。而且还有一个特征,当为桌面设置Terminal或者System字体时,szBuff中无乱码,打印出的内容是正常的,可是当把桌面字体设置为Tahoma或者宋体时,szBuff中得到的却是乱码
      

  3.   

    char szBuff[MAX_TEXTBUFFER_LEN*2];
    支持宽字符么