libsdl中文输入法候选列表不显示解决方案

libsdl输入中文时输入法不显示,将WM_IME_SETCONTEXT事件处理给注释即可。

WM_IME_SETCONTEXT

If the application draws the composition window, the default IME window does not have to show its composition window. In this case, the application must clear the ISC_SHOWUICOMPOSITIONWINDOW value from the lParam parameter before passing the message to DefWindowProc or ImmIsUIMessage. To display a certain user interface window, an application should remove the corresponding value so that the IME will not display it.

修改SDL_windowskeyboard.c找到IME_HandleMessage函数改为以下代码即可。

SDL_bool
IME_HandleMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM *lParam, SDL_VideoData *videodata)
{
    SDL_bool trap = SDL_FALSE;
    HIMC himc = 0;
    if (!videodata->ime_initialized || !videodata->ime_available || !videodata->ime_enabled)
        return SDL_FALSE;

    switch (msg) {
    case WM_INPUTLANGCHANGE:
        IME_InputLangChanged(videodata);
        break;
    //输入法候选框不显示
    //case WM_IME_SETCONTEXT:
    //    *lParam = 0;
    //    break;
    case WM_IME_STARTCOMPOSITION:
        trap = SDL_TRUE;
        break;
    case WM_IME_COMPOSITION:
        trap = SDL_TRUE;
        himc = ImmGetContext(hwnd);
        if (*lParam & GCS_RESULTSTR) {
            IME_GetCompositionString(videodata, himc, GCS_RESULTSTR);
            IME_SendInputEvent(videodata);
        }
        if (*lParam & GCS_COMPSTR) {
            if (!videodata->ime_uiless)
                videodata->ime_readingstring[0] = 0;

            IME_GetCompositionString(videodata, himc, GCS_COMPSTR);
            IME_SendEditingEvent(videodata);
        }
        ImmReleaseContext(hwnd, himc);
        break;
    case WM_IME_ENDCOMPOSITION:
        videodata->ime_composition[0] = 0;
        videodata->ime_readingstring[0] = 0;
        videodata->ime_cursor = 0;
        SDL_SendEditingText("", 0, 0);
        break;
    case WM_IME_NOTIFY:
        switch (wParam) {
        case IMN_SETCONVERSIONMODE:
        case IMN_SETOPENSTATUS:
            IME_UpdateInputLocale(videodata);
            break;
        case IMN_OPENCANDIDATE:
        case IMN_CHANGECANDIDATE:
            if (videodata->ime_uiless)
                break;

            trap = SDL_TRUE;
            IME_ShowCandidateList(videodata);
            himc = ImmGetContext(hwnd);
            if (!himc)
                break;

            IME_GetCandidateList(himc, videodata);
            ImmReleaseContext(hwnd, himc);
            break;
        case IMN_CLOSECANDIDATE:
            trap = SDL_TRUE;
            IME_HideCandidateList(videodata);
            break;
        case IMN_PRIVATE:
            {
                DWORD dwId = IME_GetId(videodata, 0);
                IME_GetReadingString(videodata, hwnd);
                switch (dwId)
                {
                case IMEID_CHT_VER42:
                case IMEID_CHT_VER43:
                case IMEID_CHT_VER44:
                case IMEID_CHS_VER41:
                case IMEID_CHS_VER42:
                    if (*lParam == 1 || *lParam == 2)
                        trap = SDL_TRUE;

                    break;
                case IMEID_CHT_VER50:
                case IMEID_CHT_VER51:
                case IMEID_CHT_VER52:
                case IMEID_CHT_VER60:
                case IMEID_CHS_VER53:
                    if (*lParam == 16
                        || *lParam == 17
                        || *lParam == 26
                        || *lParam == 27
                        || *lParam == 28)
                        trap = SDL_TRUE;
                    break;
                }
            }
            break;
        default:
            trap = SDL_TRUE;
            break;
        }
        break;
    }
    return trap;
}

  

时间: 2024-12-07 06:58:00

libsdl中文输入法候选列表不显示解决方案的相关文章

中文输入法在vs2010中失效解决方案

这样你就可以用切换输入法的方式,输入中文咯. 后来用了2次发现还是有问题,后来我就直接把输入法的切换改成ctrl+1,后来使用就一直没有问题.总之,解决方案视具体情况解决.中文输入法在vs2010中失效解决方案

rime输入法候选字横排显示

