它是能够发送WM_QUERYENDSESSION消息的一个窗口,在不同的程序?
题
我要调试一窗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()),可以发布任何消息,它只包含&上面的代码中不是指针。
不隶属于 StackOverflow