Windows 11 にアップグレード

Windows 11 にアップグレード した際、困ったこと

10の時から Windows 検索を有効にしていた。

困った1:

11にアプグレ後、Windows Search の「拡張検索からフォルダーを除外する」に、ゴミデータが登録(?)されてしまっていた。

すでに存在しないフォルダや、ゴミ箱の中の(Recycle.bin\S-1-5...)みたいなやつ。ゴミデータを削除してもだめだった。

設定からポチポチ削除しようとすると、設定自体が落ちてしまう。

Windows 検索 自体をリセット

このリンク先の 末尾の方の投稿(2022年7月 の Alex の回答)の通りにしたら解決できた。

superuser.com

指定のレジストリを0にして、検索サービスを再起動。

除外設定がデフォルトの状態になった。


困った2:

11にしたのは、2023/12/12 だったが、バージョンは22H2 だった。

少し前に、23H2 が出ているっぽいけど Windows Update に表示されない。

こちらの記事を参考にグループポリシーから設定変更したら出てきた。

atmarkit.itmedia.co.jp

SymbolThemeFontFamilyを、Win10/11 で切り替えて使う場合の注意

メモ:

Segoe MDL2 アイコン フォント が Windows10で使える。

Segoe Fluent アイコン フォント が Windows11で使える。

Fluent の方は、ダウンロードすればWindows10でも使えるっぽい。

XAMLで記述する際、下記のようにフォントを指定して利用する。

// Win11
<FontIcon FontFamily="Segoe Fluent Icons" Glyph="&#xE700;"/>

// Win10
<FontIcon FontFamily="Segoe MDL2 Assets" Glyph="&#xE700;"/>

下記のようにしておけば、動作するWindows10/11 によって、よしなに切り替えてくれるらしい。

<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="&#xE700;"/>

ただ、Segoe MDL2 にはあるけど、Segoe Fluent には無い、みたいなグリフもあるみたい。

自分の場合、MDL2 で「F614 DoublePortrait」あたりを使っていたけど、Fluent には(2023/8/15時点では)無くて表示されてなかった。

MDL2 :

Fluent :

learn.microsoft.com

learn.microsoft.com

おわり

InDesign2023 プラグイン(Windows用) 作成で遭遇したエラー

InDesign 2023 のプラグインWindows用)のサンプルをビルドしようとした際、最初に躓いたのでメモ。


結論(?):

InDesign SDKでは、Visual Studio 2022 - v17.1.6 を開発環境に指定している。

私の環境では Visual Studio 2022 - v17.6.2 だった。

v17.5の修正が影響してた(と思う。VSのバージョンを戻してまで検証してない)


現象2つ:

エラー C1189 #error: "You need to update xlocnum hack header by copying over the header from your Visual Studio installation and applying the same changes as to the previous versions. Be careful, this header also changes between minor versions of Visual Studio. MSC_VER was: " VALUE_TO_STRING(_MSC_VER) BasicDialog …略…\xlocnum_hack.h 27

SDKで指定された VSのバージョン以外の環境でビルドすると出ることがある。VS2019の時も出た記憶がある。

(自環境のバージョンを上げてしまった場合など。バージョンダウンだと出ないかも?)

community.adobe.com

これを回避したら下記のエラーに変わった。

エラー C2039 'c_str': 'std::locale' のメンバーではありません

…略…\xlocnum_hack_vs2022_17_1.h(157,57): error C2039: 'c_str': 'std::locale' のメンバーではありません

無いの?🙄


回避:

本来なら公式が指定する VS2022 v17.1.6 環境を用意すべきなんだろうけど…。

ちょっと横着して下記で対応した。

1. SDKの中にある xlocnum_hack.h に追記

 #elif _MSC_VER >= 1931 && _MSC_VER < 1932 // VS 2022 version 17.1
    #include "xlocnum_hack_vs2022_17_1.h"
