Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   C++ TrackPopupMenu im WinThread bzw. per Timer schließen ??? (https://www.delphipraxis.net/120163-trackpopupmenu-im-winthread-bzw-per-timer-schliessen.html)

Orakel-von-Delphi 6. Sep 2008 13:00


TrackPopupMenu im WinThread bzw. per Timer schließen ???
 
Hallo Gemeinde !

Gibt es eine Möglichkeit ein TrackPopupMenu innerhalb eines Threads zu öffnen (meine Versuche schlugen leider fehl) od. das TrackPopupMenu nach einiger Zeit über ein bestimmes Kommando seitens eines Timers/Threads dazu zu bringen, dass es sich schließt ?

Das Senden von WM_CANCELMODE generiert zwar eine Nachricht WM_EXITMENULOOP und der Popup schließt sich, aber die Funktion TrackPopupMenu kommt trotzdem nicht zurück ...

Hat jemand eine Idee ?

Edit:

http://www.codeguru.com/forum/showthread.php?t=162333

Hier gibet leider keine Antwort :(

Orakel-von-Delphi 11. Sep 2008 20:22

Re: TrackPopupMenu im WinThread bzw. per Timer schließen ???
 
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".


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz