3

According to this question it is possible to hide fmx taskbar icon by changing window style to WS_EX_TOOLWINDOW. In XE2 and XE3 this code works:

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;

In XE4 this solution does not work (application button should become hidden but nothing happens). any body have any idea?

Thanks.

4

5 回答 5

4

刚刚在 XE7 中尝试过,当然它没有用。然而,稍微看一下 FMX.PlatformWin 显示应用程序句柄现在通过 ApplicationHWND 函数公开,所以在 XE7 上工作的代码(不要忘记包含 unitFMX.Platform.WinWinapi.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 样式以再次显示工具栏图标。

于 2014-10-08T14:07:58.227 回答
2

似乎在 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”事件中,您可以简单地编写:

procedure TMyMainForm.FormCreate(Sender: TObject);
begin
  HideAppOnTaskbar (self);
end;
于 2013-06-05T13:02:29.917 回答
0
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;
于 2014-04-11T13:47:17.003 回答
0
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);
于 2013-12-10T15:06:44.433 回答
0

这适用于 Delphi 10.3,它也可能适用于其他版本。

我不知道您是否注意到,但每当您的代码到达FormCreate过程时,您的 FMX 应用程序将已经创建了一个任务栏按钮,至少在 Delphi 10.3.3 Rio 上,这是我们可能不喜欢的。因此,如果您使用建议的方法,您的应用程序将在任务栏中快速显示其图标以隐藏它。

因此,如果您可以访问 Delphi 的 VCL/FMX 源代码文件,并且您不喜欢显示您的应用程序任务栏图标甚至一毫秒,您只需要修改FMX.Platform.Win.pas位于c:\Program Files (x86)\Embarcadero\Studio\20.0\source\fmx\目录中的文件,然后将其复制到您的项目目录,所以它将被选择而不是原来的,并CreateAppHandle按照以下建议修改函数:

function TPlatformWin.CreateAppHandle: HWND;
var
 ...
begin
  ...
  Result := CreateWindowEx(WS_EX_WINDOWEDGE or WS_EX_APPWINDOW, FMAppClass.lpszClassName, PChar(FTitle),
                           WS_POPUP or WS_GROUP, 0, 0, 0, 0, GetDesktopWindow, 0, hInstance, nil);
  if FApplicationHWND = 0 then // modified/added line
    Winapi.Windows.ShowWindow(Result, SW_HIDE) // modified/added line
  else // modified/added line
    Winapi.Windows.ShowWindow(Result, SW_SHOWNORMAL);
end;   

就是这样,您不需要其他方法,请注意它也CreateWindowEx传递了窗口的样式,如果您也想将其从 Alt-Tab 列表中隐藏,请替换WS_EX_APPWINDOWWS_EX_TOOLWINDOW

于 2021-01-25T05:06:45.377 回答