C++ ::PostMessage不';当我进入另一个程序时,我不能工作
在我们的程序中,我们有一个从单独的dll打开的对话框来显示信息。当系统计时器导致系统锁定时,我需要关闭此对话框 我通过在MainFrm和EditDisplayDll中注册系统消息来向dll发送信息 SYSTEMLOCK=RegisterWindowMessage(“SYSTEMLOCK”) 当我通过 ::PostMessage(GetActiveWindow()->m_hWnd,SYSTEMLOCK,0,0) 消息正确发送到我的EditDisplayDll,并在系统锁定时关闭对话框;但是,如果我在等待超时时使用alt tab并使用其他程序(firefox、outlook等),则消息永远不会正确调用EditDisplayDll。在任何情况下,C++ ::PostMessage不';当我进入另一个程序时,我不能工作,c++,mfc,C++,Mfc,在我们的程序中,我们有一个从单独的dll打开的对话框来显示信息。当系统计时器导致系统锁定时,我需要关闭此对话框 我通过在MainFrm和EditDisplayDll中注册系统消息来向dll发送信息 SYSTEMLOCK=RegisterWindowMessage(“SYSTEMLOCK”) 当我通过 ::PostMessage(GetActiveWindow()->m_hWnd,SYSTEMLOCK,0,0) 消息正确发送到我的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