Скрыть кнопку панели задач в FMX в Windows - PullRequest
0 голосов
/ 13 декабря 2018

Я хочу иметь возможность удалить кнопку моего приложения Win32 с панели задач.Я также хочу иметь возможность добавить его позже.Как это может быть сделано?Я нашел такой подход , но он написан на Delphi, и вместо этого я использую C ++.

Я пытался изменить этот код , изменив одну строку кода Реми.от:

SetWindowLong(hWnd, GWL_EXSTYLE, Style | WS_EX_APPWINDOW); 

до

SetWindowLong(hWnd, GWL_EXSTYLE, Style | WS_EX_TOOLWINDOW);

Но это не работает, кнопка все еще находится на панели задач.

ОБНОВЛЕНИЕ: код, который я использую(конечно, это произошло от Реми):

void __fastcall TForm1::CreateHandle()   // this is code from Remy i added to help me trap screen lock
{
 TForm::CreateHandle();

 HWND hWnd = Fmx::Platform::Win::FormToHWND(this);
 if (SetWindowSubclass(hWnd, &SubclassWndProc, 1, reinterpret_cast<DWORD_PTR>(this)))
 {
    MonitoringWTS = WTSRegisterSessionNotification(hWnd, NOTIFY_FOR_THIS_SESSION);
    if (!MonitoringWTS)
        RemoveWindowSubclass(hWnd, &SubclassWndProc, 1);
 }
 else {
    MonitoringWTS = false;
 }

 if (hWnd != NULL)   // this code added from https://stackoverflow.com/questions/28929163/how-to-show-a-secondary-form-on-taskbar-using-fmx-c
 {
 LONG Style = GetWindowLong(hWnd, GWL_EXSTYLE); // <-- don't forget this step!
 SetWindowLong(hWnd, GWL_EXSTYLE, Style | WS_EX_APPWINDOW);
 }
}

Использование C ++ Builder 10.2 версии 25.0.31059.3231.

1 Ответ

0 голосов
/ 13 декабря 2018

Недостаточно просто добавить стиль WS_EX_TOOLWINDOW, если вы также оставите стиль по умолчанию WS_EX_APPWINDOW на месте.Попробуйте использовать это вместо:

LONG_PTR ExStyle = GetWindowLongPtr(hWnd, GWL_EXSTYLE);
SetWindowLongPtr(hWnd, GWL_EXSTYLE, (Style & ~WS_EX_APPWINDOW) | WS_EX_TOOLWINDOW);

Хотя, более простой способ заставить TForm вести себя как окно инструмента - это просто установить его свойство BorderStyle в bsToolWindow или bsSizeToolWin.

Однако обратите внимание, что в XE7 + вы должны использовать ApplicationHWND(), чтобы получить HWND, который фактически находится на панели задач, поскольку может отличаться от TForm окно.Это было даже указано в ответе на вопрос, который вы отклонили только потому, что он был написан на Delphi вместо C ++.Соответствующие вызовы функций не меняются, только синтаксис кода.

Попробуйте это:

#include <FMX.Platform.Win.hpp>
#include <Winapi.Windows.hpp>

void HideAppOnTaskbar()
{
    HWND hAppWnd = Fmx::Platform::Win::ApplicationHWND();
    ShowWindow(hAppWnd, SW_HIDE);
    LONG_PTR ExStyle = GetWindowLongPtr(hAppWnd, GWL_EXSTYLE);
    SetWindowLongPtr(hAppWnd, GWL_EXSTYLE, (ExStyle & ~WS_EX_APPWINDOW) | WS_EX_TOOLWINDOW);
    //ShowWindow(hAppWnd, SW_SHOW);
}

void ShowAppOnTaskbar()
{
    HWND hAppWnd = Fmx::Platform::Win::ApplicationHWND();
    ShowWindow(hAppWnd, SW_HIDE);
    LONG_PTR ExStyle = GetWindowLongPtr(hAppWnd, GWL_EXSTYLE);
    SetWindowLongPtr(hAppWnd, GWL_EXSTYLE, (ExStyle & ~WS_EX_TOOLWINDOW) | WS_EX_APPWINDOW);
    ShowWindow(hAppWnd, SW_SHOW);
}

void __fastcall TForm1::CreateHandle()
{
    //...
    HideAppOnTaskbar(); // or ShowAppOnTaskbar(), as needed
}
...