case WM_KEYDOWN :
         switch (wParam)
          {
            case VK_RETURN :
              break;很奇怪, 在switch处下断点可以,而且都知道wParam的值了,然后按下F10或F11,就不走到case 处,而直接跳出来了?怎么回事?

解决方案 »

  1.   

    在case下面加一行,然后将断点,设置在case的下一行,而不要设置在case行。
      

  2.   

          case WM_KEYDOWN : 
            switch (wParam) 
              { 
                case VK_RETURN : 
                  ;  //add new line here 
                  break; 
      

  3.   

    好了,多谢啦。50分!!!
    原因是下面的问题(再加100分):
    我想按VK_ESCAPE退出全屏,
      if (cyClient == GetSystemMetrics(SM_CYSCREEN))
    这个判断没错,
    但是当我随便点了一个按钮后,cyClient 就不等于GetSystemMetrics(SM_CYSCREEN)了,为什么?看看我的WM_COMMAND 里面也没什么啊,而且不点按钮可以退出啊!
      

  4.   


           case WM_LBUTTONDBLCLK :
             SetWindowLong(hwnd, GWL_STYLE, WS_POPUP | WS_VISIBLE);
             SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, GetSystemMetrics(SM_CXSCREEN),
                                    GetSystemMetrics(SM_CYSCREEN), SWP_SHOWWINDOW);
          return 0;
         case WM_KEYDOWN : 
    ........  
                case VK_ESCAPE :
    iiii=0;   //add new line here 
                  if (cyClient == GetSystemMetrics(SM_CYSCREEN))
                   {
                     SetWindowLong(hwnd, GWL_STYLE, WS_OVERLAPPEDWINDOW);
                     SetWindowPos(hwnd, HWND_TOPMOST, 98, 98, 900, 600, SWP_SHOWWINDOW);
                     SetForegroundWindow(hwnd);
                     ChangeDisplaySettings(NULL, 0);
                   }
                  break;这行代码通常没问题,即双击进入全屏幕,ESC退出。但随便点个按钮,就退出不了啦。
    现在点不点按钮,debug都死机。
      

  5.   

    现在在case WM_LBUTTONDBLCLK 处加个断点,调试就都没有问题,怪了!!!
      

  6.   

    一般rebuild all,重新编译一下,保证任何改动代码都编译进去了
      

  7.   

    cyClient都在哪些地方会被修改,另外cyClient应该是类的成员变量,那么有没可能是与之相邻的变量越界造成cyClient的被迫修改?
      

  8.   

    cyClient在哪里赋值?按钮事件如何响应的?
    另外,如果你的窗口是TopMost且全屏状态,会把所有其它窗口都挡住,包括VC的窗口,所以调试时感觉像是死机了,但实际上没死,只是看不到VC窗口的变化,可以继续执行,也可以用Shift-F5结束调试。
      

  9.   

    不行。不是rebuild的事。
    别的变量也不用管,现在是只要点击主窗口上面随便一个button(子窗口)以后,调试按ESC就进不了WM_KEYDOWN!
    如果在   WM_COMMAND里面加个断点,按ESC就能进WM_KEYDOWN!怪不怪?
      

  10.   

    对话框默认按ESC 会直接退出...
      

  11.   


    哦,这个原因!多谢。
    static cyClient在case WM_SIZE :里赋值。但只要不按按钮,这个程序工作的很好啊。
    只要点击主窗口上面随便一个button(子窗口)以后,就好像不接收Key输入了,怪不怪?
      

  12.   


    这个和ESC无关。
    因为我把if (cyClient == GetSystemMetrics(SM_CYSCREEN))这一行去了,也不行。
    我把它放到VK_UP里面,也是一样。就是不接收键盘输入了。我的button就在主窗口上。点击button还有什么副作用?WM_COMMAND 也没什么啊》       case WM_COMMAND :
             switch (LOWORD(wParam))
              {
                case IDM_ACTION_EXIT :
                  SendMessage(hwnd, WM_CLOSE, 0, 0);  // exit hot key
                  break;
              }
             return 0;
      

  13.   

    键盘消息是发给具有焦点的窗口(控件)的,当你点了按钮之后,焦点移到了按钮上,之后键盘消息就发给这个按钮了,如果窗口的WindowProc中就不会收到键盘消息,你可以在消息循环中处理(GetMessage/PeekMessage之后)。
      

  14.   

    通常的方法应该在消息循环中处理,有时候不方便处理时也用WindowHook,设置焦点不太合理,也不容易实现。
      

  15.   

    MFC的话,在PreTranslateMessage()中处理按键,这样就会在子窗口之前截获到按键消息。
      

  16.   

    吼吼,刚打完球回来,一个SetFocus就解决了。老兄神人也!!!
    case WM_COMMAND :
    SetFocus(hwnd);不过老兄说说这种方法有什么不合理的后果呢?这贴分加不了多少了,我再另开一帖。
      

  17.   

    你这样试一下:在按钮上按下鼠标左键,然后将鼠标从按钮上移开,再放开鼠标左键,然后按Esc键。
      

  18.   

    老兄真神神也!!!
    Windows程序设计大部分章节我读了2遍,3遍,看来要都5遍6遍啊。