如果该模态对话框中有子控件,哪怕是一个static静态文本控件的话,这个时候对话框的窗口回调函数中就无法获取任何的WM_KEYDOWN消息了。
所以模态对话框在没有任何子控件的情况下想要处理Tab键/VK_UP/Down/Left/Rigth键的话,可以使用下面的方式:
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
{
OldWndProc = (WNDPROC)SetWindowLong(hDlg, GWL_WNDPROC, (LONG)NewDlgProc); // 设置新的窗口过程回调函数
}
return (INT_PTR)TRUE;
}
// ... 其它消息处理,这里省略
return (INT_PTR)FALSE;
}
LRESULT CALLBACK NewDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) // 该对话框新的窗口回调函数,过滤WM_KEYDOWN消息。
{
switch(message)
{
case WM_GETDLGCODE:
{
return (DLGC_WANTALLKEYS | CallWindowProc(OldWndProc, hWnd, message, wParam, lParam)); // 注意这里,否则没有办法捕获Tab/方向键
}
case WM_KEYDOWN:
{
TCHAR szText[MAX_PATH] = {0};
StringCchPrintf(szText, _countof(szText), _T("%d"), wParam);
SetWindowText(hWnd, szText);
}
break;
default:
break;
}
return CallWindowProc(OldWndProc, hWnd, message, wParam, lParam);
}原文:http://blog.csdn.net/visualeleven/article/details/41844795