当我同时使用VCL和FMX时,如何删除任务栏上的附加图标?

时间:2016-06-11 06:50:07

标签: delphi firemonkey vcl delphi-xe8

如果您默认创建Delphi VCL应用程序,则会有一个VCL表单,如果您运行应用程序,则任务栏上只有一个图标。之后,如果添加FMX表单,您可以同时拥有这两个表单并使用它们。但是在应用程序运行时的任务栏中有两个图标。反正有没有删除它的标题是项目名称并保留另一个是你的主要形式的那个?

我正在使用delphi XE8。

1 个答案:

答案 0 :(得分:1)

我找到了答案。这很有趣。大约2天我正在搜索但没有成功我在发布问题后找到了答案。我自己回答它可能对另一个人有用。

我在此页面上找到了此代码 https://github.com/vintagedave/firemonkey-container/blob/master/Parnassus.FMXContainer.pas

function EnumWindowCallback(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
const
  FMXClassName = 'TFMAppClass';
var
  ProcessID : DWORD;
  ClassName : string;
  ClassNameLength : NativeInt;
begin
  // XE4 (possibly others) show a phantom TFMAppClass window on the taskbar.  Hide it.
  // Ensure the one we hide belongs to this thread / process - don't damage other FMX apps
  if (GetWindowThreadProcessId(hWnd, ProcessID) = GetCurrentThreadId) and (ProcessID = GetCurrentProcessId) then begin
    // Thanks to the ubiquitous David Heffernan... http://stackoverflow.com/questions/7096542/collect-all-active-window-class-names
    SetLength(ClassName, 256);
    ClassNameLength := GetClassName(hWnd, PChar(ClassName), Length(ClassName));
    if ClassNameLength = 0 then RaiseLastOSError;
    SetLength(ClassName, ClassNameLength);
    if ClassName = FMXClassName then begin
      // Found.  Hide it, and return false to stop enumerating
      ShowWindow(hWnd, SW_HIDE);
      Exit(False);
    end;
  end;
  Result := True; // Fallthrough, keep iterating
end;

如果使用以下代码来使用它,任务栏上的其他图标将被隐藏

  EnumWindows(@EnumWindowCallback, 0);