ToUnicode函数和重音的问题

Problems with ToUnicode function and accents

本文关键字:问题 函数 ToUnicode      更新时间:2023-10-16

搜索这个网站,我看到其他人使用ToUnicode函数有同样的问题,导致双重口音。我的代码示例删除不重要的部分:

在我的cpp文件(窗口已与创建函数CreateWindowsEx):

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE:{
        //keyboard
        rid[0].dwFlags = RIDEV_NOLEGACY |RIDEV_INPUTSINK;
        rid[0].usUsagePage = 1;                         
        rid[0].usUsage = 6;
        rid[0].hwndTarget = hWnd;
        //mouse
        rid[1].dwFlags = RIDEV_NOLEGACY |RIDEV_INPUTSINK;
        rid[1].usUsagePage = 1;
        rid[1].usUsage = 2;
        rid[1].hwndTarget = hWnd;
        RegisterRawInputDevices(rid,2,sizeof(rid[0]));
                   }
    case WM_INPUT:
        KeyProcess(message,lParam); 
        break;  

在我的dll文件中:

LRESULT CALLBACK KeyProcess(UINT msg, LPARAM lParam)
{
    LPBYTE lpb = nullptr;
    switch (msg)
    {
    case WM_INPUT:
        if(GetRawInputData((HRAWINPUT)lParam,RID_INPUT,NULL,&dwSize,sizeof(RAWINPUTHEADER))==-1){
            break;
        }
        lpb = (LPBYTE)GlobalAlloc(GMEM_FIXED, dwSize);
        if(lpb==NULL){
            break;
        } 
        if(GetRawInputData((HRAWINPUT)lParam,RID_INPUT,lpb,&dwSize,sizeof(RAWINPUTHEADER))!=dwSize){
            GlobalFree(lpb);  
            break;
        }
        PRAWINPUT raw=(PRAWINPUT)lpb;
        if(raw->header.dwType == RIM_TYPEKEYBOARD)
        {
            UINT Event;
            raw->data.keyboard.MakeCode; 
            raw->data.keyboard.Flags;
            raw->data.keyboard.Reserved;
            raw->data.keyboard.ExtraInformation; 
            raw->data.keyboard.Message;
            raw->data.keyboard.VKey;
            Event = raw->data.keyboard.Message;     
            if(Event == WM_KEYDOWN)
            {                   
                int ta = ToUnicode(raw->data.keyboard.VKey,raw->data.keyboard.MakeCode,
                    bChar,&wChar,1,0);
                ta = ToUnicode(raw->data.keyboard.VKey,raw->data.keyboard.MakeCode,
                    bChar,&wChar,1,0);

其中bChar为BYTE bChar[256], wChar为wChar;

根据我所读到的表明,解决方案是调用两次ToUnicode函数,以便在键入时,例如移动字符"6"(其中口音"¨"德国变音符),然后字符"e",我将结果字符"ë"。如果我只调用函数一次,生成的是双德语变音符重音,但调用函数两次,重音放在字符串上,但不出现在记事本中,好像键有缺陷。当被执行的程序停止时,键的行为恢复正常。我做错了什么?我测试过:

if (ta == -1) break;

带或不带test总是相同的错误。使用鼠标一切正常,但键盘却是什么都不工作。

不要乱用WM_INPUT作为文本,它太低级了。