描述:
activex初始化
BOOL CCodesApp::InitInstance()
{
BOOL bInit = COleControlModule::InitInstance();
if (bInit)
{
// TODO: Add your own module initialization code here.
MessageBox(NULL,"kk","k",MB_OK);
HWND hwnd=::FindWindow("IEFrame",NULL);
if(hwnd==NULL)
hwnd=::FindWindow("360se_Frame",NULL);
MessageBox(NULL,"测试1","",MB_OK);
DWORD dwThreadId=0;
if(hwnd!=NULL)
{
dwThreadId=::GetWindowThreadProcessId(hwnd,&dwThreadId);
MessageBox(NULL,"测试2","",MB_OK);
}
if(dwThreadId!=0)
{
//安装钩子
loghook=SetWindowsHookEx(WH_CALLWNDPROC,myloghook,0,dwThreadId);
MessageBox(NULL,"测试3","",MB_OK);
if(loghook==NULL)
{
MessageBox(NULL,"安装钩子失败","失败",MB_OK);
}
else
MessageBox(NULL,"安装钩子成功","成功",MB_OK);
}
}
return bInit;
}
钩子函数:
LRESULT CALLBACK myloghook(int iCode,WPARAM wParam,LPARAM lParam)
{
if(iCode==HC_ACTION)
{
PCWPSTRUCT msg=PCWPSTRUCT(lParam);
if(msg->message==WM_DEVICECHANGE)
{
if(msg->lParam==0x8000)//DBT_DEVICEARRIVAL
{
MessageBox(NULL,"有移动设备插入!","警告!",MB_OK);
}
}
}
LRESULT ret=CallNextHookEx(loghook,iCode,wParam,lParam);
return ret;
}
钩子函数不执行啊,SetWindowsHookEx的返回值为零,我要把activex控件加载到网页上,局部钩子不写在Dll里应该也可以啊?
解决方案1:
我想问两个问题:
一
loghook=SetWindowsHookEx(WH_CALLWNDPROC,myloghook,0,dwThreadId);这里第三个参数你传0的话,系统会自调用当前模块中的myloghook方法吗?
二
按你的代码意图来看,你只是想截获指定窗口发送的消息,这样,第一个参数应该传递WH_GETMESSAGE(好象是这个,我记不清了),但你传递WH_CALLWNDPROC,你的意思是指定窗口的窗口过程被调用时就调用你的函数,这能行吗?
在myloghook开始的地方下断点,看看能否断下
解决方案3:你给第3个参数赋值看看,AfxGetInstanceHandle()
解决方案4: SetWindowsHookEx(WH_CALLWNDPROC,myloghook,0,dwThreadId);
第3个参数不能为0。钩自己所在线程才为0。
你可以把你的代码发给我,我帮你调试一下
gw_net@163.com