+ #elif _MSC_VER >= 1932 && _MSC_VER < 1935 // VS 2022 version 17.2 - 17.4. "Added for local environment."
+   #include "xlocnum_hack_vs2022_17_1.h"
+ #elif _MSC_VER >= 1935 && _MSC_VER < 1937 // VS 2022 version 17.5 - 17.6(1936).  "Added for local environment."
+   #include "xlocnum_hack_vs2022_17_1_custom.h"
 #else

2. 同じフォルダ内にある xlocnum_hack_vs2022_17_1.h をコピーして xlocnum_hack_vs2022_17_1_custom.h を作成し、下記の書き換え。

    static size_t _Getcat(const locale::facet** _Ppf = nullptr,
        const locale* _Ploc = nullptr) { // return locale category mask and construct standard facet
        if (_Ppf != nullptr && *_Ppf == nullptr) {
-            *_Ppf = new numpunct<_Elem>(_Locinfo(_Ploc->c_str()), 0, true);
+            *_Ppf = new numpunct<_Elem>(_Locinfo(_Ploc->_C_str()), 0, true); // for VS17.5 and later
        }
        return _X_NUMERIC;
    }

「'c_str': 'std::locale' のメンバーではありません」について

microsoft/STLChangelog によると、VS 2022 17.5 で修正されたっぽい。

Removed a non-Standard member function locale::c_str(). #3088

そのままズバリ…。

    }

-    _Ret_z_ const char* c_str() const {
+    _Ret_z_ const char* _C_str() const noexcept {
        return _Ptr ? _Ptr->_Name.c_str() : "";
    }

github.com

以上

EPUBCheckUI version6.2

EPUBCheckUI を更新

主な変更点

  • EPUBCheck v5.0.1 に対応
  • 少しだけ多言語に対応

apps.microsoft.com


アプリ内部

下記の機能の一つで、動的ローカリゼーションがある。それを使わせてもらった。

github.com

3言語もあると辞書作りが大変。手作業だと限界かも・・・。

DataTemplateSelectorを切り替えたい

環境

  • Winui3 アプリ

準備:

/// アイテム
public partial class MyClass : ObservableRecipient
{
    [ObservableProperty]
    public string name = string.Empty;

    [ObservableProperty]
    public string description = string.Empty;

    [ObservableProperty]
    public int index = -1;
}
/// ViewModel
public class MainViewModel : ObservableRecipient
{
    // ## 3 で使う
    public bool IsMode
    {
        get; set;
    }

    public ObservableCollection<MyClass> MyArray = new();

    public MainViewModel()
    {
        foreach (var item in Enumerable.Range(1, 100))
        {
            MyArray.Add(item: new MyClass()
            {
                Name = string.Format("Yamada-{0:000}", item),
                Index = item
            }); ; ;
        }
    }
}

1:StyleSelector を使う

/// セレクター
public class MySelector : StyleSelector
{
    public Style? Style1
    {
        get; set;
    }
    public Style? Style2
    {
        get; set;
    }

    protected override Style? SelectStyleCore(object item, DependencyObject container)
    {
        if (item is MyClass myClass)
        {
            if (myClass.Index % 2 == 0)
            {
                return Style1;
            }
            else
            {
                return Style2;
            }
        }
        return base.SelectStyleCore(item, container);
    }
}
<Page.Resources>
    <Style x:Key="MyStyle1" TargetType="ListViewItem">
        <Setter Property="Background" Value="AliceBlue" />
    </Style>
    <Style x:Key="MyStyle2" TargetType="ListViewItem">
        <Setter Property="Background" Value="LightYellow" />
    </Style>

    <views:MySelector
        x:Key="MySelectorListview"
        Style1="{StaticResource MyStyle1}"
        Style2="{StaticResource MyStyle2}" />
</Page.Resources>
<ListView
    Grid.Row="1"
    ItemContainerStyleSelector="{StaticResource MySelectorListview}"
    ItemsSource="{x:Bind Path=ViewModel.MyArray}">

    <ListView.ItemTemplate>
        <DataTemplate x:DataType="viewmodels:MyClass">
            <StackPanel Orientation="Horizontal">
                <TextBlock Width="25" Text="{x:Bind Path=Index}" />
                <TextBlock Width="150" Text="{x:Bind Path=Name}" />
                <TextBlock Text="{x:Bind Path=Description}" />
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>

</ListView>

2:DataTemplateSelector を使う

// コレクションの各アイテムのテンプレートを、コレクションの要素によって切り替えるクラス
public class MyTemplateSelector : DataTemplateSelector
{
    // テンプレートのプロパティ
    public DataTemplate MyTemplate
    {
        get; set;
    }
    public DataTemplate DefaultTemplate
    {
        get; set;
    }

    // コレクションの要素に応じてテンプレートを選択するメソッド
    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        if (item is MyClass myClass)
        {
            if (myClass.Index % 2 == 0)
            {
                return DefaultTemplate;
            }
            else
            {
                return MyTemplate;
            }
        }
        return DefaultTemplate;
    }
}
<DataTemplate x:Key="MyTemp1" x:DataType="viewmodels:MyClass">
    <StackPanel Background="AliceBlue" Orientation="Horizontal">
        <TextBlock Width="25" Text="{x:Bind Path=Index}" />
        <TextBlock Width="150" Text="{x:Bind Path=Name}" />
        <TextBlock Text="{x:Bind Path=Description}" />
    </StackPanel>
