Meine Lösung:
Auf den Event WM_ENTERMENULOOP hin starte ich einfach einen Thread:
Delphi-Quellcode:
int CCloseTracker::Run()
{
MSG msg;
int iTimer = 0;
int iWaitInterval = 10; /* mSec */
int iMaxWait = 20; /* Sec */
while( TRUE )
{
if( !PeekMessage( &msg, 0, 0, 0xFFFFFFFF, PM_REMOVE) )
{
Sleep(iWaitInterval);
iTimer++;
if( iTimer > iMaxWait * 1000 / iWaitInterval )
break;
else
continue;
}
else
{
switch(msg.message)
{
case WM_QUIT:
TRACE("CCloseTracker: Termination without action !\n");
return 0;
default:;
}
}
}
TRACE("CCloseTracker: Close popup ...\n");
for(int i = 0; i < 4; i++) /* Maximal 4 Level */
{
PostMessage(m_pParent->m_hWnd, WM_KEYDOWN, VK_ESCAPE, 1);
PostMessage(m_pParent->m_hWnd, WM_KEYUP, VK_ESCAPE, 0);
}
return 0;
}
Der sorgt nach 20 sec. dafür, dass sich alles wieder schließt.
Sollte ein WM_EXITMENULOOP eintreten, wird dort der Thread "gekilled".