一个关于钩子的问题
我在设计一个全屏的DLL。需要做一个钩子监视WM_GETMINMAXINFO消息,下面就是这个函数,在Win98下可以用,可是在Win2000下就不行了。为什么????
void AddMsgWatch()
{
MsgHook=SetWindowsHookEx(WH_CALLWNDPROCRET,(HOOKPROC)Watch,_hdllInstance,GetCurrentThreadId());
}
LRESULT CALLBACK Watch(int nCode,WPARAM wparam,LPARAM lparam)
{
if(nCode>=HC_ACTION)
{
tagCWPRETSTRUCT* Lp=(tagCWPRETSTRUCT FAR*)lparam;
if(Lp->message==WM_GETMINMAXINFO)
{
MINMAXINFO* lpmmi=(MINMAXINFO FAR*)Lp->lParam;
int width,height;
width=m_FullScrRect.right-m_FullScrRect.left;
height=m_FullScrRect.bottom-m_FullScrRect.top;
if(width>100 && height>100)
{
lpmmi->ptMaxTrackSize.x=width;
lpmmi->ptMaxTrackSize.y=height;
}
}
}
return CallNextHookEx(MsgHook,nCode,wparam,lparam);
}
问题点数:20、回复次数:11Top
1 楼zxs0001(盛)回复于 2004-05-03 15:48:27 得分 0
upTop
2 楼zenithweng()回复于 2004-05-03 16:16:07 得分 0
????Top
3 楼zenithweng()回复于 2004-05-03 19:57:14 得分 0
没人回答吗?拜托了Top
4 楼zhouqingyuan(浪帆)回复于 2004-05-03 21:06:10 得分 10
2000下面怎么不行了呢?编译不过还是运行不过,还是没有起到钩子的作用?Top
5 楼zenithweng()回复于 2004-05-03 23:31:04 得分 0
没起到钩子的作用。我也写了测试的代码,证明有执行到钩子,就是实现不了全屏。具体说是,AutoCad的全屏。Top
6 楼zenithweng()回复于 2004-05-04 12:58:41 得分 0
我知道问题在哪里了可是不会改。我用SPY++监视发现GETMINMAXINFO的指针不一样了。MINMAXINFO* lpmmi=(MINMAXINFO FAR*)Lp->lParam这句中,lpmmi指向的位置和原来的消息不同。有没有高手知道是怎么回事。Top
7 楼cdcjk(攀辉)回复于 2004-05-04 20:02:16 得分 0
upTop
8 楼zenithweng()回复于 2004-05-05 01:44:28 得分 0
没办法了。把全部程序发上来,高手帮看看吧
#include "stdafx.h"
#include <aced.h>
HWND m_MainWnd,m_DocWnd;
WINDOWPLACEMENT m_OldMainPl,m_FullScrPl;
RECT m_MainRect,m_DeskTopRect,m_DocRect,m_FullScrRect;
BOOL m_FullScreen=FALSE,m_WatchDone=FALSE;
LONG oldWndProc;
HHOOK MsgHook;
void InitApp();
void unloadApp();
void FullScreen();
void AddMsgWatch();
void UnMsgWatch();
LRESULT CALLBACK Watch(int nCode,WPARAM wparam,LPARAM lparam);
extern "C" AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode, void* pkt);
void InitApp()
{
acedRegCmds->addCommand("ZENITH_TOOLS",
"FullScreen",
"Fullscreen",
ACRX_CMD_MODAL,
&FullScreen);
AddMsgWatch();
}
void unloadApp()
{
acedRegCmds->removeGroup("ZENITH_TOOLS");
}
void AddMsgWatch()
{
MsgHook=SetWindowsHookEx(WH_CALLWNDPROCRET,(HOOKPROC)Watch,NULL,GetCurrentThreadId());
}
LRESULT CALLBACK Watch(int nCode,WPARAM wparam,LPARAM lparam)
{
if(nCode>=HC_ACTION)
{
tagCWPRETSTRUCT FAR* Lp=(tagCWPRETSTRUCT FAR*)lparam;
if(Lp->message==WM_GETMINMAXINFO)
{
MINMAXINFO FAR* lpmmi=(MINMAXINFO FAR*)Lp->lParam;
int width,height;
width=m_FullScrRect.right-m_FullScrRect.left;
height=m_FullScrRect.bottom-m_FullScrRect.top;
if(width>100 && height>100)
{
ads_printf("\nok");
lpmmi->ptMaxTrackSize.x=width;
lpmmi->ptMaxTrackSize.y=height;
}
}
}
return CallNextHookEx(MsgHook,nCode,wparam,lparam);
}
void FullScreen(void)
{
m_MainWnd=adsw_acadMainWnd();
m_DocWnd=adsw_acadDocWnd();
if(MsgHook!=0)
{
if(m_FullScreen==FALSE)
{
m_FullScreen=TRUE;
m_OldMainPl.length=sizeof(WINDOWPLACEMENT);
GetWindowPlacement(m_MainWnd,&m_OldMainPl);
GetWindowRect(::GetDesktopWindow(),&m_DeskTopRect);
GetWindowRect(m_MainWnd,&m_MainRect);
GetWindowRect(m_DocWnd,&m_DocRect);
m_FullScrRect.left=m_MainRect.left-m_DocRect.left;
m_FullScrRect.top=m_MainRect.top-m_DocRect.top;
m_FullScrRect.right=m_MainRect.right-m_DocRect.right+m_DeskTopRect.right;
m_FullScrRect.bottom=m_MainRect.bottom-m_DocRect.bottom+m_DeskTopRect.bottom;
m_FullScrPl.length=sizeof(WINDOWPLACEMENT);
m_FullScrPl.flags=0;
m_FullScrPl.rcNormalPosition=m_FullScrRect;
m_FullScrPl.showCmd=SW_SHOWNORMAL;
SetWindowPlacement(m_MainWnd,&m_FullScrPl);
}
else
{
m_FullScreen=FALSE;
SetWindowPlacement(m_MainWnd,&m_OldMainPl);
}
}
else
{
ads_printf("\nCan Not Init The Hook!!\n");
}
}
extern "C" AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
{
switch (msg) {
case AcRx::kInitAppMsg:
acrxDynamicLinker->unlockApplication(pkt);
InitApp();
break;
case AcRx::kUnloadAppMsg:
if (MsgHook!=0) {UnhookWindowsHookEx(MsgHook);}
unloadApp();
break;
}
return AcRx::kRetOK;
}
Top
9 楼longlong1129(珑玲)回复于 2004-05-05 01:52:32 得分 10
朋友你是不是想做成全局钩子,你想动态注入啊?
是的话你就需要把你所定义的变量用都变成共享数据.
你可以参考<<windows核心编程>>,里面说的很详细!没记错的化是540几页.Top
10 楼zenithweng()回复于 2004-05-05 11:23:05 得分 0
不是啊。我是在autocad环境下作arx,也就是dll了。在cad中调用,想实现cad的全屏,这个程序在win98、me下都通过了。就是2000下不行。用spy++看一切都正常,就是不工作。
<00047>000800F8 S WM_WINDOWPOSCHANGING lpwp:039AFF20
//x:-4 y:-42 cx:808 cy:697
<00048>000800F8 S WM_GETMINMAXINFO lpmmi:039AFCC0
//ptReserved:160:24
//ptMaxSize:808,608
//ptMaxPosition:-4,-4
//ptMinTrackSize:112,27
//ptMaxTrackSize:812,612
<00049>000800F8 R WM_GETMINMAXINFO lpmmi:039AFB98
//ptReserved:160:24
//ptMaxSize:808,608
//ptMaxPosition:-4,-4
//ptMinTrackSize:200,100
//ptMaxTrackSize:808,697
<00050>000800F8 R WM_WINDOWPOSCHANGING
//x:-4 y:-42 cx:808 cy:612
//就是这里了。正确的cy应该是697,WM_GETMINMAXINFO的消息也改过来了。
//就是不对,我看了没装钩子时的消息,lpmmi的地址是一样的。不知道
//问题是不是这个原因。Top
11 楼zenithweng()回复于 2004-05-07 13:24:42 得分 0
有没有人肯回答我啊Top




