Re: BringWindowToTop: "Simulate" "ALT-Tab" keys
"Guido Franzke" <guidof73@yahoo.de> wrote in message
news:uyE5AM8lHHA.3704@TK2MSFTNGP02.phx.gbl...
Hi David,
thanks for your thoughts.
Sure!
I'm sorry, I can't change the size of my application A. The dialog is not
maximized with a system command but set to maximum with SetWindowPos. I
need
the full screen display, since it is running only on laptops with 1024*768
resolution.
I mean *temporarily to debug* make App A not full screen.
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
ON_REGISTERED_MESSAGE(CApplicationBRegMsg::ANNOUNCE_SERVER_TO_CLIENT,
OnComAnnounceServerToClient)
END_MESSAGE_MAP()
LRESULT CMyDlg::OnComAnnounceServerToClient(WPARAM wParam, LPARAM lParam)
{
m_hApplicationB = (HWND)lParam;
return 0;
}
// this is called from application B after I send the message:
BOOL br = ::PostMessage(HWND_BROADCAST,
CApplicationBRegMsg::ANNOUNCE_CLIENT_TO_SERVER, (WPARAM)NULL,
(LPARAM)GetSafeHwnd());
// now, I know the HWND of application B
---------->
OK, so m_hApplicationB is the HWND you send WM_COPYDATA messages to.
// to minimize, I must do the following:
BOOL bRC = false;
COPYDATASTRUCT cpd;
cpd.dwData = ApplicationB_MINIMIZE;
cpd.cbData = 0;
cpd.lpData = 0;
bRC = ::SendMessage(m_hApplicationB, WM_COPYDATA, (WPARAM)NULL,
(LPARAM)&cpd);
// to maximize the same, but now I must repaint the window on top of my
dialog application A
void CMyDlg:: maximizeAppB()
{
BOOL bRC = false;
COPYDATASTRUCT cpd;
cpd.dwData = ApplicationB_MAXIMIZE;
cpd.cbData = 0;
cpd.lpData = 0;
bRC = ::SendMessage(m_hServer, WM_COPYDATA, (WPARAM)NULL, (LPARAM)&cpd);
What is m_hServer? Don't you mean m_hApplicationB?
Sleep(2000); // wait, until app B is maximized
Using Sleep() causes nothing but problems since you don't know how long to
sleep that will work on all systems. This announces this code is a hack
(but we already knew that!) ;)
::SetForegroundWindow(m_hApplicationB);
::BringWindowToTop(m_hApplicationB);
::SetActiveWindow(m_hApplicationB);
// ::RedawWindow(m_hApplicationB, NULL,NULL, RDW_INTERNALPAINT);
// ::RedawWindow(m_hApplicationB, NULL,NULL, RDW_ERASE | RDW_INVALIDATE);
}
I think m_hApplicationB is *not* the visible window; it is simply a hidden
window you send WM_COPYDATA messages to which internally controls the real
visible window. Use Spy++ to verify.
-- David