我做了一个ACTIVEX控件  用钩子拦截键盘消息,有时候会发现程序会崩溃,
LPMSG lpMsg = (LPMSG) lParam; // 只有在显示登录界面或者全屏状态时才处理键盘消息.
if (ext_bKeypadMessage)
{
if (WM_KEYDOWN == lpMsg->message)
{
if( (nCode >= 0) && (PM_REMOVE == wParam) && 
AfxGetApp()->PreTranslateMessage(lpMsg))
{
lpMsg->message = WM_NULL;
lpMsg->lParam = 0L;
lpMsg->wParam = 0;
}
}
}跟踪发现AfxGetApp()->PreTranslateMessage(lpMsg))是这句崩了lpMsg里面的值都是正常的,lpMsg->hwnd不是空值
但是lpMsg->hwnd->unused有时候是负数,有时候是0,有时候是 CXX0030:无法计算的表达式。
搞不懂这个unused是干什么的,  我应该怎么改善呢,让程序不会崩?
是不是这样就行了
if (lpMsg->hwnd->unused <= 0)
{ return }

解决方案 »

  1.   

    lpMsg->hwnd又不是一个结构体、类、什么的,能这样用?
      

  2.   

    系统启动时有些消息是不需要处理的,还应该是窗口句柄是合法才进行处理
     if( (nCode >= 0) && (PM_REMOVE == wParam) &&  
    AfxGetApp()->PreTranslateMessage(lpMsg))
    改为
     if( (nCode >= 0) && (PM_REMOVE == wParam) &&  ::IsWindow(lpMsg->hwnd) &&
    AfxGetApp()->PreTranslateMessage(lpMsg))
      

  3.   

    加判断 :IsWindow(lpMsg->hwnd)
      

  4.   

    我加了这句依然有时候会崩溃  IsWindow(lpMsg->hwnd)
    窗口句柄是有效的,但就是里面的值unused是0,不得其解。
      

  5.   

    HWND定义成 struct HWND__ { int unused; }*HWND;只是为了保证HWND和指针一样大,并且有自己专有的类型,并不是说它的意义就是指向HWND__的指针,实际上HWND保存的不是地址,其低16位是一个句柄表的索引,高16位是一个防止误用的特征数值