#weasel.custom.yaml customization: distribution_code_name: Weasel distribution_version: 0.9.30 generator: "Weasel::UIStyleSettings" modified_time: "Tue Mar 03 04:59:00 2015" rime_version: 1.1.2 patch: "style/color_scheme": do

WPF与中文输入法兼容性问题的解决方案

问题 我在使用WPF进行编程的时候,发现的一个最大问题就是WPF与中文输入法的兼容性问题. 出现的问题大概分为两种: 程序崩溃: 无法切换输入法. 在笔者的环境中并未遇到过崩溃的情况,只是后一种情况.但我想这两种情况的原因应该一样. 具体的表现为:在WPF中的Textbox控件中输入汉字的时候,我们需要先切换输入法.切换之后状态栏显示切换成功,而开始键入拼音的时候却发现直接将拼音输入了Textbox框中,情形好似并未切换成功. 而且更为棘手的是,这种情况并不是绝对的,重启程序和多次切换输入法都可

Mac 中文输入法失效(不显示选词框)解决办法

问题描述: 1.可以正常切换中英文输入法: 2.切换到中文输入法(搜狗或则简体拼音),只显示拼音且带下划线,但是不显示选词狂: 解决办法: 方法1: 重启Mac,有时候重启后可以解决问题,有时候解决不了问题! 方法2: 点击Launchpad -> 活动监视器 (相当于windows的进程管理器), 右上角搜索框中,搜索 "中文输入法"  -> 双击对应的输入法,会有个弹窗弹出 -> 点击"退出" -> "确定"!

Ubuntu中sublime和Foxit Reader不能使用中文输入法解决方案

虽然Ubuntu下面很多软件同windows下一样,但是经常会出现各种各样的小问题,其中最让人头疼的是软件中的输入法问题. sublime作为一个跨平台的编辑软件,可以支持win,linux和mac系统,非常好用,但是在安装sougou输入法之后,使用sublime打开文件后并不能输入中文. sublime使用以下方法进行修复中文输入法问题: 原帖见: 解决Ubuntu下Sublime Text 3无法输入中文 其中作者推荐的第一种方法就可以完美解决我的问题,也推荐大家先尝试第一种方法来进行解决

iOS App显示中文输入法中的大括号【】

有时候在显示文本时,后台传递的数据中是中文输入法中的大括号[] 这种能突出重点,但是如果是在一行文本的开头,会出现无法对齐 此时可以通过YYKit中的YYLabel解决, YYText中有一个属性 firstLineHeadIndent 可以设置一行开头的边距 YYKit : https://github.com/ibireme/YYKit 原文地址:https://www.cnblogs.com/liuw-flexi/p/12114627.html

Ubuntu14.04安装中文输入法以及解决Gedit中文乱码问题

1 设置中文显示环境 1. 打开System Settings 2. 打开Personal-> Language Support. 会弹出如下对话框,提示你“语言支持没安装完整”. 点击“Remind Me Later”. 3. 在“Language Support”中,点击“Install/Remove Languages”,在打开的窗口中,找到“Chinese(simplified)”并勾选上,点击“Apply Changes”. 4. 上面只是下载了语言包,还需要切换系统语言才能使之生效.

【Linux基础】Fcitx中文输入法安装

一.安装Fcitx 1. 安装Fcitx所需组件 sudo apt install fcitx fcitx-tools fcitx-config* fcitx-frontend* fcitx-module* fcitx-ui-* presage 2. 移除多余的组件(仅针对非KDE桌面) 因为上面的安装命令为了方便使用了通配符安装,所以会多安装一个fcitx-module-kimpanel,这个组件可能导致在非KDE桌面环境下Fcitx输入中文时不显示候选词框,如果是KDE桌面则无需移除. su

Ubuntu 14.04中文输入法的安装

Ubuntu默认自带的中文输入法是IBUS框架的ibus-pinyin,IBUS-Bopomofo等.对于习惯于搜狗,紫光华宇,谷歌拼音的我们可能有点使用不习惯.下面就是安装常用的IBUS中文输入法. 1,安装IBUS-googlepinyin,ibus-sunpinyin. 直接在Ubuntu软件中心搜索IBUS,然后选择显示不常用项,即如下找到相应的输入法. 如果除了系统自带的IBUS输入法框架,你还安装了Fcitx等输入法框架,那需要在系统设置→语言支持项目设定"键盘输入方式系统"