@ledsun blog

無味の味は佳境に入らざればすなわち知れず

キー配置をDvorakにするインストーラーを作る

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を再起動します。