Windows 操作中心如何获取播放媒体的应用程序的名称和图标?

问题描述 投票:0回答:1

我正在开发一个库,以便轻松地将媒体播放器与操作中心播放集成。为此,我使用了已知的 Windows 运行时接口

ISystemMediaTransportControls
ISystemMediaTransportControls2

我想做什么

目前该库可以工作,但我不知道也找不到任何有关如何设置应用程序图标和名称的文档。我要更改的信息可以在下图中看到“Firefox”和图标。

目前,当我添加媒体播放器时,名称和图标默认为最后一个媒体播放器应用程序的名称。所以在这种情况下,它只是显示为 Firefox,即使它实际上是我的应用程序。

Example of a player with name and icon

我读过的一些资料来源

我还查看了 Firefox 和 Chromium 的源代码,它们都与系统媒体传输控件集成,但我仍然看不到他们如何设法注册自定义应用程序名称和图标。

以下是我查看过的一些文件:

问题

那么具有媒体传输控件的应用程序如何通知 Windows 它们的名称和图标?

windows delphi winapi windows-runtime c++-winrt
1个回答
0
投票

我已经找到了如何将应用程序图标添加到操作中心

我已经发现,对于任何可能也想了解其工作原理的人来说,回答我自己的问题是一个好主意。

Windows 似乎使用称为

AppUserModelID
的东西来获取应用程序信息。这些是在 Windows 7 中引入的,以便能够识别存储在开始菜单中的应用程序。

AppUserModelID
存储在两个地方:

  • Windows 注册表:
    HKEY_CURRENT_USER\Software\Classes\AppUserModelId\
  • 开始菜单文件夹:
    shell:Start Menu

第一个用于将 Windows 通知发布到操作中心。 梯子用于媒体播放控件,也许还有一些我不知道的其他 Windows 功能。

要注册应用程序的 AppUserModelID,您所需要做的就是在开始菜单文件夹中创建应用程序的快捷方式,并使用一个特殊的不太为人所知的属性。我找到了这个 GitHub 存储库,它展示了如何做到这一点。可以在我下面链接的存储库中找到相同的代码,但在 Pascal 中。

这是一个可以执行此操作的示例函数:

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes,
  ActiveX, ComObj, Winapi.ShlObj, Winapi.PropKey, Winapi.PropSys;

function InstallShortcut(AppUserModelID, ExePath, ShortcutPath, Description, Arguments, IconPath: string; IconIndex: integer): boolean;
var
  newShortcut: IShellLink;

  persistFileSave: IPersistFile;
  newShortcutProperties: IPropertyStore;

  propVariant: TPropVariant;
begin
  newShortcut:= CreateComObject(CLSID_ShellLink) as IShellLink;

  // Add data
  with newShortcut do
  begin
    SetArguments(PChar(Arguments));
    SetDescription(PChar(Description));
    SetPath(PChar(ExePath));
    SetWorkingDirectory(PChar( ExtractFileDir(ExePath) ));

    if IconPath <> '' then
      SetIconLocation(PChar(IconPath), 0);
  end;

  // Property store
  newShortcutProperties := newShortcut as IPropertyStore;

  propVariant.vt := VT_BSTR;
  propVariant.bstrVal := Pchar(AppUserModelID);

  if not Succeeded(newShortcutProperties.SetValue(PKEY_AppUserModel_ID, propVariant)) then
    Exit( false );
  if not Succeeded(newShortcutProperties.Commit) then
    Exit( false );

  // Save
  persistFileSave := newShortcut as IPersistFile;
  Result := Succeeded( persistFileSave.Save(PWChar(WideString(ShortcutPath)), FALSE) );
end;

使用示例:

InstallShortcut('com.example.appname', 'C:\App Name\appfile.exe', 'C:\Users\<username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\App Name.lnk', 'Application Description', '', '', 0);

当然,您需要设置正在运行的应用程序的应用程序用户模型 ID:

SetCurrentProcessExplicitAppUserModelID( 'com.example.appname' );

我还添加了我能够编写的所有内容,以将其与 Delphi 中的类集成,以将媒体传输控件管理到 GitHub 上的以下存储库:

© www.soinside.com 2019 - 2024. All rights reserved.