Ist es möglich, WM_QUERYENDSESSION Nachrichten an ein Fenster in einem anderen Prozess zu schicken?

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

  •  09-06-2019
  •  | 
  •  

Frage

Ich möchte ein Fenster C ++ Anwendung debuggen ich geschrieben habe, um zu sehen, warum es nicht WM_QUERYENDSESSION reagiert, wie ich es erwarten. Offensichtlich ist es ein wenig schwierig, dies zu tun, indem nur das System herunterzufahren. Gibt es einen Nutzen oder einen Code, den ich verwenden kann mir eine gefälschte WM_QUERYENDSESSION meiner Anwendungsfenster zu senden?

War es hilfreich?

Lösung

Ich habe die Win32 :: GuiTest Perl-Modul zu tun, um diese Art der Sache in der Vergangenheit verwendet.

Andere Tipps

Der Windows API Sendmessage kann verwendet werden, um dies zu tun. http://msdn.microsoft.com/en-us /library/ms644950(VS.85).aspx

Ti möglich es reagiert nicht, weil einige andere laufende Prozess mit einer Null reagiert hat (was das System auf sie warten.)

Ja natürlich, es möglich. Ich stand vor einem ähnliches Problem vor einigen Monaten, wo einig (unbekannt, aber wahrscheinlich von mir) app Herunterfahren wurde verhindert, so schrieb ich ein paar schnellen Code, EnumWindows verwendet, um all Top-Level-Fenster aufzuzählen, schickte jeder eine WM_QUERYENDSESSION Nachricht, festgestellt, was die Rückkehr Wert von Sendmessage war und stoppte die Aufzählung, wenn jemand FALSCH zurückgegeben. Es dauerte etwa zehn Minuten in C ++ / MFC. Das war die Eingeweide davon:

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 war nur eine lokale Kopie des dieser Zeigers des Dialogs, so dass die Helfer Rückruf auf sie zugreifen kann. Ich habe dir gesagt, es ist schnell und schmutzig: -)

Ja. Wenn Sie den Fenstergriff bekommen (vielleicht mit Findwindow ()), können Sie senden / schreiben jede Nachricht es, solange die WPARAM & LPARAM sind keine Zeiger.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top