WiXというツールをつかってWindows用のインストーラーを作る勉強をしています。
練習用に、その中でレジストリに値を書き込む機能があったので、WindowsでDvorakキー配置 - @ledsun blog で設定したリポジトリキーを書き込むインストーラーを作成してみました。
次のようなXMLファイルを作ります。
<?xml version='1.0' encoding='utf-8'?> <Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'> <Product Name='Dvorak Keymap' Id='8CFF2094-8718-44B8-9128-195BF79D39E2' UpgradeCode='A0419383-3A0F-4571-B588-309A4090DE3A' Language='1041' Codepage='932' Version='1.0.0' Manufacturer='ledsun'> <Package Id='*' Keywords='Dvorak Keymap' Description="レジストリにキー配置をDvorakにするためのScancode Mapを書き込みます。" Manufacturer='ledsun' InstallerVersion='100' Languages='1041' Compressed='yes' SummaryCodepage='932' /> <Directory Id='TARGETDIR' Name='SourceDir'> <Component Id="ScancodeMap" Guid="B061CD08-398B-47D2-8BAC-B3DA45CCE0D5"> <RegistryValue Root='HKLM' Key='SYSTEM\CurrentControlSet\Control\Keyboard Layout' Name='Scancode Map' Type='binary' Value='0000000000000000250000001a000c001b000d002b007d00280010003300110034001200190013001500140021001500220016002e001700130018002600190035001a000d001b001d003a0018001f00120020001600210017002200200023002300240014002500310026001f0027000c00280027002c0010002d0024002e0025002f002d00300030003100110033002f0034002c0035003a001d0000000000' /> </Component> </Directory> <Feature Id='Complete' Level='1'> <ComponentRef Id='ScancodeMap' /> </Feature> <InstallExecuteSequence> <ScheduleReboot After="InstallFinalize"/> </InstallExecuteSequence> </Product> </Wix>
次のコマンドで、msiファイルをビルドできます。
PS C:\Users\led_l\wix-play-ground\Dvorak> candle.exe Dvorak.wix candle.exe : error CNDL0103 : The system cannot find the file 'Dvorak.wix' with type 'Source'. PS C:\Users\led_l\wix-play-ground\Dvorak> candle.exe .\Dvorak.wxs Windows Installer XML Toolset Compiler version 3.11.2.4516 Copyright (c) .NET Foundation and contributors. All rights reserved. Dvorak.wxs PS C:\Users\led_l\wix-play-ground\Dvorak> light.exe .\Dvorak.wixobj Windows Installer XML Toolset Linker version 3.11.2.4516 Copyright (c) .NET Foundation and contributors. All rights reserved. C:\Users\led_l\AppData\Local\Temp\ruhtlg0c\Dvorak.msi : warning LGHT1076 : ICE71: The Media table has no entries.
warning LGHT1076 : ICE71: The Media table has no entries.
と、警告が出ています。 インストールするファイルがないためではないかと思います。 Windowsインストーラーで、レジストリだけ書き込むという使い方は想定していないのだと思います。 ていうか、バッチファイルかけば十分そうですよね*1。
理解を深めるために、XMLファイルの内容を説明します。
<Feature Id='Complete' Level='1'> <ComponentRef Id='ScancodeMap' /> </Feature>
インストーラーが完了したときの状態を定義します。
<Component Id="ScancodeMap" Guid="B061CD08-398B-47D2-8BAC-B3DA45CCE0D5"> <RegistryValue Root='HKLM' Key='SYSTEM\CurrentControlSet\Control\Keyboard Layout' Name='Scancode Map' Type='binary' Value='0000000000000000250000001a000c001b000d002b007d00280010003300110034001200190013001500140021001500220016002e001700130018002600190035001a000d001b001d003a0018001f00120020001600210017002200200023002300240014002500310026001f0027000c00280027002c0010002d0024002e0025002f002d00300030003100110033002f0034002c0035003a001d0000000000' /> </Component>
レジストリにキーマップを変更する値を書き込みます。
Scancode Map
はなければ、デフォルトのキー配置が使われるだけなので、インストール前の状態に戻すみたいな処理はしていません。
アンインストールすると、単に削除されます。
Scancode Map
は1つしか値が持てないので、Dvorak配置にする変更と、CtrlキーとCapsキーを入れ替える変更は、まとめて1つの値に書きます。
実際、このバイナリ値は、Dvorak配置とCtrlキーとCapsキーの入れ替えが両方入っています。
<InstallExecuteSequence> <ScheduleReboot After="InstallFinalize"/> </InstallExecuteSequence>
Scancode Map
を反映するには再起動が必要です。
インストール/アンインストール完了時にOSを再起動します。