Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ::PostMessage不';当我进入另一个程序时,我不能工作_C++_Mfc - Fatal编程技术网

C++ ::PostMessage不';当我进入另一个程序时,我不能工作

C++ ::PostMessage不';当我进入另一个程序时,我不能工作,c++,mfc,C++,Mfc,在我们的程序中,我们有一个从单独的dll打开的对话框来显示信息。当系统计时器导致系统锁定时,我需要关闭此对话框 我通过在MainFrm和EditDisplayDll中注册系统消息来向dll发送信息 SYSTEMLOCK=RegisterWindowMessage(“SYSTEMLOCK”) 当我通过 ::PostMessage(GetActiveWindow()->m_hWnd,SYSTEMLOCK,0,0) 消息正确发送到我的EditDisplayDll,并在系统锁定时关闭对话框;但是,如果我

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

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

SYSTEMLOCK=RegisterWindowMessage(“SYSTEMLOCK”)

当我通过

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

消息正确发送到我的EditDisplayDll,并在系统锁定时关闭对话框;但是,如果我在等待超时时使用alt tab并使用其他程序(firefox、outlook等),则消息永远不会正确调用EditDisplayDll。在任何情况下,
MainFrm
MainFrm
内的其他窗口都会正确锁定和隐藏

我还尝试将HWND_广播与
PostMessage
SendNotifyMessage
一起使用。我还尝试使用
FindWindow()
FindWindowEx()
专门调用EditDisplayDll

我不能使用类似于
GetDlgItem()
的东西,因为我的
MainFrm.cpp
没有访问此dll的权限

我之所以决定使用
GetActiveWindow()
,是因为我相信无论我在哪个窗口中,它都会查看特定于我的程序的窗口,如图所示

最后,我的问题是,是否有一种方法可以调用程序中的所有窗口,无论我当前在哪个程序中,或者是否有另一种方法可以访问EditDisplayDll的特定IDD,以便向其发送
SYSTEMLOCK
消息

CWnd*CWnd=FindWindow(_T(“EditDisplay”),_T(“EditDisplay”);HWND hwnd=(hwnd)cwnd

您应该使用win32 API::FindWindow和适当的类、窗口名。并且不要将CWnd指针强制转换为HWND。您的代码应该如下所示:

HWND hWnd = ::FindWindow(_T("ProperClass"), _T("ProperNmae"));
if (hWnd != NULL)
{
  ::PostMessage(hWnd, YOUR_MESSAGE, ....);
}
我建议您使用Spy++查找Dll窗口类和名称,然后尝试使用上述方法查找。请记住,对于此类任务,最好使用本机API

CWnd*CWnd=FindWindow(_T(“EditDisplay”),_T(“EditDisplay”);HWND hwnd=(hwnd)cwnd

您应该使用win32 API::FindWindow和适当的类、窗口名。并且不要将CWnd指针强制转换为HWND。您的代码应该如下所示:

HWND hWnd = ::FindWindow(_T("ProperClass"), _T("ProperNmae"));
if (hWnd != NULL)
{
  ::PostMessage(hWnd, YOUR_MESSAGE, ....);
}
我建议您使用Spy++查找Dll窗口类和名称,然后尝试使用上述方法查找。请记住,对于此类任务,最好使用本机API

CWnd*CWnd=FindWindow(_T(“EditDisplay”),_T(“EditDisplay”);HWND hwnd=(hwnd)cwnd

您应该使用win32 API::FindWindow和适当的类、窗口名。并且不要将CWnd指针强制转换为HWND。您的代码应该如下所示:

HWND hWnd = ::FindWindow(_T("ProperClass"), _T("ProperNmae"));
if (hWnd != NULL)
{
  ::PostMessage(hWnd, YOUR_MESSAGE, ....);
}
我建议您使用Spy++查找Dll窗口类和名称,然后尝试使用上述方法查找。请记住,对于此类任务,最好使用本机API

CWnd*CWnd=FindWindow(_T(“EditDisplay”),_T(“EditDisplay”);HWND hwnd=(hwnd)cwnd

您应该使用win32 API::FindWindow和适当的类、窗口名。并且不要将CWnd指针强制转换为HWND。您的代码应该如下所示:

HWND hWnd = ::FindWindow(_T("ProperClass"), _T("ProperNmae"));
if (hWnd != NULL)
{
  ::PostMessage(hWnd, YOUR_MESSAGE, ....);
}
我建议您使用Spy++查找Dll窗口类和名称,然后尝试使用上述方法查找。请记住,对于此类任务,最好使用本机API

如果您同时知道窗口名称和元素名称,则是一个很好的解决方案。
如果要获取窗口的
HWND
(窗口中没有元素),可以将其作为第一个参数
NULL
传递

::FindWindow(NULL, _T("WindowName"));
回到您的代码:如果幸运的话,您什么也不做,否则活动窗口可能会捕获您的消息。谁知道如何/是否在活动窗口中处理?如果您有有效的from或,请使用。
如果您想从
HWND
中获得
CWnd
,请查看。(通话可能很慢)

如果您同时知道窗口名和元素名,这是一个很好的解决方案。
如果要获取窗口的
HWND
(窗口中没有元素),可以将其作为第一个参数
NULL
传递

::FindWindow(NULL, _T("WindowName"));
回到您的代码:如果幸运的话,您什么也不做,否则活动窗口可能会捕获您的消息。谁知道如何/是否在活动窗口中处理?如果您有有效的from或,请使用。
如果您想从
HWND
中获得
CWnd
,请查看。(通话可能很慢)

如果您同时知道窗口名和元素名,这是一个很好的解决方案。
如果要获取窗口的
HWND
(窗口中没有元素),可以将其作为第一个参数
NULL
传递

::FindWindow(NULL, _T("WindowName"));
回到您的代码:如果幸运的话,您什么也不做,否则活动窗口可能会捕获您的消息。谁知道如何/是否在活动窗口中处理?如果您有有效的from或,请使用。
如果您想从
HWND
中获得
CWnd
,请查看。(通话可能很慢)

如果您同时知道窗口名和元素名,这是一个很好的解决方案。
如果要获取窗口的
HWND
(窗口中没有元素),可以将其作为第一个参数
NULL
传递

::FindWindow(NULL, _T("WindowName"));
回到您的代码:如果幸运的话,您什么也不做,否则活动窗口可能会捕获您的消息。谁知道如何/是否在活动窗口中处理?如果您有有效的from或,请使用。
如果您想从
HWND
中获得
CWnd
,请查看。(通话可能很慢)


使用FindWindow()查找窗口句柄面临什么问题?当我尝试使用
FindWindow()
时,生成会编译,但它从未正确找到EditDisplayDll,因此消息从未发送。您如何调用FindWindow?我尝试的一种方法是'CWnd*CWnd=FindWindow(_T(“EditDisplay”),\u T(“EditDisplay”);HWND HWND=(H