::PostMessage 在我切换到另一个程序时不起作用

::PostMessage doesn't work when I am tabbed in to another program

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

我通过在我的 MainFrm 和 EditDisplayDll 中注册系统消息来向 dll 发送信息

SYSTEMLOCK = RegisterWindowMessage("SystemLock");

当我通过

发送消息时

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

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

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

我不能使用 GetDlgItem() 之类的东西,因为我的 MainFrm.cpp 无权访问此 dll。

我决定使用 GetActiveWindow() 是因为我相信它看起来 windows 特定于我的程序,无论 window 我在 Foreground Vs Active window 中的图像中看到什么=]

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

CWnd *cWndED = FindWindow(_T("EditDisplay"),_T("EditDisplay")); HWND hwnd = (HWND)cWndED;

您应该使用 win32 API ::FindWindow 并使用适当的 class、window 名称。并且不要将 CWnd 指针转换为 HWND。您的代码应如下所示:

HWND hWnd = ::FindWindow(_T("ProperClass"), _T("ProperNmae"));
if (hWnd != NULL)
{
  ::PostMessage(hWnd, YOUR_MESSAGE, ....);
}

我建议您使用 Spy++ 找到您的 Dll window class 和名称,然后尝试使用上述方法找到它。请记住,对于此类任务,最好使用本机 API。

FindWindow 如果您同时知道 window 和元素的名称,那么这是一个很好的解决方案。
如果您想获得 window 的 HWND - window 中没有元素 - 您可以将 NULL.

作为第一个参数传递
::FindWindow(NULL, _T("WindowName"));

回到您的代码:如果幸运的话,您的 PostMessage 什么都不做,否则活动的 window 可能会收到您的消息。谁知道 how/if 它是在活动 window 中处理的?如果您有来自 FindWindow[ 的有效 IsWindow(HWND),请使用 PostMessage =19=].
如果您想要 HWND 中的 CWnd,请查看 this。 (调用可能会很慢)

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