Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检测字体的添加、删除或更改时间?_C#_Wpf_Fonts - Fatal编程技术网

C# 如何检测字体的添加、删除或更改时间?

C# 如何检测字体的添加、删除或更改时间?,c#,wpf,fonts,C#,Wpf,Fonts,这不同于检测是否安装了字体。我正在制作一个WPF应用程序,我希望该应用程序能够对用户实时安装或卸载字体做出反应。我该怎么做?例如,是否有任何方法可以与Windows字体缓存服务交互?可能是两种方法之一 最黑客的方法可能是监视%windir%\font文件夹,但是您无法保证它们已加载资源且可用 编写一个dll注入单元来钩住并代理AddFontResource/AddFontResourceExApi调用,这样您就知道什么时候加载了字体资源 您可能会发现这有助于理解字体是如何加载到系统中的 应用程

这不同于检测是否安装了字体。我正在制作一个WPF应用程序,我希望该应用程序能够对用户实时安装或卸载字体做出反应。我该怎么做?例如,是否有任何方法可以与Windows字体缓存服务交互?

可能是两种方法之一

  • 最黑客的方法可能是监视
    %windir%\font
    文件夹,但是您无法保证它们已加载资源且可用

  • 编写一个dll注入单元来钩住并代理
    AddFontResource
    /
    AddFontResourceEx
    Api调用,这样您就知道什么时候加载了字体资源

  • 您可能会发现这有助于理解字体是如何加载到系统中的

    应用程序只能使用字体绘制文本,前提是该字体为 驻留在指定设备上或安装在系统字体表中。 字体表是标识所有非设备的内部数组 应用程序可用的字体。应用程序可以 检索设备上当前安装或存储的字体的名称 通过调用EnumFontFamilies或 选择字体功能


    正如Jimi所建议的,在我的主窗口上监听
    WM_FONTCHANGE
    消息可以让我在添加或删除字体时进行检测

    安装或卸载字体时,您会收到一条消息。未指定字体名称,但您可以在收到邮件时重新填充列表。您还可以使用FileSystemWatcher检测字体文件夹中的更改。但是我从来没有在这个任务中使用过它(我只是使用这个消息),不确定需要什么权限。FileSystemWatcher可以处理Fonts文件夹,当创建或删除每个字体文件时,您会收到通知。