这是Win32 Application向导生成的一段About对话框的代码,我添加了WM_KEYDOWN消息
的处理。但是WM_KEYDOWN不响应
如果是MFC的话很好办,只要处理PreTranslateMessage就足够了,但Win32SDK很难
我知道似乎跟WM_GETDLGCODE有关,但不知道如何处理,希望袁峰大侠帮忙。LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM
lParam)
{
 switch (message)
 {
 case WM_INITDIALOG:
  return TRUE; case WM_COMMAND:
  if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  {
   EndDialog(hDlg, LOWORD(wParam));
   return TRUE;
  }
  break;
 case WM_KEYDOWN:
  {
   int a=0;
  }
  break;
 }
    return FALSE;
}

解决方案 »

  1.   

    看啥MFC源代码啊,MFC那种相当于在消息循环的时候就把消息取得并处理.
    因为在消息循环里无论哪个窗口的消息都会被得到的.
    所以我认为用PreTranslateMessage是极其消极的做法.
      

  2.   

    是啊,急了急了,各位帮忙拉!我一直在等待ing
    如果嫌分少我可以再加一些
      

  3.   

    我觉得跟WM_GETDLGCODE无关,wm_getdlgcode是用在对话框上的控件中的,例如edit需要得到tab键消息,但默认情况下tab键已被对话框捕获并用来移动焦点,所以edit得响应wm_getdlgcode并返回DLGC_WANTTAB
      

  4.   

    case WM_INITDIALOG:
    SetFocus(hDlg);
    return FALSE;
    case WM_SETFOCUS:
    return TRUE;
    case WM_KEYDOWN:
    MessageBox(hDlg, "", "", MB_OK);
    return TRUE;
      

  5.   

    我觉得只能用钩子了.MFC里的模态对话框我估计不是win32的那种,MFC自己实现了模态对话框,所以他的消息循环在domodal时仍可用.
      

  6.   

    ross33123这是投机取巧,呵呵如果用户又把焦点移到按钮上呢.
      

  7.   

    呵呵ross33123()真牛,想不到竟然是Focus的问题,250分是你的,如果嫌少可以给我发消息我继续加,谢谢谢谢!
      

  8.   

    晕,你用MFC里的view试试,普通窗口如果有子窗口并且子窗口获得焦点的话,view也不处理按键消息的.
      

  9.   

    对话框也是窗口.如果这样的解决方案就让我们停止了探索,我觉得这个贴就没有意义了.
    我不知你想处理对话框中的keydown是为了什么,普通情况下对话框上子控件肯定不会少的,难道你想对每个子控件进行子类化并当子控件获得WM_SETFOCUS时把焦点设回对话框?
      

  10.   

    小弟也来凑热闹,,,看了你门这些大侠,,我好高兴,,我发了贴,,等了两天都没人回,本来分就不多了。又浪费了。接点分把。同时也是来这里谢谢 _foo(void)//莫名函数:) ( )你的,,你前天帮了我的忙希望以后还要热心帮忙。
      

  11.   

    各位把问题想想复杂了,键盘消息是发到拥有输入焦点的窗口的。而按钮和那个图片以及文字标签都子窗口。所以一开始输入焦点就在按钮上,所以键盘消息送到了按钮而不是这个ABOUT窗口上,而楼主写的WM_KEYDOW消息是能响应的前提就是输入焦点在窗口面晃是按钮或图片上。把这个ABOUT窗口里的全部按钮、标签、图片删掉,全空白楼主的键盘响应就能执行了。因为此时输入焦点必定在这个ABOUT窗口上
      

  12.   

    我即使把所有控件都删除的话也不会进入到KEY_DOWN的
      

  13.   

    正好遇上,搭车问一下,消息处理完后return FALSE是不是表示没有处理这消息,return TRUE则表示处理了这条消息呢?
    case WM_INITDIALOG:
         SetFocus(hDlg);
    return FALSE;
         case WM_SETFOCUS:
    return TRUE;
         case WM_KEYDOWN:
         MessageBox(hDlg, "", "", MB_OK);
         return TRUE;
      

  14.   

    比如要解决焦点转移到确认按钮的问题并不需要子类化只要设置按钮的 NOTIFY 属性然后在对话框处理过程中处理相应的  BN_SETFOCUS 消息
      

  15.   

    应该参考MFC的PreTranslateMessage
    它可以拦截按键消息
      

  16.   

    case WM_COMMAND:
        if( HIWORD(wParam) == BN_SETFOCUS )
        {
            BOOL bSwapButton = GetSystemMetrics(SM_SWAPBUTTON);
            if( !bSwapButton && GetAsyncKeyState(VK_LBUTTON) < 0 ||
                bSwapButton && GetAsyncKeyState(VK_RBUTTON) < 0)
            {
                SetTimer(hDlg, 1, 100, NULL);
            }
            else
            {
                SetFocus(hDlg);
            }
            return TRUE;
        }
        .....case WM_TIMER:
        {
            BOOL bSwapButton = GetSystemMetrics(SM_SWAPBUTTON);
            if( !bSwapButton && GetAsyncKeyState(VK_LBUTTON) >= 0 ||
                bSwapButton && GetAsyncKeyState(VK_RBUTTON) >= 0)
            {
                KillTimer(hDlg, 1);
                SetFocus(hDlg);
            }
            
            return TRUE;
        }
      

  17.   

    http://support.microsoft.com/default.aspx?scid=kb;EN-US;72219这虽然是window3.0的,不过我觉得对win32还是有参考意义的.
    如果有更好的方法,我想MS官方不会推荐用安装钩子这样的方法.
      

  18.   

    问题已经解决
    我真是满笨的
    处理消息不是对话框的强项,不灵活,不管怎样做也都很不爽,因为好多的消息都被过滤掉了
    直接用HWND处理消息就好多了,我错误的做法是使用对话框作为主窗口,这样无形中给自己添了很多很多麻烦,最后想到,还是就使用HWND作为主窗口,通过CreateWindow,效果好的要命,呵呵感谢各位的发言,今天通过你们的见解和我的调试,对于Win32 SDK编程又熟悉了很多。我想一天的调试还是非常值得的
      

  19.   

    请_foo、ross33123到这里领分,感谢你们的见解:)http://expert.csdn.net/Expert/topic/2957/2957395.xml?temp=.6830561