15,471
社区成员
发帖
与我相关
我的任务
分享
//DLL InitInstance() 中创建个线程 线程中创建DLL窗口和做个钩子
BOOL DLLAPP::InitInstance()
{
CWhand=::CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)CreatedllWindow,this,NULL,NULL);
}
UINT CreatedllWindow(LPVOID lpParam)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// 创建主窗口
DLLAPP *p = (DLLAPP *)lpParam;
pMixSet = new CDIASMIX();
pMixSet->Create(IDD_DLG_SMix);
pMixSet->ShowWindow(FALSE);
HHOOK abc;
DWORD tid=::GetWindowThreadProcessId(pSZMdata->gHwnd,NULL);//pSZMdata->gHwnd 为DLL全局变量是宿主进程窗口句柄
abc=SetWindowsHookEx(WH_GETMESSAGE,KeyboardProc,p->m_hInstance,tid); //设置hook
if (abc==NULL)
{
AfxMessageBox("Hook失败");
}
else
{
AfxMessageBox("Hook成功");
}
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
if(GameHwnd== 0 ||!IsDialogMessage(GameHwnd,&msg) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
CWhand=NULL;
return 0;
}
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam, LPARAM lParam) //****回调函数
{
PMSG pMsg = (PMSG)lParam;
if(pMsg->message == WM_KEYUP) //当键盘弹起消息时检测是不是Home键
{
if(pMsg->wParam == VK_HOME)
{
if(pMixSet->IsWindowVisible())
pMixSet->ShowWindow(FALSE);
else
pMixSet->ShowWindow(TRUE);
}
}
return CallNextHookEx(0,nCode,wParam,lParam);
}