2008-09-16 90 views
4

我想调试我写的一个Windows C++应用程序,以了解它为什么没有响应WM_QUERYENDSESSION我的期望值。显然,通过关闭系统来做到这一点有点棘手。是否有任何实用程序或代码可用于将我自己的应用程序窗口发送给我的应用程序窗口?是否可以将WM_QUERYENDSESSION消息发送到不同进程中的窗口?

+0

看到重复的问题http://stackoverflow.com/a/2673800/126229其中有一个链接rmtool.exe – EricLaw 2013-07-01 16:28:24

回答

0

是的。如果你可以得到窗口句柄(可能使用FindWindow()),只要WPARAM不是指针,就可以发送/发送任何消息给它。

1

当然是的,有可能。几个月前我遇到过类似的问题,那里有一些(未知的,但可能是我的)应用程序阻止关机,所以我编写了一些快速代码,使用EnumWindows枚举所有顶级窗口,向每个窗口发送WM_QUERYENDSESSION消息,注意返回来自SendMessage的值是,如果有人返回FALSE,则停止枚举。在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是对话的this指针只是一个本地副本,所以助手回调可以访问它。我告诉你这是快速和肮脏的:-)

+0

请尝试格式化您的代码示例 - 缩进每一行有4个空间。 – ChrisN 2008-09-16 22:00:13

相关问题