我调试发现hwnd和wnd并不相等是什么原因?

解决方案 »

  1.   

    刚刚测试了一下,新建了一个MFC空工程,按楼主的代码,2个值确实不一样,然后用Spy++查看发现这2个句柄值分别是:hwnd=pMsg->hwnd;//此句柄是对话框上缺省按钮OK的句柄值
    wnd=m_hWnd;//此句柄是主对话框的句柄值
    当我把对话框焦点换到Cancel上时,再触发KEYDOWN,hwnd的值果然变成了Cancel的句柄值
    所以,hwnd应该是对话框上当前获得焦点的控件的句柄,wnd是主对话框的句柄
      

  2.   

    你的意思是,我想获取tab control上分页的句柄,首先得让分页的对话框获取焦点?
      

  3.   

    不是啊,没有这个意思。获取句柄跟有没有焦点没有关系。
    初始化时保存好分页的指针,然后获取句柄就简单了,http://hi.baidu.com/cannotforget/item/33693636d461944b3075a1c8
      

  4.   

    不是,我的意思是如果我想通过pMsg->hwnd来获取分页的句柄,是不是得让分页获取焦点?
      

  5.   

    窗口句柄是一个变量, 窗口每次创建都会改变.
    你要标记你的三个页面>
    1,  可以使用tab顺序, 因为你就是做一个tab页.
    2. 可以使用窗口标题(GetWindowText)
    3. 可以在你自己的类中提供一个方法还获取一个标记.
      

  6.   

    pMsg里的句柄是触发当前消息所在的窗口句柄,这个句柄有可能是主窗口,有可能是子窗口,跟获不获取焦点没什么关系
      

  7.   

    pMsg->hwnd == this->GetSafeHwnd()就是主窗口,其他就是子窗口咯,如果再具体判断是哪个子窗口,对比句柄值就是,比如判断是否是确定按钮 GetDlgItem(IDOK)->GetSafeHWnd()。反正任何窗口的句柄对你来说都是可以获取到的
      

  8.   

        if (pMsg->message==WM_KEYDOWN)
        {
           if(pMsg->hwnd==m_控件.m_hWnd) m_控件.DoSomething();;
        }
      

  9.   

    判断窗口句柄,GetSafeHwnd() == pMsg->hwnd
      

  10.   

    那如果我的主窗口的控件很多,那不是判断的要死了。比如是个控件,每个都用if -else if判断句柄。有没有方法可以设置,让pMsg->hwnd 就是某个特定句柄?
      

  11.   

    有没有方法可以设置,让pMsg->hwnd 就是某个特定句柄?
    那是不可能的。而且即便如果能,那你其他控件不需要处理么?我觉得你可以先说下你的需求,说不定有其他更好的方法解决
      

  12.   

    我现在需要处理键盘按下的消息,就是抓HOTKEY。我需要判断是分页1是活动窗口,还是分页2是活动的。现在想通过pMsg->hwnd 来判断,比如pMsg->hwnd 是分页1的句柄,那么分页1就是活动的。不知道说明白了没有
      

  13.   

    你用的是 CTabCtrl ?
    那就是 
    m_TabCtrl.GetCurSel();
      

  14.   

    我想通过pMsg->hwnd 来获取当前活动页面
      

  15.   

    楼主这算不算钻牛角尖?或者说对 MFC 还不够理解?继承 CTabCtrl 自己写个类, 在该类中重写 PreTranslateMessage
    函数里加判断 if (pMsg->hwnd == m_hWnd)
    然后在判断里面写上你想要的代码不就行了如果不想写继承类,那就在主窗口的 WM_NOTIFY 消息里处理通用控件的通知消息
    MFC 带有这些通用控件的通知消息处理方法,详细的可以自己去查 MSDN 的通用控件文档PreTranslateMessage 的作用,在我看来只是为了“吃”掉某些消息用的,而不是让你在里面写功能代码的
      

  16.   

    Processing Tab Control Notification Messages
    发送反馈
    As users click tabs or buttons, the tab control ( CTabCtrl) sends notification messages to its parent window. Handle these messages if you want to do something in response. For example, when the user clicks a tab, you may want to preset control data on the page prior to displaying it.Process WM_NOTIFY messages from the tab control in your view or dialog class. Use the Properties window to create an OnChildNotify handler function with a switch statement based on which notification message is being handled. For a list of the notifications a tab control can send to its parent window, see the Notifications section of Tab Control Reference in the Windows SDK.See Also
    Reference
    Using CTabCtrl
    Concepts
    Controls (MFC)这是 VS2010 的文档,再详细点的可以自己去查现在首先了解一下你自己的需求,看了所有楼层,猜测你是想要获取当前 Tab 焦点栏目里的对话框句柄?
    但这个是不可能的,因为 Tab 控件只负责给你一个“界面”,里面的对话框是需要你自己安放进去的,Tab 不负责管理
    所以你不能单纯的说获得 Tab 焦点栏目就获得焦点对话框但是你可以在插入 Tab Item 的时候,有个 lParam 的参数,你可以给它制定为子对话框的句柄或者窗口类
    那么在焦点通知消息里再获得 Tab 的 lParam 参数
    (我之前习惯用 VS2005,至于 2010 能不能绑顶子窗口我没试过)
    可能我说的有点混乱或者难明,但如果你是了解 MFC 消息机制及处理,那么不难明白我所说的意思
      

  17.   


    如果继承 CTabCtrl 自己写个类,在该类中重写 PreTranslateMessage,那么pMsg->hwnd不就是自己写的这个类的窗口句柄了?
    if (pMsg->hwnd == m_hWnd)  请问这句判断有什么作用?
      

  18.   


    如果继承 CTabCtrl 自己写个类,在该类中重写 PreTranslateMessage,那么pMsg->hwnd不就是自己写的这个类的窗口句柄了?
    if (pMsg->hwnd == m_hWnd)  请问这句判断有什么作用?我是根据你的提问写的回答
    你自己在CHotKeysAppDlg里重载PreTranslateMessage里面的pMsg->hwnd都不一定等于对话框的m_hWnd了
    所以我才给你加个判断但是通用控件的消息处理,还是在WM_NOTIFY里面处理就行了,用不着在PreTranslateMessage里面处理
      

  19.   

    请教你一下,如果我继承 CTabCtrl 自己写个类,在该类中重写 PreTranslateMessage,那么我的父对话框的PreTranslateMessage还会响应吗?因为相当于CTabCtrl 控件是长在父对话框里面的?
      

  20.   

    请教你一下,如果我继承 CTabCtrl 自己写个类,在该类中重写 PreTranslateMessage,那么我的父对话框的PreTranslateMessage还会响应吗?因为相当于CTabCtrl 控件是长在父对话框里面的?我忽然又想到一个问题了,CTabCtrl 的子类中 PreTranslateMessage 不一定能获得自身发给父窗口的 NM_* 通知消息
    还是那句话,一般通用控件的消息处理都是在父窗口的 WM_NOTIFY 里面处理
    像你这种在 PreTranslateMessage 的情况我还真没试过你有没有看我19#的回答?我不知道有没有理解错你的意图?
    我猜测你的意图流程是有一个父对话框A,在A里面有一个CTabCtrl控件,控件里面相对每个页都有一个子对话框?
    你现在想做的是想知道 CTabCtrl 中获得焦点的页和于该页对应的子对话框句柄?
    我19#的回答就是按这个流程回答的
      

  21.   

        其实我就是想知道PreTranslateMessage 的pMsg->hwnd是谁的句柄,CTabCtrl控件里哪个分页会获取焦点,我知道怎么做。void CHotKeysAppDlg::OnTcnSelchangeTab(NMHDR *pNMHDR, LRESULT *pResult)
    {
    //隐藏当前页面
    m_pdlg[m_currpage]->ShowWindow(SW_HIDE);
    //获取新页面索引
    m_currpage = m_tabctrl.GetCurSel();
    //显示新页面
       m_pdlg[m_currpage]->ShowWindow(SW_SHOW);
    *pResult = 0;
    }我的m_currpage 就是表示哪个页面获取焦点。
    我其实只是想知道PreTranslateMessage 的pMsg->hwnd是谁的句柄而已
      

  22.   

    “PreTranslateMessage 的pMsg->hwnd是谁的句柄而已”一句话 谁的 hWnd 都可以 , 只要 hWnd 有 消息 。 与焦点 无关 , 焦点 只是 表示 输入消息 会 到 有焦点的 hWnd。
    其他 消息 可能 是 没焦点的 hWnd (如 paint 消息)
      

  23.   

    所以说只要哪个窗口有消息(消息可以是WM_PAINT,WM_KEYDOWN等等多种),pMsg->hwnd就是哪个窗口的句柄是吧?
      

  24.   

    WM_KEYDOWN 是输入 消息 窗口 必须 有 焦点。