[英]::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
正确地锁定和隐藏自己在这两种情况下。
我也尝试过将HWND_BROADCAST与PostMessage
和SendNotifyMessage
。 我也尝试过使用FindWindow()
和FindWindowEx()
专门调用EditDisplayDll。
我不能使用GetDlgItem()
类的东西,因为MainFrm.cpp
无法访问此dll。
我决定使用GetActiveWindow()
原因是,我相信无论我身在哪个窗口(无论是在前景Vs活动窗口中的图像中看到的那样GetActiveWindow()
,它都可以查看程序的特定窗口
最后,我的问题是,无论我当前在哪个程序中,是否都可以调用程序中的所有Windows,或者是否可以通过另一种方式访问EditDisplayDll的特定IDD以便向其发送SYSTEMLOCK
消息。 ?
CWnd * cWndED = FindWindow(_T(“ EditDisplay”),_ T(“ EditDisplay”)); HWND hwnd =(HWND)cWndED;
您应该将Win32 API :: FindWindow与正确的类,窗口名称一起使用。 并且不要将CWnd指针转换为HWND。 您的代码应如下所示:
HWND hWnd = ::FindWindow(_T("ProperClass"), _T("ProperNmae"));
if (hWnd != NULL)
{
::PostMessage(hWnd, YOUR_MESSAGE, ....);
}
我建议您使用Spy ++查找Dll窗口类和名称,然后尝试使用上述方法查找。 请记住,对于此类任务,最好使用本机API。
如果您同时知道窗口名称和元素,则FindWindow
是一个很好的解决方案。
如果要获取窗口的HWND
(窗口内没有元素),则可以将其作为第一个参数NULL
传递。
::FindWindow(NULL, _T("WindowName"));
返回您的代码:如果您很幸运, PostMessage
不会执行任何操作,否则活动窗口可能会捕获您的消息。 谁知道如何/是否在活动窗口中对其进行处理? 如果您具有来自FindWindow
或FindWindowEx
的有效IsWindow(HWND)
,请使用PostMessage
。
如果您希望从HWND
获得CWnd
,请查看此 。 (通话速度可能很慢)
HWND hWnd = ::FindWindow(_T("ClassName"), _T("WindowName"));
if (hWnd && IsWindow(hWnd))
{
::PostMessage(hWnd, MESSAGE_TO_BE_SEND, lParam_or_Flags);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.