Reputation: 910
There is a WTL::CListViewCtrl
, which is displayed in a Window. When it has the focus, and any key is pressed, the WM_KEYDOWN / UP is called, but the WM_CHAR.
class CPopupList : public CWindowImpl<CPopupList, WTL::CListViewCtrl>
{
public:
DECLARE_WND_SUPERCLASS(NULL, WTL::CListViewCtrl::GetWndClassName())
BEGIN_MSG_MAP(CPopupList)
MESSAGE_HANDLER(WM_GETDLGCODE, OnGetDlgCode)
MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)
MESSAGE_HANDLER(WM_KEYUP, OnKeyUp)
MESSAGE_HANDLER(WM_CHAR, OnChar)
REFLECTED_NOTIFY_CODE_HANDLER(LVN_ITEMCHANGED, OnListItemChanged)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/);
LRESULT OnKeyUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/);
LRESULT OnChar(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/);
LRESULT OnGetDlgCode(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& afx_msg LRESULT OnListItemChanged(WPARAM wParam, LPNMHDR hdr, BOOL&);
...
}
Both CPopupList::OnKeyDown
and CPopupList::OnKeyUp
are called, but CPopupList::OnChar
is not.
The OnGetDlgCode
code is return DLGC_WANTALLKEYS | DLGC_WANTCHARS;
What I found, if I post the WM_KEYDOWN to the Parent window, WM_CHAR is being called in the Parent:
LRESULT CPopupList::OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
::PostMessage(m_hWndParentCtrl, uMsg, wParam, lParam); -> this will call WM_KEYDOWN + WM_CHAR in parent
}
I would like to catch the WM_CHAR here in the ListView. How can I do that, what am I missing?
Upvotes: 0
Views: 383
Reputation: 19966
ListView
does not allow typing text. Hence, it does not need to produce WM_CHAR
. This particular message is typically translated from keystrokes using the TranslateMessage API. Your parent window obviously makes a call to it.
Upvotes: 2