Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Системное меню минимизированной программы


Автор: gAlexKo 18.2.2019, 16:35
Код

//Образец как создать пункт в системном меню окна программы
const  SC_MyMenuItem = WM_USER + 1;
void __fastcall Tblf::FormCreate(TObject *Sender)
{
  Application->OnMessage = OnAppMessage;
  AppendMenu(GetSystemMenu(Handle, FALSE), MF_SEPARATOR, 0, "");
  AppendMenu(GetSystemMenu(Handle, FALSE), MF_STRING, SC_MyMenuItem, "System menu item demo");
}
//---------------------------------------------------------------------------
void __fastcall Tblf::OnAppMessage(tagMSG &Msg, bool& Handled)
{
  if (Msg.message == WM_SYSCOMMAND && Msg.wParam == SC_MyMenuItem)
   {
     ShowMessage("Got the message");
     Handled = true;
   }
}
//---------------------------------------------------------------------------
----------------------------------------------------------

Все OK, но когда программа минимизирована то меню программы вызванное из заголовка на task bar выглядит по-другому и без пунктов которые я ввел. Как мне побороть и сделать системное меню для минимизированной программы? В смысле как это сделать используя API, без использования классов MFC.

Автор: xvr 18.2.2019, 19:46
Насколько я помню в Билдере top форма на самом деле таковой не является - он делает невидимое top окно и подвязывает формы приложения к нему как дочерние. так что ставьте SystemMenu и для Application->Handle (кажется так до него добраться можно)

Автор: gAlexKo 19.2.2019, 09:10
Цитата(xvr @ 18.2.2019,  19:46)
Насколько я помню в Билдере top форма на самом деле таковой не является - он делает невидимое top окно и подвязывает формы приложения к нему как дочерние. так что ставьте SystemMenu и для Application->Handle (кажется так до него добраться можно)

Да видимо это так, но есть особенность - если просто изменить Handle на Application->Handle, то пунктов не появится при запуске. Но они будут когда программа минимизированна. Я добавил использование обоих Handle и вроде все работает. Окончательно так:

Код

//Образец как создать пункт в системном меню окна программы
void __fastcall Tblf::FormCreate(TObject *Sender)
{
  Application->OnMessage = OnAppMessage;
  AppendMenu(GetSystemMenu(Handle, FALSE), MF_SEPARATOR, 0, "");
  AppendMenu(GetSystemMenu(Handle, FALSE), MF_STRING, SC_MyMenuItem, "System menu item demo");
  AppendMenu(GetSystemMenu(Application->Handle, FALSE), MF_SEPARATOR, 0, "");
  AppendMenu(GetSystemMenu(Application->Handle, FALSE), MF_STRING, SC_MyMenuItem, "System menu item demo");
}
//---------------------------------------------------------------------------
void __fastcall Tblf::OnAppMessage(tagMSG &Msg, bool& Handled)
{
  if (Msg.message == WM_SYSCOMMAND && Msg.wParam == SC_MyMenuItem)
   {
     ShowMessage("Got the message");
     Handled = true;
   }
}
//---------------------------------------------------------------------------


Автор: gAlexKo 26.3.2019, 08:45
Кстати  - этот способ не работает в windows 7. Но в XP работает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)