C++ 如何禁用CComboxMFC键盘导航?

C++ 如何禁用CComboxMFC键盘导航?,c++,mfc,combobox,C++,Mfc,Combobox,如何才能禁用CComboxMFC键盘导航,我需要在按下键盘上的键时打开下拉列表,项目不能选择。谢谢 如果您的意思是:“如何禁止更改控件?”,那么只需调用CComboBox上的EnableWindow方法即可 但是,如果您真的想阻止键盘消息击中控件,请使用来吞咽键盘消息。(不要把术语“窗口子类化”与C++类混淆——不是一回事。基本上,我们只是截取所有与组合框相关的WM_CHAR和WM_KEYDOWN消息,并让所有其他消息通过 这样做: WNDPROC g_prevFunc = NULL; LRE

如何才能禁用CComboxMFC键盘导航,我需要在按下键盘上的键时打开下拉列表,项目不能选择。谢谢

如果您的意思是:“如何禁止更改控件?”,那么只需调用CComboBox上的EnableWindow方法即可

但是,如果您真的想阻止键盘消息击中控件,请使用来吞咽键盘消息。(不要把术语“窗口子类化”与C++类混淆——不是一回事。基本上,我们只是截取所有与组合框相关的WM_CHAR和WM_KEYDOWN消息,并让所有其他消息通过

这样做:

WNDPROC g_prevFunc = NULL;

LRESULT MyWindowHook(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if ((uMsg == WM_CHAR) || (uMsg == WM_KEYDOWN) || (uMsg == WM_KEYUP))
    {
        return 0; // swallow message
    }

    return ::CallWindowProcW(g_prevFunc, hWnd, uMsg, wParam, lParam);
}


void MySubclassWindow(HWND hwnd)
{
    g_prevFunc = (WNDPROC)::SetWindowLongW(hwnd, GWL_WNDPROC, (LONG_PTR)MyWindowHook);
}

// wherever your code gets initialized
CYourWindow::OnInit()
{
   // whatever other initialization you got going on...

  // I'm assuming your CComboBox is named something like m_combobox.

  ::MySubclassWindow(m_combobox.m_hWnd);

}
仔细检查以确保这不会中断tab键导航。我刚试过,似乎效果不错。您可能不需要吞下WM_CHAR,只需要吞下WM_KEYUP和WM_KEYDOWN。你可能需要做一些实验

CWnd类上还有一个名为Subclass Window的MFC方法。因此,如果您想使用纯MFC,您也可以研究一下这个问题。

如果您的意思是:“如何禁用控件不被更改?”,那么只需调用cmbobox上的EnableWindow方法

但是,如果您真的想阻止键盘消息击中控件,请使用来吞咽键盘消息。(不要把术语“窗口子类化”与C++类混淆——不是一回事。基本上,我们只是截取所有与组合框相关的WM_CHAR和WM_KEYDOWN消息,并让所有其他消息通过

这样做:

WNDPROC g_prevFunc = NULL;

LRESULT MyWindowHook(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if ((uMsg == WM_CHAR) || (uMsg == WM_KEYDOWN) || (uMsg == WM_KEYUP))
    {
        return 0; // swallow message
    }

    return ::CallWindowProcW(g_prevFunc, hWnd, uMsg, wParam, lParam);
}


void MySubclassWindow(HWND hwnd)
{
    g_prevFunc = (WNDPROC)::SetWindowLongW(hwnd, GWL_WNDPROC, (LONG_PTR)MyWindowHook);
}

// wherever your code gets initialized
CYourWindow::OnInit()
{
   // whatever other initialization you got going on...

  // I'm assuming your CComboBox is named something like m_combobox.

  ::MySubclassWindow(m_combobox.m_hWnd);

}
仔细检查以确保这不会中断tab键导航。我刚试过,似乎效果不错。您可能不需要吞下WM_CHAR,只需要吞下WM_KEYUP和WM_KEYDOWN。你可能需要做一些实验


CWnd类上还有一个名为Subclass Window的MFC方法。因此,如果您想使用纯MFC,您也可以研究这一点。

一个不需要对combobox进行子类化的简单解决方案是将其第一个子窗口(即CEdit框)设置为只读,如下所示:


GetDlgItem(IDC\u MY\u组合)->GetWindow(GW\u CHILD)->SendMessage(EM\u SETREADONLY,1,0)

没有子类化combobox的简单解决方案是将其第一个子窗口(即CEdit框)设置为只读,如下所示:

GetDlgItem(IDC\u MY\u组合)->GetWindow(GW\u CHILD)->SendMessage(EM\u SETREADONLY,1,0)