Вопрос:

Как скрыть кнопку приложения firemonkey с панели задач (XE4)?

windows delphi delphi-xe3 firemonkey-fm2 delphi-xe4

4154 просмотра

4 ответа

2238 Репутация автора

В соответствии с этим вопросом можно скрыть значок панели задач fmx, изменив стиль окна на WS_EX_TOOLWINDOW . В XE2 и XE3 этот код работает:

uses FMX.Platform.Win, Winapi.Windows;

procedure TForm1.Button1Click(Sender: TObject);
var h:THandle;
begin
  h := FmxHandleToHWND(Handle);
  ShowWindow(h, SW_HIDE);
  SetWindowLong(h, GWL_EXSTYLE, GetWindowLong(h, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
  ShowWindow(h, SW_SHOW);
end;

В XE4 это решение не работает (кнопка приложения должна стать скрытой, но ничего не происходит). любое тело есть идеи?

Благодарю.

Автор: mh taqia Источник Размещён: 27.05.2013 08:17

Ответы (4)


2 плюса

21 Репутация автора

Похоже, что в приложениях XE4 FM больше нет дескриптора для объекта приложения. Итак, нам нужно получить родителя основной формы. Ниже два небольших метода, чтобы скрыть / показать ваше приложение на панели задач.

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));
  ShowWindow(AppHandle, SW_HIDE);
  SetWindowLong(AppHandle, GWL_EXSTYLE, GetWindowLong(AppHandle, GWL_EXSTYLE) and (not WS_EX_TOOLWINDOW));
  ShowWindow(AppHandle, SW_SHOW);
end;

Мы могли бы также использовать «Application.MainForm» вместо передачи основной формы, но эта переменная не присваивается во время события «OnCreate» основной формы.

Таким образом, в вашем «OnCreate» Event вне вашей основной формы вы можете просто написать:

procedure TMyMainForm.FormCreate(Sender: TObject);
begin
  HideAppOnTaskbar (self);
end;
Автор: Nicki Размещён: 05.06.2013 01:02

0 плюса

2238 Репутация автора

Решение
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);
Автор: mh taqia Размещён: 10.12.2013 03:06

0 плюса

1 Репутация автора

procedure HideAppOnTaskbar;
var
  appHandle: HWND;
  pid, current_pid: DWORD;
  name: String;

begin
  //ShowWindow(FindWindowA('TFMAppClass', nil), SW_HIDE);

  name := ChangeFileExt(ExtractFileName(ParamStr(0)), '');

  appHandle := 0;
  pid := 0;
  current_pid := GetCurrentProcessId();
  repeat
  begin
    //appHandle := FindWindowExA(0, appHandle, 'TFMAppClass', nil);
    appHandle := FindWindowExA(0, appHandle, 'TFMAppClass', PAnsiChar(AnsiString(name)));
    if (appHandle>0) then
    begin
      GetWindowThreadProcessId(appHandle, pid);
      if (current_pid = pid) then break;
    end;
  end
  until (appHandle>0);

  //SetParent(FmxHandleToHWND(Handle), nil);
  ShowWindow(appHandle, SW_HIDE);

end;
Автор: user3523998 Размещён: 11.04.2014 01:47

3 плюса

31 Репутация автора

Просто попробовал это в XE7 и конечно не получилось. Однако небольшой взгляд на FMX.PlatformWin показывает, что дескриптор приложения теперь доступен через функцию ApplicationHWND, поэтому код, работающий на XE7 (не забудьте включить unit FMX.Platform.Winи Winapi.Windows), ...

procedure HideAppOnTaskbar (AMainForm : TForm);
var
  AppHandle : HWND;
begin
  AppHandle := ApplicationHWND; 
  ShowWindow(AppHandle, SW_HIDE);
  SetWindowLong(AppHandle, GWL_EXSTYLE, GetWindowLong(AppHandle, GWL_EXSTYLE) and (not     WS_EX_APPWINDOW) or WS_EX_TOOLWINDOW);
  //ShowWindow(AppHandle, SW_SHOW);
end;

ShowWindow в конце не является обязательным - кажется, нет никакой разницы. Вы можете удалить расширенные стили и восстановить стиль WS_EX_APPWINDOW, чтобы снова отобразить значок панели инструментов.

Автор: Steve Swallow Размещён: 08.10.2014 02:07
Вопросы из категории :
32x32