如何捕获&x201C;输入键&x201D;在使用WIN32 API(C/C+;+;)的组合框中?

如何捕获&x201C;输入键&x201D;在使用WIN32 API(C/C+;+;)的组合框中?,api,winapi,combobox,key,enter,Api,Winapi,Combobox,Key,Enter,我希望在用户在组合框中按Enter键时捕获事件。如何抓住你。例如: 我在我的组合框中键入“Nguyen Phong Sac”。按Enter键后,会显示一条信息:“阮峰Sac”。 谢谢你的帮助,我仍然想知道你在写什么样的程序,但我会按照你的要求给你举个例子: //Tested with Windows 7 x64, VS2012 //When Creating: hWndComboBox = CreateWindow(WC_COMBOBOX, TEXT(""), C

我希望在用户在组合框中按Enter键时捕获事件。如何抓住你。例如: 我在我的组合框中键入“Nguyen Phong Sac”。按Enter键后,会显示一条信息:“阮峰Sac”。
谢谢你的帮助,

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

//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); 
} 

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

//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点,但你可以用WndProc

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

              base.WndProc (ref m);
        }

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

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

              base.WndProc (ref m);
        }

您也可以在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;
    }
};
你在哪里回复信息

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

您也可以在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;
    }
};
你在哪里回复信息

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

它是本机win32 api(不是.net或mfc)?您需要将WM_KEYDOWN添加到消息进程中。我想在ComboBox中捕获Enter键。您能给我一个例子吗?@Xearinox,因为使用.Net(WPF/Winforms)/MFC for UI编写要比直接使用Win32 API快得多,也容易得多。这不是关于我是否了解WIN32 API的功能,而是关于使用Claymore切割黄油。例如,我写的驱动程序的客户端使用C++进行内核通信和用户界面的WPF。我不这么认为。Win32 API比.Net framework快。但构建win32应用程序更难,它是本机win32 api(不是.net或mfc)吗?您需要将WM_KEYDOWN添加到消息进程中。我想在ComboBox中捕获Enter键。您能给我一个例子吗?@Xearinox,因为使用.Net(WPF/Winforms)/MFC for UI编写要比直接使用Win32 API快得多,也容易得多。这不是关于我是否了解WIN32 API的功能,而是关于使用Claymore切割黄油。例如,我写的驱动程序的客户端使用C++进行内核通信和用户界面的WPF。我不这么认为。Win32 API比.Net framework快。但是,Win32的构建更难,而不是C++,这是C语言而不是C++。