我正在开发一个库,以便轻松地将媒体播放器与操作中心播放集成。为此,我使用了已知的 Windows 运行时接口
ISystemMediaTransportControls
和 ISystemMediaTransportControls2
。
目前该库可以工作,但我不知道也找不到任何有关如何设置应用程序图标和名称的文档。我要更改的信息可以在下图中看到“Firefox”和图标。
目前,当我添加媒体播放器时,名称和图标默认为最后一个媒体播放器应用程序的名称。所以在这种情况下,它只是显示为 Firefox,即使它实际上是我的应用程序。
我还查看了 Firefox 和 Chromium 的源代码,它们都与系统媒体传输控件集成,但我仍然看不到他们如何设法注册自定义应用程序名称和图标。
以下是我查看过的一些文件:
那么具有媒体传输控件的应用程序如何通知 Windows 它们的名称和图标?
我已经发现,对于任何可能也想了解其工作原理的人来说,回答我自己的问题是一个好主意。
Windows 似乎使用称为
AppUserModelID
的东西来获取应用程序信息。这些是在 Windows 7 中引入的,以便能够识别存储在开始菜单中的应用程序。
AppUserModelID
存储在两个地方:
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 上的以下存储库: