子类化组合框时如何抑制自动搜索(Win32/WinAPI)

Posted

技术标签:

【中文标题】子类化组合框时如何抑制自动搜索(Win32/WinAPI)【英文标题】:How to suppress auto-searching when subclassing combobox (Win32/WinAPI) 【发布时间】:2020-11-24 08:34:20 【问题描述】:

我想进行自定义搜索,但它被自动搜索削弱了。这就是我的意思,

这是我的子类化函数:

LRESULT CALLBACK X(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam,UINT_PTR r1,DWORD_PTR r2)

    switch(message)
    
        case WM_KEYDOWN:
        
            if(wParam>64&&wParam<91) //if A-Z hit
            
                char a[2];
                a[0]=wParam;
                insearch.append(a);
            
            else if(wParam==27) insearch=""; //esc key
            else if(wParam==8&&insearch.length()) insearch.erase(insearch.length()-1,1); //backspace
            SendMessage(hwnd,CB_SETCURSEL,SendMessage(hwnd,CB_FINDSTRING,-1,LPARAM(insearch.c_str())),0);
            break;
        
    
    return DefSubclassProc(hwnd,message,wParam,lParam);

这是主要的 WM_CREATE 消息开关,

case WM_CREATE:

    CreateWindowEx(0,"combobox",0,WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST|WS_VSCROLL,5,5,90,125,hwnd,HMENU(1),0,0);
    char o[][20]="Fauna","Fiat","Fold","Folk","Fall","Fires","Ant";
    for(char i=0; i<7; i++) SendDlgItemMessage(hwnd,1,CB_ADDSTRING,0,LPARAM(o[i]));
    SendDlgItemMessage(hwnd,1,CB_SETCURSEL,0,0);
    SetWindowSubclass(GetDlgItem(hwnd,1),X,0,0);
    break;

我有一个全局变量std::string insearch;,每次按下字母键时,它都会被更改并用于搜索。它向后工作得很好,但不能按预期向前工作。例如,当insearch=="FIR" 它选择"Fires" 并且一旦 被点击insearch=="FI" 并且它正确突出"Fiat" 并且再次 被点击insearch=="F" 和它按预期突出显示"Fauna"。因为 不会干扰自动搜索,但字母键会干扰。如果随后按下 Ainsearch=="FA",则默认情况下会突出显示 "Ant"。因为自动搜索只依赖一个字符,它是"A",它搜索以"A"开头的东西,但我希望它跳过默认搜索并采用我的自定义方式,它应该突出显示"Fauna",因为"FA"正在搜索中。所以这是这种情况,请建议我一种抑制自动搜索的方法。

【问题讨论】:

这看起来不像是 C... 请注意,您也总是调用默认 proc。也许你想禁止调用默认的proc,以防它是keydown? @AnttiHaapala 是的,我想这可能会有所帮助,但该怎么做? return 而不是 break... @AnttiHaapala 我现在尝试返回 1 和 0,仍在调用默认 proc。 【参考方案1】:

根据Default Combo Box Behavior,默认搜索行为是响应WM_CHAR而不是WM_KEY(DOWN|UP)触发的:

WM_CHAR 处理字符输入。在下拉列表框中,此消息被传递到列表窗口,将选择移动到以指定字符开头的第一项。在简单的下拉组合框中,此消息被传递给编辑控件。

【讨论】:

以上是关于子类化组合框时如何抑制自动搜索(Win32/WinAPI)的主要内容,如果未能解决你的问题,请参考以下文章

点击搜索框时会自动弹出以前的搜索历怎么才能删除 按DEl键不行360清除也不行 修改win7资源管理器也不行

如何仅在激活两个组合框时启用按钮

Win32中安全的子类化(翻译)

如何抑制 LLVM 自动合成警告?

选择组合框时填充文本框

单击时在JavaFX中填充组合框