Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Исправление Бага С Скрытием Кнопки Приложения в Taskbar в Delphi XE4

Delphi , ОС и Железо , Windows

Вопрос о скрытии кнопки приложения в Taskbar является актуальным для разработчиков, использующих технологию FireMonkey в среде Delphi. В версиях XE2 и XE3 для этого использовался код, который изменял стиль окна на __WS_EX_TOOLWINDOW и тем самым скрывал кнопку приложения в панели задач. Однако, начиная с версии XE4, данный подход перестал работать.

Описание проблемы

В версии Delphi XE4, несмотря на попытки изменить стиль окна, кнопка приложения в Taskbar оставалась видимой. Это было воспринято как баг, поскольку ранее работающий код перестал выполнять свои функции.

Альтернативное решение

После исследования проблемы было найдено решение, которое заключается в следующем:

  1. Необходимо получить родительский элемент основной формы приложения.
  2. Скрыть приложение на панели задач, используя полученный родительский элемент.

Пример кода для скрытия приложения:

procedure HideAppOnTaskbar(AMainForm: TForm);
var
  AppHandle: HWND;
begin
  AppHandle := GetParent(FmxHandleToHWND(AMainForm.Handle));
  ShowWindow(AppHandle, SW_HIDE);
  SetWindowLong(AppHandle, GWL_EXSTYLE, GetWindowLong(AppHandle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
end;

И для показа приложения:

procedure ShowAppOnTaskbar(AMainForm: TForm);
var
  AppHandle: HWND;
begin
  AppHandle := GetParent(FmxHandleToHWND(AMainForm.Handle));
  SetWindowLong(AppHandle, GWL_EXSTYLE, GetWindowLong(AppHandle, GWL_EXSTYLE) and (not WS_EX_TOOLWINDOW));
  ShowWindow(AppHandle, SW_SHOW);
end;

В событии OnCreate основной формы можно вызвать процедуру HideAppOnTaskbar для скрытия кнопки приложения в Taskbar:

procedure TMyMainForm.FormCreate(Sender: TObject);
begin
  HideAppOnTaskbar(self);
end;

Подтвержденное решение

В качестве подтвержденного решения было предложено использовать следующий код:

HWND hWnd := NULL;
DWORD pid, current_pid := GetCurrentProcessId();
do
{
    hWnd := FindWindowExA(NULL, hWnd, "TFMAppClass", NULL);
    if(hWnd)
    {
        GetWindowThreadProcessId(hWnd, &pid);
        if(current_pid = pid) break;
    }
} while(hWnd);

SetParent(FmxHandleToHWND(Handle), NULL);
ShowWindow(hWnd, SW_HIDE);

Этот код ищет окно с классом "TFMAppClass" и скрывает его, если оно принадлежит текущему процессу.

Важные замечания

  • В коде необходимо учитывать, что FindWindow может скрыть первое найденное окно с указанным классом, что может быть нежелательно, если запущено несколько приложений.
  • Для повышения безопасности и точности рекомендуется использовать EnumWindows() для перебора окон.
  • В более новых версиях Delphi (например, XE7) используется функция ApplicationHWND для получения дескриптора окна приложения.

Заключение

Используя предложенные методы, разработчики могут скрыть кнопку приложения в Taskbar для приложений, созданных с использованием FireMonkey в Delphi XE4. Важно отметить, что с обновлением версий Delphi могут появляться новые способы решения подобных задач, и рекомендуется следить за обновлениями и документацией.

Создано по материалам из источника по ссылке.

Вопрос касается решения проблемы с скрытием кнопки приложения в панели задач (Taskbar) в среде разработки Delphi XE4, когда ранее работавший метод перестал быть эффективным из-за изменений в версии.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 01:30:06/0.0032129287719727/0