</DataTemplate>
<DataTemplate x:Key="MyTemp2" x:DataType="viewmodels:MyClass">
    <StackPanel Background="LightYellow" Orientation="Horizontal">
        <TextBlock Width="25" Text="{x:Bind Path=Index}" />
        <TextBlock Width="150" Text="{x:Bind Path=Name}" />
        <TextBlock Text="{x:Bind Path=Description}" />
    </StackPanel>
</DataTemplate>

<views:MyTemplateSelector
    x:Key="MyTemplateSelector"
    DefaultTemplate="{StaticResource MyTemp1}"
    MyTemplate="{StaticResource MyTemp2}" />
<ListView
    Grid.Row="1"
    ItemTemplateSelector="{StaticResource MyTemplateSelector}"
    ItemsSource="{x:Bind Path=ViewModel.MyArray}" />

3: IValueConverter → DataTemplateSelector を使う

動的にセレクターを切り替えたい

public class ModeToSelectorConvertor : IValueConverter
{
    public DataTemplateSelector? MySelector
    {
        get; set;
    }
    public DataTemplateSelector? DefaultSelector
    {
        get; set;
    }

    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value is bool iMode)
        {
            if (iMode)
            {
                return MySelector;
            }
            else
            {
                return DefaultSelector;
            }
        }
        return this.DefaultSelector!;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}
<DataTemplate x:Key="MyTemp1" x:DataType="viewmodels:MyClass">
    <StackPanel Background="AliceBlue" Orientation="Horizontal">
        <TextBlock Width="25" Text="{x:Bind Path=Index}" />
        <TextBlock Width="150" Text="{x:Bind Path=Name}" />
        <TextBlock Text="{x:Bind Path=Description}" />
    </StackPanel>
</DataTemplate>
<DataTemplate x:Key="MyTemp2" x:DataType="viewmodels:MyClass">
    <StackPanel Background="LightYellow" Orientation="Horizontal">
        <TextBlock Width="25" Text="{x:Bind Path=Index}" />
        <TextBlock Width="150" Text="{x:Bind Path=Name}" />
        <TextBlock Text="{x:Bind Path=Description}" />
    </StackPanel>
</DataTemplate>

