是设置属性错了????还是少了那步呢????//静态库接口函数内部;程序在InitInstance函数调用。
BOOL UserMirroUI(BOOL Switch)
{
CResManager & res = CResManager::GetResManager();
//CResManager类的成员变量钩子类型g_hHook;
if(Switch)
{
if(res.g_hHook != NULL)
return FALSE;
res.g_hHook = SetWindowsHookEx(WH_CBT,CBTProc,0,GetCurrentThreadId());
}
else
{
if(res.g_hHook)
{
UnhookWindowsHookEx(res.g_hHook);
res.g_hHook = NULL;
}
}
return TRUE;
}钩子消息处理函数
LRESULT CALLBACK CBTProc( int nCode,WPARAM wParam,LPARAM lParam )
{
CResManager & res = CResManager::GetResManager();
if( HCBT_CREATEWND == nCode )
{
TCHAR tzClassName[64] = { 0 };
GetClassName( (HWND)wParam,tzClassName,sizeof(tzClassName)-1 );
if( _tcsicmp( tzClassName,_T("#32770") ) == 0 )
{
PMirroUIData pMirroUIData = new MirroUIData;
pMirroUIData->oldWndProc = (WNDPROC)SetWindowLong( (HWND)wParam,GWL_WNDPROC,(LONG)WindowProcFrame);
旧窗口消息处理函数
pMirroUIData->lStyle = GetWindowLong( (HWND)wParam,GWL_STYLE );
pMirroUIData->lStyleEx = GetWindowLong( (HWND)wParam,GWL_EXSTYLE );
pMirroUIData->bTracking = FALSE;
pMirroUIData->nMouseDownNCHTTEST = HTERROR;
pMirroUIData->nNcHitTestCode = HTERROR;
pMirroUIData->hClientBrush = NULL;
SetProp( (HWND)wParam,_T("MirroUI_Prop"),(HANDLE)pMirroUIData );
}
}
return CallNextHookEx(res.g_hHook,nCode,wParam,lParam);
}LRESULT CALLBACK WindowProcFrame( HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam )
{
LRESULT lResult = 0;
PMirroUIData pMirroUIData = (PMirroUIData)GetProp( hWnd,_T("MirroUI_Prop") );
switch( uMsg )
{
case WM_INITDIALOG:
return lResult;
case WM_NCDESTROY:
break;
case WM_NCCALCSIZE:
break;
case WM_NCACTIVATE:
return 1L;
case WM_ACTIVATEAPP:
break;
case WM_EXITSIZEMOVE:
break;
case WM_SIZING:
break;
case WM_SIZE:
case WM_NCPAINT:
return 0L;
case WM_NCHITTEST:
case 0x00AE://:WM_NCUAHDRAWCAPTION
case 0x00AF://:WM_NCUAHDRAWFRAME;
return TRUE;
case WM_NCMOUSEMOVE:
break;
case WM_NCMOUSELEAVE:
break;
case WM_NCLBUTTONDOWN:
break;
case WM_NCLBUTTONUP:
break;
case WM_LBUTTONUP:
break;
default:break;
}
return ::CallWindowProc( pMirroUIData->oldWndProc,hWnd,uMsg,wParam,lParam );
}
解决方案 »
- vc++获取电脑信息,比如cpu 硬盘,驱动信息
- C#做数据库管理系统界面会比用VB好看吗?
- Socket TCP 怎么检测和用户是连接的 不用send?
- 0x783298c7(mfc80ud.dll)处未处理的异常: 0xc000005:读取位置0x0000003a时发生访问冲突
- 我的VS.net2003 调试设的断点仅在运行VS.net2003后才会在断点处停止, 以后都不停了,我只有不断的关项目来调试~!
- 急救:在开发自己的gina.dll(usbkey)时遇到一件比较郁闷的事情,请各位大虾帮帮忙!!
- 三个问题:关键字:CDHtmlDialog/滚动条 /加密/文件保存/Unicode /注册表 (讨论也有分)
- [求助]vc6.0如何一次读取多个文件名
- 在VC里怎么调用API?
- 单文档分割客户区后,左右区域显示不同的图片?
- VC打开数据库连接异常
- 弹出的模态对话框无法关闭 大神们谁给解决一下
if( _tcsicmp( tzClassName,_T("#32770") ) == 0 )
就是 对话框(#32770) ,
你只处理 基于对话框 的 程序,
那么 Frame 是在 else 里了。
else{}
不明白,这个新定义的消息处理函数WindowProcFrame是自动被调用的吗???
看下面的话,难道我不使用钩子,窗口子类化不行吗???
应该明白HOOK和子类是什么回事吧。下面再解释一下
为什么不在HOOK里处理消息。前面已经提到,HOOK是帮助我们把DLL注入别人的进程。
而windows子类处理只能在进程内处理消息,所以只有我们到了别人的进程空间内,才
能做出消息屏蔽的动作。这样说大家都能明白了吧。
去掉 不行吗 , 那就 与 类名 无关了。
pMirroUIData->oldWndProc = (WNDPROC)SetWindowLong( (HWND)wParam,GWL_WNDPROC,(LONG)WindowProcFrame);oldWndProc set 回去的 地方,否则会 一直调用你的 WindowProcFrame
把“if( _tcsicmp( tzClassName,_T("#32770") ) == 0 )”
去掉 不行吗 , 那就 与 类名 无关了。
//去掉之后,那窗口与对话框都能被处理吧???
是啊。
windows 有2种窗口。
一种就是 ‘窗口’
另一种是 ‘对话框’对话框是 一种特殊的窗口。