我在对话上放了个OCX,现在我想拦截OCX的所有键盘键入.我试过在对话框的PreTranslateMessage这里拦截,但拦不到.谢谢了!!

解决方案 »

  1.   

    还有,为什么在控件源码的WindowProc这里也拦截不WM_KEYDOWN消息的呢?
      

  2.   

    不太清楚。如果PreTranslateMessage截获不到键盘输入。那就不知道了
      

  3.   

    我有这个控件的源码,但里面没有PreTranslateMessage,请问如何手工添加这个PreTranslateMessage啊
      

  4.   

    PreTranslateMessage是在对话框里面才有的,窗口类的话在Wndproc里面添加相应的消息处理函数就可以了。
      

  5.   

    我不知道它是不是窗口类,它是这样创建的
    ......
    WNDCLASS wndclass; EnterCriticalSection(&v_csecThreadSynch); if (GetClassInfo(v_hModule, "DSOFramerOCXWnd", &wndclass) == 0)
    {
    memset(&wndclass, 0, sizeof(WNDCLASS));
    wndclass.style          = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
    wndclass.lpfnWndProc    = CDsoFramerControl::ControlWindowProc;
    wndclass.hInstance      = v_hModule;
    wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wndclass.lpszClassName  = "DSOFramerOCXWnd";
    RegisterClass(&wndclass);
    } m_hwnd = CreateWindowEx(0, "DSOFramerOCXWnd", NULL,
                                WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,
                                rcPos.left, rcPos.top, m_Size.cx, m_Size.cy,
                                m_hwndParent, NULL, v_hModule, NULL); if (m_hwnd) SetWindowLong(m_hwnd, GWL_USERDATA, (LONG)this);......我想应该是在ControlWindowProc这个函数里拦吧,可是就是拦不了WM_KEYDOWN,但WM_COMMAND就能.还有它的工具条的单击也拦不了.帮帮我吧..
      

  6.   

    如果WM_KEYDOWN是发给你的窗口听,ControlWindowProc中应该拦得住。原因是因为WM_KEYDOWN不是发给这个窗口的。你看看是不是应该是发给他的子窗口或是控件的?
    工具条的单击当然也没有,这个单击消息是给给它的工具条窗口的,不是发给它的。PreTranslateMessage是mfc的窗口才有的,你的是直接API创建的,没有PreTranslateMessage。
      

  7.   

    按键消息有
    WM_KEYDOWN
    WM_KEYUP
    WM_CHAR
    你都拦截了吗?
      

  8.   

    我已经是这样拦了,但都不行,
    case WM_COMMAND:
    MessageBox(NULL,"菜单命令","命令",MB_OK);
    pCtl->OnMenuMessage(msg, wParam, lParam);
    break;
    case WM_KEYDOWN:
    case WM_KEYUP:
    case WM_CHAR:
    case WM_DEADCHAR:
    case WM_SYSKEYDOWN:
    case WM_SYSKEYUP:
    case WM_SYSCHAR:
    case WM_SYSDEADCHAR:
    case WM_KEYLAST:
    MessageBox(NULL,"dd","dd",MB_OK);
    break;