【问题标题】:How to capture “Enter key” in combobox using WIN32 API (C/C++)?如何使用 WIN32 API (C/C++) 在组合框中捕获“输入键”?
【发布时间】:2013-03-17 02:15:53
【问题描述】:

当用户在组合框中按 Enter 时,我想捕获事件。怎么抓你。例如: 我在组合框中输入“Nguyen Phong Sac”。按 Enter 键后,会显示一条消息:“Nguyen Phong Sac”。 谢谢你的帮助,

【问题讨论】:

  • 是原生的win32 api(不是.net 也不是mfc)?您需要将 WM_KEYDOWN 添加到您的消息过程中。
  • 我想在组合框中捕捉 Enter 键
  • 你能举个例子吗?
  • @Xearinox 因为使用 .Net(WPF/Winforms)/MFC 编写 UI 比直接使用 Win32 API 更快、更容易。这不是关于我是否了解 WIN32 API 的强大功能,而是关于使用 Claymore 来切割黄油。例如,我编写的驱动程序的客户端使用 C++ 进行内核通信,使用 WPF 进行 UI。
  • 我不这么认为。 Win32 API 比 .Net 框架更快。但是构建一个win32应用比较难

标签: api winapi combobox key enter


【解决方案1】:

我还是想知道你在写什么样的程序,但我会按照你的要求给你一个例子:

//Tested with Windows 7 x64, VS2012
//When Creating:
hWndComboBox = CreateWindow(WC_COMBOBOX, TEXT(""), 
               CBS_DROPDOWN | CBS_HASSTRINGS | WS_CHILD | WS_OVERLAPPED | WS_VISIBLE,
               xpos, ypos, nwidth, nheight, hwndParent, NULL, HINST_THISCOMPONENT,
               NULL);

hWndEditBox = CreateWindow(WC_EDIT, TEXT(""), 
              CBS_DROPDOWN | CBS_HASSTRINGS | WS_CHILD | WS_OVERLAPPED | WS_VISIBLE,
              xpos, ypos-30, nwidth, 30, hwndParent, NULL, HINST_THISCOMPONENT,
              NULL);

//Get hwnd of edit control in combobox created earlier.
HWND hwndEdit = GetWindow(hWndComboBox, GW_CHILD);
//Use SetWindowLong to create subclass, lpfnEditWndProc is original proc
lpfnEditWndProc = (WNDPROC) SetWindowLong(hwndEdit, GWL_WNDPROC, (DWORD) SubClassProc); 


//In Subclass Proc
LRESULT CALLBACK SubClassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
   switch (msg) 
   { 
    case WM_KEYDOWN: 
        switch (wParam) 
        {  
            case VK_RETURN: 
                                    //Get Text&Set Text
                LPTSTR buffer = new TCHAR[255];
                GetWindowText(hwnd, buffer, 255);
                SetWindowText(hWndEditBox, buffer);
            break;
        } 
        break; 

  } 

  return CallWindowProc(lpfnEditWndProc, hwnd, msg, wParam, lParam); 
} 

【讨论】:

    【解决方案2】:

    我知道晚了 2 点,但你可以使用 WndProc

            protected override void WndProc(ref Message m)
            {
                  if (m.Msg == 0x100 && (int)m.WParam == 13){
                        //Enter pressed
                  }
    
                  base.WndProc (ref m);
            }
    

    【讨论】:

    • 这是 c# 而不是 c++
    【解决方案3】:

    你也可以在 WTL 中实现这个

    #define YOUR_WM_ENTER WM_USER + 2
    
    class CCommandBarEdit : public CWindowImpl<CCommandBarEdit, CEdit, CControlWinTraits>
    {
        typedef CWindowImpl<CCommandBarEdit, CEdit, CControlWinTraits> baseClass;
    
    public:
        HWND hwndMain;
    
        DECLARE_WND_SUPERCLASS(_T("YOUR_COMMANDBAREDIT"), _T("EDIT"));
    
        BEGIN_MSG_MAP(CCommandBarEdit)
            MESSAGE_HANDLER(WM_CHAR, OnKeyDown)
            DEFAULT_REFLECTION_HANDLER()
        END_MSG_MAP()
    
    private:
        LRESULT OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
        {
            if (wParam == VK_RETURN && GetFocus() == m_hWnd)
            {
                ::SendMessage(hwndMain,  YOUR_WM_ENTER,0,0);
            }
            else
            {
                bHandled = FALSE;
            }
    
            return 0;
        }
    };
    

    你保存编辑容器的地方,m_Combo 是你的组合框

    CCommandBarEdit m_cmdTextBox;
    
    HWND hWndEdit = ::GetWindow(m_Combo.m_hWnd, GW_CHILD);
        if (hWndEdit)
            m_cmdTextBox.SubclassWindow(hWndEdit);
    

    您在哪里回复消息

    MESSAGE_HANDLER(YOUR_WM_ENTER, OnCommandEnter)
    LRESULT CMainFrame::OnCommandEnter(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多