Целевое окно не отображается для получения WM_FONTCHANGE от SendMessage - PullRequest
0 голосов
/ 20 декабря 2018

Я работал над этим время от времени несколько дней, чтобы добраться до этой точки, но теперь я чувствую, что в конце. Я пытаюсь заставить vscode увидеть мой шрифт, который я не имею прав для установки.

Add-Type -TypeDefinition @'
using System;
using System.Runtime.InteropServices;

public static class Font
{
    public const UInt32 WM_FONTCHANGE = 0x001D;
    public static IntPtr HWND_BROADCAST = new IntPtr(0xFFFF);

    [DllImport("gdi32.dll", EntryPoint="AddFontResourceW", CharSet=CharSet.Unicode)]
    public static extern int AddFontResource(
        [MarshalAs(UnmanagedType.LPWStr)]
        string filePath);

    [DllImport("user32.dll", EntryPoint="SendMessageW", SetLastError=true)]
    public static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
}
'@

# skip the invisible windows
$code = (Get-Process -Name code).Where{$_.MainWindowHandle}.MainWindowHandle
Get-ChildItem -Path '/myfonts/*.ttf' | ForEach-Object {
    if ([Font]::AddFontResource($_.FullName)) {
        $null = [Font]::SendMessage($code, [Font]::WM_FONTCHANGE, 0, 0)
        [System.ComponentModel.Win32Exception]::new(
            [System.Runtime.InteropServices.Marshal]::GetLastWin32Error()
        ).Message
    }
    else {
        Write-Warning -Message "$($_.BaseName) failed to import."
    }
}

Раньше я пытался вещать, но у меня нет прав администратора иЯ думаю, что он пытался транслировать на окна с общими ресурсами (виртуальная среда), поэтому окно просто зависало.Это привело меня к попыткам нацелиться только на vscode и посмотреть, сработает ли это.

...