在我们的程序中,我们从一个单独的dll打开一个Dialog来显示信息。当系统计时器导致系统锁定时,我需要关闭此对话框。
我通过在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()
是因为我认为无论我在Foreground Vs Active window
最后,我的问题是,有没有办法在我的程序中调用所有Windows,无论我当前在哪个程序中,或者是否有其他方式可以访问EditDisplayDll的特定IDD以便发送{ {1}}消息给它?
答案 0 :(得分:1)
FindWindow
是一个很好的解决方案
如果您想获得窗口的HWND
- 窗口内没有元素 - ,您可以作为第一个参数NULL
传递。
::FindWindow(NULL, _T("WindowName"));
返回您的代码:如果您很幸运,PostMessage
什么都不做,否则活动窗口可能会捕获您的消息。谁知道如何/在活动窗口中处理它?如果您有PostMessage
或IsWindow(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);
}