我知道如果是用MFC开发的对话框可以用 PreTranslateAccelerator,但是我现在是用 SDK 开发的对话框,那该怎么办呢?我主要是想捕捉 Escape 和 Ctrl+Enter 等键。

解决方案 »

  1.   

    要捕获对话框的按键消息,必须先子类化该对话框。
    即用 SetWindowLong 函数改变对话框的处理过程,并在自己的过程中处理按键消息:)
      

  2.   

    说得好复杂哦。直接在对话框的DialogProc()中处理不行吗?就像主窗口的WndProc()中一样
    switch()
    {
      case WM_KEYDOWN:
             // 虚拟键   
             // 组合键用GetKeyState()
    }
      

  3.   

    简单啊,消息处理函数中添加
    case WM_KEYDOWN:
    if ((int)wParam == VK_ESCAPE)
    ...//esc Pressed
    if (GetKeyState (VK_CONTROL) && (int)wParam == VK_RETURN)
    ...//Ctrl+enter Pressed
    break;
      

  4.   

    直接处理是不行的,请大家自己试验一下。WM_KEYDOWN 消息似乎根本没有送过来,所以没法处理。
    如果直接处理可以我就不会来这里问了。
      

  5.   

    直接处理不行
    那么
    case WM_SYSKEYDOWN:这个可以吗,
      

  6.   

    LONG SetWindowLong(HWND hWnd, GWL_WNDPROC, MyProc);
    在MyProc中处理消息。
      

  7.   

    这个问题并不是用SDK或MFC的问题,子控件有自己默认的消息处理函数所以一部分消息是不会交给父窗口处理的。LRESULT CALLBACK MyProc(HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam)
    {
    if (uMsg == WM_KEYDOWN)
    {
    if ((int)wParam == VK_ESCAPE)
    ...//esc Pressed
    if (GetKeyState (VK_CONTROL) && (int)wParam == VK_RETURN)
    ...//Ctrl+enter Pressed
    }
    return CallWindowProc(OldProc,hwnd, uMsg,wParam,lParam); 
    }
      

  8.   

    唉,给个范例给你吧:
    WNDPROC   lpfnOldDlgProc = NULL;
    LRESULT CALLBACK  NewDlgProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);...DlgProc(HWND hDlg,... // 对话框处理过程中
    .
    .
    .
      case WM_INITDIALOG:
        lpfnOldDlgProc = (WNDPROC)SetWindowLong(hDlg,GWL_WNDPROC,(LONG)NewDlgProc);
    .
    .
    .//LRESULT CALLBACK NewDlgProc(HWND hWnd,... // 新的处理过程
    {
      switch(uMsg)
      {
      case WM_KEYDOWN:
        // 在这里处理你的按键消息
        break;
      default:
        break;
      }
      return CallWindowProc(lpfnOldDlgProc,hWnd,uMsg,wParam,lParam);
    }
      

  9.   

    我在网上找到解决的办法了:
    http://blogs.msdn.com/oldnewthing/archive/2005/04/07/406012.aspx