不要告诉我用OnSysCommand,这样会使我的程序也无法正常关闭
不要告诉我用钩子,我不想那么麻烦我重载了OnKeyDown函数
但是发现在98下可以,在2K下就失效了该怎么办?
最好有代码

解决方案 »

  1.   

    不用钩子是不可能的,2K下一定要使用它!我前一段时间才用钩子实现了评比系统热键的功能。不止Alt+F4,很多键都被我屏蔽了。需要原码和使用说明吗?
      

  2.   

    应该重载主窗口的WM_CLOSE消息
      

  3.   

    SeainBlue(爱海):
    在WM_CLOSE里面怎么处理?
      

  4.   

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    TCHAR szHello[MAX_LOADSTRING];
    LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); switch (message) 
    {
    case IDM_ABOUT:
       DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
       break;
    case IDM_EXIT:
       DestroyWindow(hWnd);
       break;
    default:
       return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
    case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    // TODO: Add any drawing code here...
    RECT rt;
    GetClientRect(hWnd, &rt);
    DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
    EndPaint(hWnd, &ps);
    break;
    case MSG_SERVER_WATCHDOG: 
                {
    //     PostMessage(FindWindow( "TWATCHDOG", "WATCHDOG"),
        PostMessage((HWND)lParam,
        MSG_SERVER_WATCHDOGACK, wParam, 1);
                    //MessageBeep(MB_ICONEXCLAMATION);
    //                DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
                }
    break; case WM_DESTROY:
    PostQuitMessage(0);
    break;
    case WM_CLOSE:
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
       }
       return 0;
    }
      

  5.   

    http://www.csdn.net/expert/topic/1095/1095526.xml?temp=.7241175
      

  6.   

    如果是SDI或者MDI的VC工程,只需要处理CMainFrame::OnClose(),对应消息WM_CLOSE,如果是基于对话框的工程,重载对话框的OnCancel()虚函数。
    原理是:
    Alt+F4组合键关闭窗口,对于SDI和MDI都是向主窗口发送了WM_CLOSE,而对于对话框,则是运行函数CDialog::OnCancel()
    同时,CDialog::OnCancel()也是Esc键的响应函数,CDialog::OnOK()是Enter键的响应函数。处理WM_CLOSE消息、OnCancel()、OnOK()就能屏蔽相应的键
      

  7.   

    根据你程序的条件,如果不想关闭窗口,就不要调用基类的相应函数,例如:
    CMyMainFrame::OnClose() //处理Alt + F4组合键
    {
        if( 不想关闭 )
          return;
        CMainFrame::OnClose();
    }CMyDialog::OnCancle() //处理Alt + F4组合键、Esc键
    {
        if( 不想关闭 )
          return;
        CDialog::OnCancle();
    }CMyDialog::OnOK() //处理Enter键
    {
        if( 不想关闭 )
          return;
        CDialog::OnOK();
    }
      

  8.   

    其實用Alt+f4會觸發程序去找到OnCancle();也就是去尋找默認的CDialog::OnCancle();...你只要像樓上的想法做也就可以了.或者說取消CDialog::OnCancle()
      

  9.   

    如何屏蔽系统低级键?
    (angerboy发表于2001-8-23 13:41:02)  在windows中,通常只有很少的方法能够中断一些系统事件.我们首先考虑的机制是一个hook,因为微软给hook提供了全面的支持,它也存在于系统中,这样他能够中断某种事件.假如hook部工作的话,那么我考虑API hook. 微软并不想正式的支持API hook,所以如果可能的话,我会尽量的避免使用API hook.幸运的是,这个特别的问题可以通过设置hook来解决.在window NT 4.0 Service Pack 3时候,微软为系统增加了一个低级的键盘hook,WH_KEYBOARD_LL..通常,高级的键盘hook,WH_KEYBOARD,是在一个线程的消息队列中被移走的时候截获的.WH_KEYBOARD hook比大多数的应用程序的优先级要高.然而,有一些击键并没有直接发送到线程的消息队列中. Ctrl+Esc,Alt+Tab就是很好的例子.这些击键在系统的raw输入线程中进行内部处理.由于应用程序不能接收到这些消息,所以应用程序没有办法截获到它们,保护正常的进程.这种行为是为了用户能够切换到另外一个应用程序,不管应用程序的线程已经进入循环,或者挂起.
    当然,只有很少的应用程序真正的需要截获这些消息.为了适应这些应用程序,微软介绍了一种WH_KEYBOARD_LL hook.这个hook将被用于用户输入后,系统接收到它们之前进行处理.但是这个hook又一个严重的缺点:容易引起无限循环或者挂起. 假如这样发生了,系统就不能正确的处理击键消息了.
    为了减轻这种痛苦,微软放了一个时间限制在这个hook上面. 当系统发送一个通知给一个低级键盘hook的过滤函数时,系统给这个函数一定的时间去执行.假如在允许时间内没有返回的话,系统将忽略它.并进行正常处理.这个时间通过LowLevelHooksTimeout值来实现(HKEY_CURRENT_USER\Control Panel\Desktop )  /************************************************************************
      Module:  DisableLowLevelKeys.cpp
      Notices: Written 2000 Jeffrey Richter
      **************************************************************************/  #define _WIN32_WINNT 0x0400
      #include <Windows.h>  /////////////////////////////////////////////////////////////////////////
      LRESULT CALLBACK LowLevelKeyboardProc(int nCode, 
         WPARAM wParam, LPARAM lParam) {     BOOL fEatKeystroke = FALSE;     if (nCode == HC_ACTION) {
            switch (wParam) {
            case WM_KEYDOWN:  case WM_SYSKEYDOWN:
            case WM_KEYUP:    case WM_SYSKEYUP: 
               PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;
               fEatKeystroke = 
                  ((p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0)) ||
                  ((p->vkCode == VK_ESCAPE) && 
                  ((p->flags & LLKHF_ALTDOWN) != 0)) ||
                  ((p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 
                   0x8000) != 0));
               break;
            }
         }
         return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, 
                lParam));
      }  /////////////////////////////////////////////////////////////////////////
      int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) {     // Install the low-level keyboard & mouse hooks
         HHOOK hhkLowLevelKybd  = SetWindowsHookEx(WH_KEYBOARD_LL, 
            LowLevelKeyboardProc, hinstExe, 0);     // Keep this app running until we’re told to stop
         MessageBox(NULL, 
            TEXT("Alt+Esc, Ctrl+Esc, and Alt+Tab are now disabled.\n")
            TEXT("Click \"Ok\" to terminate this application and re-enable
                  these keys."),
            TEXT("Disable Low-Level Keys"), MB_OK);
         UnhookWindowsHookEx(hhkLowLevelKybd);
      
         return(0);
      }
      

  10.   

    void CMyTabExampleDlg::OnClose() 
    {
    // TODO: Add your message handler code here and/or call default
    if((0x1000&GetKeyState(VK_MENU))&&(0x1000&GetKeyState(VK_F4)))
    {
    return;
    }
    CDialog::OnClose();
    }
      

  11.   

    Cline(营营) 的方法很简单实用,推荐大家使用顺便请Cline详细解释一下判断条件是怎么设置的
    if((0x1000&GetKeyState(VK_MENU))&&(0x1000&GetKeyState(VK_F4)))
      

  12.   

    这个方法的毛病:
    按住alt+F4,点出系统菜单,点击"关闭",关不掉...............zhouyonggang(周周) ( ) :找MSDN,上面很清楚。