我是这样实现的:重载了DefWindowProc函数,判断是不是WM_QUERYENDSESSION消息,如果是则返回0,自己实验时,程序检测到了关机消息,但并没有阻止关机,我的代码如下:
LRESULT CGetShutDownDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_QUERYENDSESSION:
char tmp[10];
sprintf(tmp,"wParam = 0x%x lParam = 0x%x",wParam,lParam);
if(lParam == 0)
{
::MessageBox(0,"收到关机或重启消息",tmp,MB_OK);
}
else
::MessageBox(0,"收到注销消息",tmp,MB_OK);
return 0;
case WM_ENDSESSION:
return 0;
}
return CDialog::DefWindowProc(message, wParam, lParam);
}
请教大家该如何实现?
LRESULT CGetShutDownDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_QUERYENDSESSION:
char tmp[10];
sprintf(tmp,"wParam = 0x%x lParam = 0x%x",wParam,lParam);
if(lParam == 0)
{
::MessageBox(0,"收到关机或重启消息",tmp,MB_OK);
}
else
::MessageBox(0,"收到注销消息",tmp,MB_OK);
return 0;
case WM_ENDSESSION:
return 0;
}
return CDialog::DefWindowProc(message, wParam, lParam);
}
请教大家该如何实现?
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);重载WindowProc函数。
自己搜索了下,在SDK程序里,在
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)中拦截WM_QUERYENDSESSION消息,可以阻止关机,不知是什么原因,现在想在MFC程序里实现
和你写SDK程序是一样的,你子类化一个MFC的顶级窗口就行了。
LRESULT CGetShutDown_MFCDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_QUERYENDSESSION:
return 0;
case WM_ENDSESSION:
return 0;
default:
return CDialog::DefWindowProc(message, wParam, lParam);
}
return 0;
}
是不是因为重载WindowProc后引起的呢?该怎么处理呢?
比如写成这样:
BOOL CMy999Dlg::OnQueryEndSession()
{
if (!CDialog::OnQueryEndSession())
return FALSE; // TODO: 在此添加专用的查询结束会话代码
return FALSE;
//return TRUE;
}
这样就行了。
LRESULT CMFCTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_QUERYENDSESSION)
return 0; return CDialog::WindowProc(message, wParam, lParam);
}