为何不能获得键盘的消息?

解决方案 »

  1.   

    你是基于对话框的程序吧,
    只要你继承PreTranslateMessage就可以了,

    BOOL CHTTwoSoftDlg::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_RETURN))
    {
    // OnKeyDown((UINT)pMsg->wParam,(UINT)pMsg->lParam,(UINT)pMsg->lParam);
    return TRUE;
    }
    return CDialog::PreTranslateMessage(pMsg);
    }
      

  2.   

    基于对话框的程序肯定需要使用PreTranslateMessage
    视图当中当中的回车键,也是需要使用PreTranslateMessage来截获
    这些按键消息都被系统截获了,不放到子窗口的消息队列当中,因此要获得他们的响应只有在系统处理他们之前先处理,方法就是楼上的。
      

  3.   

    BOOL CAaaDlg::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class int a=0;
    CString str;
    switch(pMsg->message)
    {
    case WM_MOUSEMOVE:
    m_tooltip.RelayEvent(pMsg);
    break;
    case WM_KEYDOWN:
    a=pMsg->wParam;
    str.Format("%d",a);
    MessageBox(str); }
    return CDialog::PreTranslateMessage(pMsg);
    }
      

  4.   

    我建了一个多文档的项目,希望在框架窗口或子窗口捕获控制空格键的消息进行处理,分别试了Onchar()和PreTranslateMessage()都无法控制。我想是不是在工程中用了一个DLL(视频捕获的接口)的缘故,它会不会屏蔽了键盘消息。如果这样该如何处理,请大家帮忙解决。
      

  5.   

    多谢大家关注,我的作文水平一向很差,表达不清见谅
    详细情况如下:
      我学VC时间不长,现在正练习用采集卡提供的DLL开发包作二次开发,修改了厂家提供的一个例子程序,主要就是把PREVIEW的视图实时旋转90度,然后可以抓图。功能以经完成,就是抓图的快捷键加不进去。源程序是一个多文档的框架结构。运行时,点新建文档后,预览窗口出现,显示正常的采集视图。点击旋转按钮后,我在这里把正常的视图隐藏了,利用DLL中提供的一个回调函数得到图象数据,处理后显示在一个新建的对话框类窗口中。此时如果用鼠标点击主FRAME窗口上的工具档或菜单都有效,而键盘快捷键却无效,无论在新建的对话框窗口类中还是原来的子窗口类甚至主框架中,用OnChar去捕获键盘消息时,程序根本不运行到那去。用
    PreTranslateMessage(pMsg),程序可以运行进去,但到下面这步时条件始终不为真。
    if(pMsg->message==VK_SPACE||pMsg->message==VK_F8) 
    {......}
    我想是不是到这步之前键盘消息已经被滤过一道了,我试了很久,还在对话框类中加入DIRECTINPUT对象去捕捉键盘消息但到
       HRESULT hr=m_pKeyboard->GetDeviceState(sizeof(DIKey),DIKey);
    时始终不OK,没招了,请大家支援。
       另又试了一下,主框架中菜单的热键可以执行,不过要先激活主框架才行。这个热键和普通的键盘消息有何不同。
      

  6.   

    PreTranslateMessage应该是可以的,不知道你改写的是哪个类的PreTranslateMessage
      

  7.   

    mainFrame类,childframe,对话框类我都试过了,不行啊!我发现childframe中的窗口中有一含有一个ACTIVEMOVE子窗口,它会不会有影响,会不会用了HOOK之类的东西?
      

  8.   

    建议:用spy++捕捉一下消息看看,当按下F8时究竟发生什么?
    2.设置断点条件为接收到VK_F8消息,查查看。
      

  9.   

    硬着头皮又试了第N次,终于有了一些结果,在对话框类中用OnKeyDown可以捕获到键盘消息,用OnChar不行对话框类不会处理这一消息,用PreTranslateMessage时,对话框类虽然会处理,但得到的消息始终不包含键盘信息。这好象和一些书上介绍的不一样,是不是我用的无模式对话框的原因,另外用spy++捕捉消息时基本上都要死机(我用的Win2000+VC.net).