Скрыть кнопку панели задач в 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
}