它是能够发送WM_QUERYENDSESSION消息的一个窗口,在不同的程序?

StackOverflow https://stackoverflow.com/questions/77133

  •  09-06-2019
  •  | 
  •  

我要调试一窗C++应用程序,我已经写到看到你为什么不应对WM_QUERYENDSESSION如何,我希望它。显然这有点棘手做这个只是关闭的系统。是否有任何工具或代码可用于发送一个假WM_QUERYENDSESSION我应用windows自己?

有帮助吗?

解决方案

我用的 Win32::GuiTest Perl模块不做这样的事情过去。

其他提示

Windows API图可以用来做到这一点。http://msdn.microsoft.com/en-us/library/ms644950(VS。85).aspx

是ti可能它不响应,因为一些其他运行中的进程作出了回应零(使系统等等。)

是的,当然,它可能的。我面临一个类似的问题,几个月前其中一些(不详,但很可能地雷)的应用程序是阻止关闭,所以我写了一些快速的代码,用EnumWindows一一列举所有的顶级窗口,发送每一个WM_QUERYENDSESSION消息,指出什么样的回报值从图是和停止枚举,如果任何人返回错误的。花了大约十分钟的时在C++/MFC。这是胆量:

void CQes_testDlg::OnBtnTest()  
{  
   // enumerate all the top-level windows.  
   m_ctrl_ListMsgs.ResetContent();  
   EnumWindows (EnumProc, 0);  
}  


BOOL CALLBACK EnumProc (HWND hTarget, LPARAM lParam)  
{  
   CString csTitle;  
   CString csMsg;  
   CWnd *  pWnd = CWnd::FromHandle (hTarget);  
   BOOL    bRetVal = TRUE;  
   DWORD   dwPID;  

   if (pWnd)  
   {  
      pWnd->GetWindowText (csTitle);  
      if (csTitle.GetLength() == 0)  
      {  
         GetWindowThreadProcessId (hTarget, &dwPID);  
         csTitle.Format ("<PID=%d>", dwPID);  
      }  

      if (pWnd->SendMessage (WM_QUERYENDSESSION, 0, ENDSESSION_LOGOFF))  
      {  
         csMsg.Format ("window 0x%X (%s) returned TRUE", hTarget, csTitle);  
      }  
      else   
      {    
         csMsg.Format ("window 0x%X (%s) returned FALSE", hTarget, csTitle);  
         bRetVal = FALSE;  
      }  

      mg_pThis->m_ctrl_ListMsgs.AddString (csMsg);
   }
   else  
   {  
      csMsg.Format ("Unable to resolve HWND 0x%X to a CWnd", hTarget);  
      mg_pThis->m_ctrl_ListMsgs.AddString (csMsg);  
   }  
   return bRetVal;  
}

mg_pThis只是一个地方复制在对话的这一指针,以帮助回调可能进行访问。我告诉过你这是快速和肮脏:-)

是的。如果你可以得到的窗口处理(也许用FindWindow()),可以发布任何消息,它只包含&上面的代码中不是指针。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top