截获“关闭Windows”的窗口!和“关闭Windows”的函数(100分)

  • 主题发起人 主题发起人 hhzh426
  • 开始时间 开始时间
H

hhzh426

Unregistered / Unconfirmed
GUEST, unregistred user!
当从开始菜单点击“关机”进会出现一个“关闭Windows”的窗口,在那儿可以选择关机的<br>方式。是否可以截获该操作,使得“关闭Windows”的窗口不能出现!<br>还有程序调用exitwindows,exitwindowsex函数时不会出现“关闭Windows”的窗口,有什么<br>办法钩住这两个函数,使得调用这两个函数时直接调用我自己的关机窗口!
 
嗯,首先很理解你编这个东东的意思。我也想过。哈。。。<br>EXITWINDOWSEX函数还有几个FLAG哦:EWX_FORCE就是强制关机!!!!!EWX_POWEROFF<br>就是关闭电源!EWX_SHUTDOWN是安全关机,你自己选择吧。哈。。。<br>我没试过哦,调用会出现MS的“关闭WIDOWS“窗口吗?
 
苯办法(不要笑:)<br>编一个后台运行程序程序,定时findwindow(...),一发现有“关闭 windows"窗口,<br>立刻sendmessage将此窗口关闭。<br>不过会影响系统效率。
 
昨天提到的本办法,我自己试了一下,效果还行,具体如下:<br>在form窗体中放一个timer控件,定时器间隔可以设成10ms<br>在timer事件中<br>procedure TForm1.Timer1Timer(Sender: TObject);<br>var wnd:thandle;<br>begin<br>wnd:=findwindow(nil,pchar('关闭 Windows'));<br>if wnd&lt;&gt;0 then &nbsp;sendmessage(wnd,wm_close,0,0);<br>end;<br>//当然,要在后台运行这个程序。。。<br><br>//还有一种稍微高级的方法,请往下看<br><br>关闭windows<br>windows在关闭时会向所有的应用程序发送WM_QUERYENDSESSION,在delphi中截获这个消息<br>//=====================================<br>WM_QUERYENDSESSION &nbsp;<br>nSource = (UINT) wParam; &nbsp; &nbsp;// source of end-session request <br>fLogOff = lParam &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// logoff flag <br>&nbsp;<br>nSource &nbsp;Reserved for future use. <br>fLogOff<br>Value of lParam. Indicates whether the user is logging off or shutting down the system. <br><br>//如果程序不想让windows退出,把返回值设为false(delphi中为0)<br>==============================================================<br>以下给出delphi中实现:<br>private<br> &nbsp; &nbsp;procedure wmQUERYENDSESSION(var msg:tWMQUERYENDSESSION);message WM_QUERYENDSESSION;<br><br>......<br><br>procedure wmQUERYENDSESSION(var msg:tWMQUERYENDSESSION);<br>begin<br>if 不想退出windows then msg.Result :=0<br>else msg.result:=1 //允许退出windows<br>end;<br><br>//vb中也可以实现,在VB中form有个事件时queryunload<br>Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)<br><br>if unloadmode=vbAppWindows then cancel=1 &nbsp; '不退出windows;如果cancel=0则允许退出windows<br><br>End Sub<br><br><br>其中unloadmode 参数值的意义:<br>vbFormControlMenu 0 用户从窗体上的“控件”菜单中选择“关闭”指令。 <br>vbFormCode 1 Unload 语句被代码调用。 <br>vbAppWindows 2 当前 Microsoft Windows 操作环境会话结束。 <br>vbAppTaskManager 3 Microsoft Windows 任务管理器正在关闭应用程序。 <br>vbFormMDIForm 4 MDI 子窗体正在关闭,因为 MDI 窗体正在关闭。 <br>vbFormOwner 5 因为窗体的所有者正在关闭,所以窗体也在关闭。 <br><br>咳,赚分真难,连n年前学的VB都搬出来:)
 
谢谢秋风萧萧:<br>您的方法确实可行,只是有个问题,当从开始菜单上点击“关机”时,虽然没有出现“关<br>闭 windows”的窗口,只是屏幕却闪了一下,而且偶尔“关闭 windows”的窗口会在屏幕<br>上闪一下。我想,是不是有办法修改“关机”菜单项的函数调用,使得点击“关机”时调<br>用我的程序中的特定函数?<br>对于您的其他方法我已经知道,windows是在调用“关闭 windows”的窗口后才广播“关<br>机”消息,因此只适用于别的程序调用关机函数的情况。
 
再等两天!
 
要想不能关机很容易,只需要后台运行一个什么都不做的程序就可以了,只是需要用到Delphi 5的UDP控件就可:)<br><br>
 
通过REGEDITI可以使关闭系统都出不来<br>如编程只需调用<br>我曾经用过<br>不过忘了,谁有心可以查一下
 
多人接受答案了。
 
后退
顶部