繁体   English   中英

当我进入另一个程序时,:: 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正确地锁定和隐藏自己在这两种情况下。

我也尝试过将HWND_BROADCAST与PostMessageSendNotifyMessage 我也尝试过使用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不会执行任何操作,否则活动窗口可能会捕获您的消息。 谁知道如何/是否在活动窗口中对其进行处理? 如果您具有来自FindWindowFindWindowEx的有效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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM