그것을 보낼 수 WM_QUERYENDSESSION 메시지 창에서 다른 프로세스?
문제
내가 원하는 디버깅하 windows C++응용 프로그램 작성하세요 응답하지 않을 WM_QUERYENDSESSION 방법을 기대합니다.분명히 그것은 작은 까다로운 이렇게 하여 그냥한 시스템을 종료.이 있습 유틸리티 또는 코드는 나를 보내는 데 사용할 수 있는 가짜 WM_QUERYENDSESSION 내 응용 프로그램 윈도우냐?
해결책
사 Win32::GuiTest 펄 모듈의 이런 종류의 작업을 수행 할 것이다.
다른 팁
Windows API SendMessage 작업을 수행하는 데 사용될 수 있습니다.http://msdn.microsoft.com/en-us/library/ms644950(VS.85).aspx
Ti 가능한 그것은 응답하지 않기 때문에 다른 실행하는 프로세스가 응답이 제로(만드는 시스템을 기다립니다.)
네 물론 그것이 가능합니다.내가 직면 유사한 문제는 몇 달 전에 일(알 수없는,하지만 아마 광산)응용 프로그램를 방지하고 종료,그래서 내가 쓴 일부는 빠른하는 코드 사용 EnumWindows 을 열거한 모든 최고 수준의 윈도우,전송되는 각 하나 WM_QUERYENDSESSION 메시지,무엇을 주목에서 반환된 값을 SendMessage 지 열거하면 사람이 반환되는 거짓입니다.에 분 C++/MFC.이 용기의 it:
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())할 수 있습을 보내/글 어떤 메시지를 그 만큼 WPARAM&LPARAM 지 않은 포인터입니다.