Скрыть кнопку панели задач в FMX в Windows

Я хочу иметь возможность удалить кнопку моего приложения 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://stackru.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 ответ

Решение

Недостаточно просто добавить 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
}
Другие вопросы по тегам