写C程序:截取消息WM_QUERYENDSESSION,阻止关机

来源:百度知道 编辑:UC知道 时间:2024/05/20 00:15:43
请问如何写?高手回答。

一定要排下版分下行,这个需要交上去给别人看得

要答案,不要教我写的方法,LS走开

别处找到的,很详细了

如何禁止Windows关机呢?换句话说,如何得到Windows关机的通知呢?

原理:Windows在关机的时候会想所有顶层窗口广播一个消息WM_QUERYENDSESSION,其lParam参数可以区分是关机还是注销用户(注销用户时lParam是ENDSESSION_LOGOFF)。然后Windows会等到所有的应用程序都对这个消息返回TRUE才会关机,因此,只要我们的应用程序对这个消息的处理返回FALSE,Windows就不会关机了。而且通过这个例子,大家也应该可以区分系统关机和注销用户了吧(本例子不能区分)。下面看例子,例子的源程序在这里。

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{

switch (iMsg)
{

case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
case WM_QUERYENDSESSION:
::MessageBox(hwnd,"未经本程序许可,你不能关机!","禁止关机",MB_OK|MB_SYSTEMMODAL);

return 0;//此处返回0则不能关机,返回1就能关机。
}
return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
}

为了节省篇幅,这里之列出了消息处理过程。为了更清楚的看到消息处理,这个例子没有用VCL,而是直接使用了SDK。

另外,这个程序也不是绝对能阻止Windows关机,因为如果某个应用程序调用ExitWindowsEx(EWX_POWEROFF|EWX_FORCE,0);来关机,我这个程序就阻止不了,应为那样调用ExitWindowsEx,系统不会发出WM_QUERYENDSESSION消息,我那个程序也就没有用了,呵呵