<DataTemplate x:Key="MyTemp3" x:DataType="viewmodels:MyClass">
    <StackPanel Background="OrangeRed" Orientation="Horizontal">
        <TextBlock Width="25" Text="{x:Bind Path=Index}" />
        <TextBlock Width="150" Text="{x:Bind Path=Name}" />
        <TextBlock Text="{x:Bind Path=Description}" />
    </StackPanel>
</DataTemplate>

<views:MyTemplateSelector
    x:Key="MyTemplateSelector"
    DefaultTemplate="{StaticResource MyTemp1}"
    MyTemplate="{StaticResource MyTemp2}" />

<views:MyTemplateSelector
    x:Key="MyTemplateSelector2"
    DefaultTemplate="{StaticResource MyTemp1}"
    MyTemplate="{StaticResource MyTemp3}" />

// コンバーター → セレクター
<views:ModeToSelectorConvertor
    x:Key="MyModeToSelectorConvertor"
    DefaultSelector="{StaticResource MyTemplateSelector}"
    MySelector="{StaticResource MyTemplateSelector2}" />
<ListView
    Grid.Row="1"
    ItemTemplateSelector="{x:Bind Path=ViewModel.IsMode, Mode=OneWay, Converter={StaticResource MyModeToSelectorConvertor}}"
    ItemsSource="{x:Bind Path=ViewModel.MyArray}" />

もう少しスマートな方法がある気がするが…。

以上

Winui アプリをWindows Store用にパッケージ

UWPの時みたいに「次へ」「次へ」ではできなかった。

最後に少しだけコマンド使った。

のでメモ。

プロジェクト作成

Template Studio を利用(特に意味はない)


アプリ起動

ライブラリはこんな感じ


パッケージ化

準備:(既に作成済みの)ストアのIDに紐づけ

アプリパッケージの作成

出力はx86/x64 両方出力。

出力場所パスに、x86 とか入っていて不安でも気にしない。


作成ボタン押してしばらくするとエラー:

※ template studio でプロジェクト作成したから、かも。

この辺を参考に、マニフェストファイルを直接編集

stackoverflow.com


アプリができた


UWPの時だと、x86用とx64用のファイルが一つに統合された1ファイルができてた。

今回は、x86用とx64用のmsixファイルが別々にできている。


指定した出力場所:

C:\Temp\AppPackTest\App1\App1\bin\x86\Release\net6.0-windows10.0.19041.0\win10-x86\AppPackages\

実際に出力された場所(x86)

C:\Temp\AppPackTest\App1\App1\bin\x86\Release\net6.0-windows10.0.19041.0\win10-x86\AppPackages\App1_3.1.4.0_x86_Test

実際に出力された場所(x64)

C:\Temp\AppPackTest\App1\App1\bin\x64\Release\net6.0-windows10.0.19041.0\win10-x64\AppPackages\App1_3.1.4.0_x64_Test

x64の方は、うまいこと出力場所が調整されてる。


1つのパッケージファイルに変換

x86とx64の msixファイルを1つのファイルにする

learn.microsoft.com

x86とx64の msixファイルだけを別のフォルダにコピー

makeappx を実行

>makeappx bundle /d "C:\Temp\AppPackTest\App1\App1\bin\temp_package"   /p ./myapp3_1_4_0.msixbundle

msixbundleファイルができたのでStoreにアップ

以上

InDesign Cc2022 でプラグイン作成:Semantic Issue エラーのメモ

自分用メモ:

  • InDesign プラグイン CC2022ビルド
  • InD-SDK-CC2022-v5
  • Xcode 12.5.1
  • OS11.7.2

  • プロジェクト作成後にビルドする→成功

  • Validate Settings を実行

  • Implicit ... 32bit Type をNO に変更

→ ビルド失敗

  • Semantic Issue
  • SDKFileHelper.cpp → FileUtils.h → AppInfo.h
  • どの部分かわからん

  • 設定:"Suspicious Commas" が YESになっている箇所を削除

→ ビルド成功

以上