我做了一个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 }
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 }
if( (nCode >= 0) && (PM_REMOVE == wParam) &&
AfxGetApp()->PreTranslateMessage(lpMsg))
改为
if( (nCode >= 0) && (PM_REMOVE == wParam) && ::IsWindow(lpMsg->hwnd) &&
AfxGetApp()->PreTranslateMessage(lpMsg))
窗口句柄是有效的,但就是里面的值unused是0,不得其解。