zamykanie PopupMenu otwartego z TrayIcon'a

zamykanie PopupMenu otwartego z TrayIcon'a
Tasmman
  • Rejestracja:prawie 18 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:Warszawa
  • Postów:13
0

Jest tak, mam TrayIcon i PopupMenu. PopupMenu wywołuje w ten sposób :

Kopiuj
void __fastcall TForm1::TrayIcon1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
    if(Button == mbRight)
    PopupMenu1->Popup(Mouse->CursorPos.x,Mouse->CursorPos.y) ;
}

Teraz jest taki problem, że jak wywołam te menu to nie można go zamknąć, tzn., pykanie myszką w pulpit nic nie powoduje, menu się nie zamyka. Czy należy przechwycić jakiś komunikat o tym, że klikamy myszką w innym miejscu niż na menu i wtedy trzeba je zamknąć ? Jak to zrobić ?

SA
  • Rejestracja:prawie 21 lat
  • Ostatnio:ponad 9 lat
  • Postów:513
0

Przed wyświetleniem popupa należy 'wysunąć' swoje okno na wierzch - SetForegroundWindow(m_hwnd). Nie ważne, że okno nie jest widoczne, ważne jest by ono miało fokus, wtedy każdy klik myszy zostanie wysłany do tego właśnie okna.

Zauważ że jakikolwiek klik w trayu zostaje przechwycony przez shella i to on automatycznie dostaje fokus. Nagle pojawia się menu, user klika sobie na pulpit, system wysyła powiadomienie do aktywnego okna by usunął menu, a w tej chwili fokus ma shell który ignoruje powiadomienie bo przecież to nie on wyświetlił menu.
Ot, taki mały bug, ktoś założył że właścicielem menu zawsze jest aktywne okno.

Tasmman
  • Rejestracja:prawie 18 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:Warszawa
  • Postów:13
0

Wieelkie dzięki, sapero Nawet nie wiesz jak mi pomogłeś.

ZU
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 7 lat
0

ja też, bardzo dziękuje!
akurat nad tym siedzię :)

MacGyver77
  • Rejestracja:ponad 19 lat
  • Ostatnio:ponad 12 lat
0

Kurde balans, dzięki za pomoc!!!

Tyle czasu się z tym męczyłem, jak zamknąć menu popup w tray'u, ciągle zostawało na wierzchu. Kombinowałem [glowa] ale to nic to nie dawało..., kto by na to wpadł, że chodzi o wysnięcie okna. Co prawda siedze w Delphi nie w C+, ale owa linijka "SetForegroundWindow(Form1.Handle)" naprawiła problem [diabel] - jak mawiają diabeł tkwi w szczegółach.

Dzięki Sapero - rozminowałeś problem :)

[browar]

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.