如何捕获&x201C;输入键&x201D;在使用WIN32 API(C/C+;+;)的组合框中?
我希望在用户在组合框中按Enter键时捕获事件。如何抓住你。例如: 我在我的组合框中键入“Nguyen Phong Sac”。按Enter键后,会显示一条信息:“阮峰Sac”。如何捕获&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
谢谢你的帮助,我仍然想知道你在写什么样的程序,但我会按照你的要求给你举个例子:
//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++。