هل من الممكن إرسال رسائل WM_QUERYENDSESSION إلى نافذة في عملية مختلفة؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

أريد تصحيح أخطاء تطبيق Windows C++ الذي كتبته لمعرفة سبب عدم استجابته لـ WM_QUERYENDSESSION كما أتوقعه.من الواضح أنه من الصعب بعض الشيء القيام بذلك بمجرد إيقاف تشغيل النظام.هل هناك أي أداة مساعدة أو رمز يمكنني استخدامه لإرسال WM_QUERYENDSESSION مزيف إلى نوافذ تطبيقي بنفسي؟

هل كانت مفيدة؟

المحلول

لقد استخدمت Win32::GuiTest وحدة بيرل للقيام بهذا النوع من الأشياء في الماضي.

نصائح أخرى

يمكن استخدام Windows API SendMessage للقيام بذلك.http://msdn.microsoft.com/en-us/library/ms644950(VS.85).aspx

من الممكن أنه لا يستجيب لأن بعض العمليات الجارية الأخرى قد استجابت بصفر (مما يجعل النظام ينتظرها.)

نعم بالطبع، من الممكن.لقد واجهت مشكلة مماثلة منذ بضعة أشهر حيث كان بعض التطبيقات (غير معروف، ولكن من المحتمل أن يكون تطبيقًا خاصًا بي) يمنع إيقاف التشغيل، لذلك كتبت بعض التعليمات البرمجية السريعة التي تستخدم 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_pكانت هذه مجرد نسخة محلية من هذا المؤشر في مربع الحوار، لذا يمكن لرد الاتصال المساعد الوصول إليه.قلت لك أنها كانت سريعة وقذرة :-)

نعم.إذا كان بإمكانك الحصول على مقبض النافذة (ربما باستخدام FindWindow())، فيمكنك إرسال/نشر أي رسالة إليه طالما أن WPARAM وLPARAM ليسا مؤشرات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top