You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unicode版本Tooltip控件调用SendMessageW执行TTM_ADDTOOLW返回FALSE的问题求助

Unicode版本Tooltip控件调用SendMessageW执行TTM_ADDTOOLW返回FALSE的问题求助

大家好,我现在碰到一个Tooltip控件的棘手问题,想请各位帮忙看看。

我原本写的ANSI版本Tooltip代码是可以正常工作的,能正确显示提示框:

void Tooltip::init() {
    InitCommonControls();
    hwnd = CreateWindowExA(WS_EX_TOPMOST, TOOLTIPS_CLASSA, nullptr, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, 0, 0, 0, 0, Game::windowHWND, nullptr, GetModuleHandleA(nullptr), nullptr); 
    //static inline HWND hwnd; in header
}

TTTOOLINFOA lastTooltip = {};
void Tooltip::showText(const std::wstring &text) {
    auto conv = Helpers::utf8EncodeTo1251(text);
    if(current == conv) { 
        //static inline std::string current; in header
        return;
    } else if(text.empty()){
        SendMessageA(hwnd, TTM_DELTOOLA, 0, (LPARAM)&lastTooltip);
        current.clear();
        return;
    }
    current = conv;
    SendMessageA(hwnd, TTM_DELTOOLA, 0, (LPARAM)&lastTooltip);
    lastTooltip = {};
    lastTooltip.cbSize = sizeof(TTTOOLINFOA);
    lastTooltip.uFlags = TTF_SUBCLASS;
    lastTooltip.hwnd = Game::windowHWND;
    lastTooltip.lpszText = (char*) current.data();
    GetClientRect(Game::windowHWND, &lastTooltip.rect);
    SendMessageA(hwnd, TTM_ADDTOOLA, 0, (LPARAM)&lastTooltip); //result == 1 (TRUE)
}

但因为要支持西里尔文文本,如果用户没设置俄语区域,ANSI版本的文本会乱码,所以我必须改用Unicode版本的Tooltip。可是改写后的代码里,SendMessageW调用TTM_ADDTOOLW总是返回FALSE,tooltip根本不显示:

void Tooltip::init() {
    InitCommonControls();
    hwnd = CreateWindowExW(WS_EX_TOPMOST, TOOLTIPS_CLASSW, nullptr, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, 0, 0, 0, 0, Game::windowHWND, nullptr, GetModuleHandleA(nullptr), nullptr);
}

TTTOOLINFOW lastTooltip = {};
void Tooltip::showText(const std::wstring &text) {
    if(current == text) { 
        //current is now std::wstring
        return;
    } else if(text.empty()){
        SendMessageW(hwnd, TTM_DELTOOLW, 0, (LPARAM)&lastTooltip);
        current.clear();
        return;
    }
    current = text;
    SendMessageW(hwnd, TTM_DELTOOLW, 0, (LPARAM)&lastTooltip);
    lastTooltip = {};
    lastTooltip.cbSize = sizeof(TTTOOLINFOW);
    lastTooltip.uFlags = TTF_SUBCLASS;
    lastTooltip.hwnd = Game::windowHWND;
    lastTooltip.lpszText = (wchar_t*) text.data();
    GetClientRect(Game::windowHWND, &lastTooltip.rect);
    SendMessageW(hwnd, TTM_ADDTOOLW, 0, (LPARAM)&lastTooltip); //result == 0 (FALSE, no tooltip shown)
}

我已经尝试过设置/D_UNICODE和/DUNICODE编译选项,但问题依然存在——ANSI版本的TTM_ADDTOOLA配合SendMessageA能正常工作,可Unicode版本就是不行。有没有大佬知道这是哪里出问题了?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 10:45:30