::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。 MainFrm
和 MainFrm
内部的其他 windows 在任何一种情况下都正确锁定并隐藏自己。
我也尝试过将 HWND_BROADCAST 与 PostMessage
和 SendNotifyMessage
一起使用。我还尝试使用 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);
}
在我们的程序中,我们从一个单独的 dll 中打开一个对话框来显示信息。当我们的系统计时器导致系统锁定时,我需要关闭此对话框。
我通过在我的 MainFrm 和 EditDisplayDll 中注册系统消息来向 dll 发送信息
SYSTEMLOCK = RegisterWindowMessage("SystemLock");
当我通过
发送消息时::PostMessage(GetActiveWindow()->m_hWnd,SYSTEMLOCK,0,0);
消息正确发送到我的 EditDisplayDll 并在系统锁定时关闭对话框;但是,如果我在等待超时时使用 alt 选项卡并使用另一个程序(firefox、outlook 等),则该消息永远不会正确调用 EditDisplayDll。 MainFrm
和 MainFrm
内部的其他 windows 在任何一种情况下都正确锁定并隐藏自己。
我也尝试过将 HWND_BROADCAST 与 PostMessage
和 SendNotifyMessage
一起使用。我还尝试使用 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);
}