::当我被选中到另一个程序

时间:2015-04-29 20:59:24

标签: c++ mfc

在我们的程序中,我们从一个单独的dll打开一个Dialog来显示信息。当系统计时器导致系统锁定时,我需要关闭此对话框。

我通过在MainFrm和EditDisplayDll中注册系统消息将信息发送到dll

  

SYSTEMLOCK = RegisterWindowMessage(" SystemLock");

当我通过

发送消息时
  

:: PostMessage的(GetActiveWindow() - > m_hWnd,SYSTEMLOCK,0,0);

消息正确发送到我的EditDisplayDll并在系统锁定时关闭对话框;但是,如果我在等待超时时使用alt选项卡并使用另一个程序(firefox,outlook等),则消息永远不会正确调用EditDisplayDll。 MainFrm内的MainFrm和其他窗口正确锁定,并在任何一种情况下隐藏自己。

我也尝试过将HWND_BROADCAST与PostMessageSendNotifyMessage一起使用。我还尝试使用FindWindow()FindWindowEx()来专门调用EditDisplayDll。

我无法使用GetDlgItem()之类的内容,因为我的MainFrm.cpp无法访问此dll。

我决定使用GetActiveWindow()是因为我认为无论我在Foreground Vs Active window

中的图像中看到什么窗口,它都会查找特定于我的程序的窗口

最后,我的问题是,有没有办法在我的程序中调用所有Windows,无论我当前在哪个程序中,或者是否有其他方式可以访问EditDisplayDll的特定IDD以便发送{ {1}}消息给它?

1 个答案:

答案 0 :(得分:1)

如果你知道窗口的名称和元素,那么

FindWindow是一个很好的解决方案 如果您想获得窗口的HWND - 窗口内没有元素 - ,您可以作为第一个参数NULL传递。

::FindWindow(NULL, _T("WindowName"));

返回您的代码:如果您很幸运,PostMessage什么都不做,否则活动窗口可能会捕获您的消息。谁知道如何/在活动窗口中处理它?如果您有PostMessageIsWindow(HWND)的有效FindWindow,请使用FindWindowEx
如果您需要CWnd中的HWND,请查看this。 (电话可能很慢)

HWND hWnd = ::FindWindow(_T("ClassName"), _T("WindowName"));
if (hWnd && IsWindow(hWnd))
{
    ::PostMessage(hWnd, MESSAGE_TO_BE_SEND, lParam_or_Flags);
}