调整子类程序,以便它可以在窗口和对话框中使用

我试图在单行编辑控件中捕获ENTER和ESC键。

当用户按下ENTER或ESC时,我想从编辑控件中取走键盘焦点并将其设置为listview控件。 Listview控件是编辑控件的兄弟。

我的目标是编写单个子类过程,可用于在主窗口和对话框中对子控件进行子类化。

我发现这篇MSDN文章我发现它有用,因为它的第二个解决方案。 下面是我对代码的改编。

// subclass procedure for edit control LRESULT CALLBACK InPlaceEditControl_SubclassProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) { switch (message) { case WM_GETDLGCODE: return (DLGC_WANTALLKEYS | DefSubclassProc(hwnd, message, wParam, lParam)); case WM_CHAR: //Process this message to avoid message beeps. switch (wParam) { case VK_RETURN: // change focus to listview SetFocus(hwndListView); return 0L; case VK_ESCAPE: // change focus to listview SetFocus(hwndListView); return 0L; default: return ::DefSubclassProc(hwnd, message, wParam, lParam); } break; case WM_KEYDOWN: switch (wParam) { case VK_RETURN: // change focus to listview SetFocus(hwndListView); return 0L; case VK_ESCAPE: // change focus to listview SetFocus(hwndListView); return 0L; default: return ::DefSubclassProc(hwnd, message, wParam, lParam); } break; case WM_NCDESTROY: ::RemoveWindowSubclass(hwnd, InPlaceEditControl_SubclassProc, uIdSubclass); return DefSubclassProc(hwnd, message, wParam, lParam); } return ::DefSubclassProc(hwnd, message, wParam, lParam); } 

题:

我的改编是正确的还是我遗漏了一些东西(也许我不应该像SetFocus那样使用像Raymond Chen指出的WM_NEXTDLGCTL )?