我想调试我编写的Windows C ++应用程序,看看为什么它没有响应WM_QUERYENDSESSION我期望它。 显然,只需关闭系统就可以做到这一点。 我可以使用任何实用程序或代码将自己的假WM_QUERYENDSESSION发送到我的应用程序窗口吗?

===============>>#1 票数:1 已采纳

我过去曾使用Win32 :: GuiTest Perl模块来做这种事情。

===============>>#2 票数:1

Windows API SendMessage可用于执行此操作。 http://msdn.microsoft.com/en-us/library/ms644950(VS.85).aspx

可能它没有响应,因为其他一些正在运行的进程已响应为零(使系统等待它。)

===============>>#3 票数:1

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

===============>>#4 票数:0

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

  ask by Free Wildebeest translate from so

未解决问题?本站智能推荐:

2回复

令人沮丧的处理窗口消息(WM_XX)

我正在尝试使自己成为使用普通WinAPI的GUI库。 但是我发现处理Window Message确实令人沮丧。 例如,我看到将鼠标移到窗口上方时,WM_NCHITTEST将在WM_MOUSEMOVE之前发送给我。 但是,如果我按下左按钮,请四处走动,然后松开左按钮。 然后,我以后只会
1回复

我可以确定哪个进程向我的窗口发送了消息吗?

我有一个窗口,我正在查看使用Spy ++发送给它的消息。 是否可以确定哪个进程向我的窗口发送了给定的消息,如果它确实是从另一个进程发送的?
2回复

子窗口不收到WM_DESTROY?

我将winapi CreateWindowEx打包到一个简单的类中。 由于每个窗口共享相同的wndProc(hwnd,msg,wparam,lparam),因此我将CreateWindowEx创建的每个窗口放入地图中以分发msg,如下所示: 并且每次销毁窗口或其父窗口时,请将其从地图中
2回复

接收来自其他进程的消息

我一直在教自己如何在Window的API中使用消息,并且实际上在学习它们方面做得非常好。 问题是,我不知道如何从另一个应用程序接收消息以在我的内部启动代码。 本质上,我想做的是允许其他使用商业应用程序的用户单击“保存”按钮(在商业应用程序上),并让我的应用程序停止保存消息,提示用户,然后
4回复

C ++-窗口消息循环冻结

我在这里上的这堂课是我在另一堂课的基础上进行的。 它应该能够处理整个创建窗口和其他东西,但是现在似乎陷入了困境。 较旧的版本过去可以正常工作,但我不知道我可能会忘记添加一些内容,导致它像这样挂起。 这是消息循环: 很基本的东西,我不知道为什么,但是它会挂起来...当我运行程序时
1回复

Windows消息队列是否以FIFO方式处理消息?

我假设当我们调用SendMessage和PostMessage ,将以与调用Send/PostMessage相同的顺序处理消息。 但是正如文档所说,如果当前线程是正确的线程, SendMessage将执行该函数。 如果指定的窗口是由调用线程创建的,则该窗口过程将作为子例程立即被调用。
3回复

消息窗口C ++ Win32类/示例

C ++ Win32中是否存在仅消息窗口的类/示例应用程序?
4回复

如何从Google Chrome扩展程序向桌面应用程序发送消息?

我有一个Windows桌面应用程序,必须与我的Chrome扩展程序协同工作。 我可以通过Google Chrome扩展程序以某种方式向我的桌面应用发送消息吗? 我可以使用哪些IPC对象?
1回复

C - WinAPI - 向线程发送消息并等待它

我想在WinAPI中向窗口发送一条消息,在其他线程中创建,然后等待处理此消息。 这可能吗? 提前致谢。
1回复

无限的Windows消息循环

我的程序中有以下消息循环: 这个循环永远不会结束。 即使主窗口消失了,它也永远不会显示消息框。 这是WndProc代码: 有人可以帮我吗? 我实际上是在拔头发。