如何拦截关机、重启、注销的消息?(20分)

  • 主题发起人 主题发起人 sy0116
  • 开始时间 开始时间
S

sy0116

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在一个DLL文件中实现一个在系统关机、重启、注销前保存数据的功能,想用GetMessage钩子来得到,于是写了以下代码,可是一点用也没有,请问这是为什么<br>MsgHook:=SetWindowsHookEx(WH_GETMESSAGE,@MsgProc,0,GetCurrentThreadId);<br><br>function MsgProc(ncode,wparam,lparam:Integer):LRESULT;stdcall;<br>var<br> &nbsp;mess:Cardinal;<br>begin<br> &nbsp;mess:=pmsg(lparam)^.message;<br> &nbsp;if (mess=WM_QUERYENDSESSION) or (mess=WM_ENDSESSION) or (mess=ENDSESSION_LOGOFF)then<br> &nbsp;begin<br> &nbsp; &nbsp;SaveInfo;<br> &nbsp;end;<br> &nbsp;Result:=CallNextHookEx(msgHook,ncode,wparam,lparam);<br>end;
 
一连看了楼主的几篇文章 感觉楼主是高人 是不是别的语言学得很厉害 刚转过来学delohi?
 
晕<br>第一次有人说我高,我是地道的菜鸟啊[:D]
 
我想到一个变通的办法:把DLL用全局钩子注入到每一个进程中去,然后再在DLLPROC中写代码当进程退出时保存数据,这样虽然达到了目的,但是系统却不能关机了,每次都卡在“正在保存设置”那一步
 
在dll卸出事件中写saveinfo就可以了
 
我是在DLL_PROCESS_DEATCH中写得saveinfo,可是如果我只把DLL注入到Explorer.exe中(因为一般explore.exe要关机时才退出)就根本不会执行saveinfo(是写注册表保存数据),而且我也发现,如果注入到notepad.exe等进程中如果这些进程是正常退出则saveinfo可以执行,如果是通过用任务管理器或关机、重启、注销等手段而关闭的话则saveinfo也不会执行,不过却会使系统无法关闭
 
如果要是做的彻底的话,需要替换msgina.dll这样能保证你的系统在关闭之前能及时保存你的资料
 
接受答案了.
 
后退
顶部