;-----------------------------------------------------------------------
; 名前：Benizara / 紅皿 ver.0.1.4.7
; キーボード配列エミュレーションソフトウェア
; 作者：綾木　健一郎
; 令和3年7月4日
;-----------------------------------------------------------------------
１．	始めに
１．１．何をするものなのか
　Benizaraは、Windows環境に接続されたJISキーボードで親指シフト (NICOLA配列) による入力を可能にするエミュレーションソフトウェアです。Windows10のMS-IMEとgoogle日本語入力で動作を確認しています。なお、Benizaraは、設定ファイルを読み込ませることにより、親指シフトに限らず、任意のキーボード配列のエミュレーションが可能です。
　Benizara（紅皿）の名前は、太田道灌の山吹伝説に由来します。

１．２．特徴
・Windows10のストアアプリや、Microsoft Edge上でも親指シフト入力が可能です。
・やまぶきと同様に１２面のシフトモードを実現し、やまぶきの配列定義ファイルをある程度まで読込可能としました。
・やまぶきの打鍵ロジックを参考に実装し、かつ連続シフトモードをサポートしています。よって、やまぶき（やまぶきＲ）からの移行は容易とおもいます。
・Benizaraは、AutoHotKeyのスクリプトを実行ファイル化したものです。ユーザモードでキーフックするタイプのエミュレータなので、導入も停止も簡単です。USBメモリで持ち歩くこともできます。
・親指の友Mk-2 キーボードドライバ V2.0L23に実装された「零遅延モード」を、当該ソフトにも実装しました。零遅延モードとは、親指シフト時の表示遅延をゼロにして、高速打鍵を可能とするモードです。
・Performance Counterを用いて、1ミリ秒単位のキー入力タイミング測定を実現しました。これにより正確な同時打鍵／単独打鍵の判定が行えます。なお、Ver.0.1.2以前はシステムタイマーを用いてキー入力を測定していたため、測定精度は16ミリ秒単位でした。
・管理者権限への切替ボタンを実装しました。紅皿を管理者権限で実行させることにより、管理者権限で実行されているアプリケーションに対してもキー配列のエミュレーションが可能です。
・親指キーの単独打鍵時のキーリピートと、その切り替えを実装しました。
・Google日本語入力のローマ字入力モードに仮対応しました。
・機能キーの切り替えを実装しました。
・濁音と半濁音と拗音の切り替えキーを定義しました。
・紅皿の「無」キーを、やまぶきの「無」キーと同一仕様に変更しました。
・小指シフトで半濁音を入力する配列ファイルを同梱しました。

１．３．未だ実装していないこと
・各ＩＭＥのかな入力モードには対応していません。

２．	使い方
２．１．取り扱い種別
　Benizara（紅皿）はフリーソフトウエアであり、IME.ahk, Path.ahkを除く各ソースコードはMITライセンスの下で再利用可能です
　なお、Benizaraのソースコードのうち、IME.ahk, Path.ahk は、eamatさまが作成されたライブラリです。

２．２．動作環境
　Windows10(64bit)で動作確認していますが、NT系のWindowsならば、どの環境でも動作する筈です。
　IMEは、Atok11とMS-IMEとGoogle日本語入力で動作確認しています。
　キーボードはJIS109キーボードと親指シフト表記付きUSBライトタッチキーボードに対応しています。FMV-KB232やFKB7628-801では、NICOLA配列.bnz をお使いください。


２．３．インストール方法
（１）インストーラ版では、Benizara_0146.zipを所望のパスに解凍して、setup.exe を実行してください。お使いのJIS109キーボードが親指シフト (NICOLA配列) に切り替わります。
（２）実行ファイル版では、BenizaraEXE_0146.zipを所望のパスに解凍してください。benizara.exe を実行すると、お使いのJIS109キーボードが親指シフト (NICOLA配列) に切り替わります。
SetBenizaraTask.exeを実行すると、タスクスケジューラにbenizaraが設定され、以降はログインごとに自動起動します。

２．３．１．Microsoft IMEの設定について
Windows10 May 2020 update 以降にてMicrosoft IMEをお使いの方は、以下の設定を行ってください。これにより、キー配列に青字で示されたユニコード直接入力時でも、正しく入力が可能になります。
（１）タスクトレイの「Microsoft IME」のアイコンを右クリックして、メニューから「設定」を選択します。
（２）Microsoft IMEの設定ウインドウが開くと、全般をクリックします。
（３）下方向にスクロールさせます。
（４）互換性を表示させると、スイッチをクリックしてオンさせます。
（５）IMEバージョンの変更ダイアログでOKボタンをクリックします。
 
（６）これにより、Microsoft-IMEの以前のバージョンに戻すことができました。

３．	紅皿設定の説明
タスクトレイの紅皿アイコンを右クリックして、紅皿設定をクリックすると以下の設定ダイアログが表示されます。各タブの下のOKボタンをクリックすると変更が反映され、キャンセルボタンをクリックすると変更が破棄されます。

３．１．配列タブ
・配列定義ファイルを表示し、かつ切り替える機能を備えたタブです。
・その下側には、親指シフトキーの選択コンボボックスと単独打鍵コンボボックスが表示され、更にキー配列が表示されています。このキー配列は、リアルタイムで打鍵が表示されます。
・配列タブの左最上段には、配列名が表示されます。
・定義ファイル欄には、定義ファイルのパスが表示され、その右にはファイル選択ボタンが表示されます。
・親指シフトキーのコンボボックスは、無変換－変換と無変換－空白と空白－変換とが選択可能です。無変換－変換を選択した場合、無変換キーが左親指キー、変換キーが右親指キーです。無変換－空白を選択した場合、無変換キーが左親指キー、空白キーが右親指キーであり、かつ単独打鍵時には空白が打鍵されます。このとき、変換キーの機能はそのままです。空白－変換を選択した場合、空白キーが左親指キー、変換キーが右親指キーです。
・単独打鍵のコンボボックスは、無効と有効が選択可能です。有効の場合には、左右の親指シフトキーを単独打鍵した場合、対応するキーが入力されます。
・同時打鍵の表示のコンボボックスは、同時打鍵の面を表示するためのものです。ここで選択された同時打鍵のモードとキーの組み合わせにおける同時打鍵の面が、キー配列の表示に反映されます。


３．２．親指シフトタブ
親指シフトに関する設定画面です。
・連続シフトのチェックポックスは、親指シフトキーの押下中に、連続してシフトモードの文字を入力するためのものです。推奨設定はオンです。中指シフトの場合、この設定は無視されます。
・零遅延モードのチェックポックスは、キー押下と共に遅延無く文字を出力する「零遅延モード」をオンするものであり、推奨設定はオンです。この零遅延モードは、親指の友Mk-2キーボードドライバ（聖人さま作）の機能を参考としました。
・キーリピートのチェックボックスは、チェック有り（有効）と無し（無効）に設定可能です。
・親指キー⇒文字キーの重なりの割合は、10～90[%]の間で可変です。親指キーを先行したときの文字キーの打鍵の重なりがこの割合を満たしたならば同時打鍵となります。連続シフトをオンした場合35%、連続シフトをオフした場合50%を推奨します。
・文字キー⇒親指キーの重なりの割合は、10～90[%]の間で可変です。文字キーを先行したときの親指キーの打鍵の重なりがこの割合を満たしたならば同時打鍵となります。連続シフトをオンした場合70%、連続シフトをオフした場合50%を推奨します。
・文字キーと親指キーの重なりの判定時間は、10～400[mSEC]の間で可変です。NICOLA規格では、50～200[mSEC]が推奨されています。推奨値は、連続シフトの場合で100[mSEC]、連続シフトしない場合で150[mSEC]です。


３．３．文字同時打鍵タブ
文字同時打鍵に関する設定画面です。
・零遅延モードのチェックポックスは、キー押下と共に遅延無く文字を出力する「零遅延モード」をオンするものです。
・文字キー同志の重なりの割合は、10～90[%]の間で可変です。２つのキーの打鍵時に、打鍵の重なりがこの割合を満たしたならば同時打鍵となります。推奨値は35%です。
・文字キー同志の重なりの判定時間は、10～400[mSEC]の間で可変です。推奨値は、250[mSEC]です。

３．４．一時停止タブ
・一時停止キーを設定します。PauseとScrollLockと無効の何れかが選択可能です。メニューの一時停止でも一時停止が可能です。

３．５．管理者権限タブ
・紅皿が管理者権限と通常権限のいずれで動作しているかを示すタブです。
・通常権限の場合には、「管理者権限に切替」ボタンか表示されています。この「管理者権限に切替」ボタンをクリックすると、管理者権限に切り替わります。これにより管理者権限で動作しているアプリケーション（例えばタスクスケジューラ）上でも親指シフト入力が可能になります。
管理者権限から通常権限に切り替える方法は提供していません。

３．６．紅皿についてタブ
バージョン情報や紅皿の概要が書かれたタブです。

３．７．ログの説明
・タスクトレイの紅皿アイコンを右クリックして、ログをクリックすると紅皿ログが表示されます。
・表示内容は左から、時間間隔（ミリ秒単位）、入力キーとそのdown/up、状態、アプリケーションへの送信キー内容です。

４．	キー配列（デフォルト）
　紅皿は、やまぶきと同様に、ローマ字モード６面と、英数モード６面の全１２面のキーボードレイアウトを持っています。ローマ字モードは、ＩＭＥをローマ字入力のひらがな・全角カタカナ・半角カタカナに設定したときのモードであり、英数モードは、ＩＭＥを全角英数・半角英数・直接入力に設定したときのモードです。以下表に、各レイアウト名とシフト操作との関係を示します。

レイアウト名　　　　　　｜	シフト操作
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
ローマ字シフト無し　　　｜	シフト無し
ローマ字右親指シフト　　｜	右親指キーと共に文字キー打鍵
ローマ字左親指シフト　　｜	左親指キーと共に文字キー打鍵
ローマ字小指シフト　　　｜	※１
ローマ字小指右親指シフト｜	※１
ローマ字小指左親指シフト｜	※１
英数シフト無し　　　　　｜	シフト無し（省略可）
英数右親指シフト　　　　｜	右親指キーと共に文字キー打鍵（省略可）
英数左親指シフト　　　　｜	左親指キーと共に文字キー打鍵（省略可）
英数小指シフト　　　　　｜	小指シフト（省略可）
英数小指右親指シフト　　｜	小指シフトした状態で、右親指キーと共に文字キー打鍵（省略可）
英数小指左親指シフト　　｜	小指シフトした状態で、右親指キーと共に文字キー打鍵（省略可）

※１：ローマ字モードでシフトキーを打鍵すると、英数モードに一時的に遷移します。ローマ字モードにおいて、このレイアウトは全て小指シフトとして機能します。

紅皿は、各モードにおける10面のプレフィックスシフトのキーボードレイアウトを持っています。以下表に、ローマ字モードの各レイアウト名とシフト操作との関係を示します。　月配列は、このレイアウトを使用しています。

レイアウト名　　　　　　　　　 ｜	シフト操作
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
ローマ字シフト無し　　　　　　 ｜	シフト無し
ローマ字1プリフィックスシフト　｜	1と定義したキーを打鍵した後
ローマ字2プリフィックスシフト　｜	2と定義したキーを打鍵した後
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
ローマ字9プリフィックスシフト　｜	9と定義したキーを打鍵した後
ローマ字0プリフィックスシフト　｜	0と定義したキーを打鍵した後
ローマ字小指シフト　　　　　　 ｜	小指シフト
英数シフト無し　　　　　　　　 ｜	シフト無し（省略可）
英数小指シフト　　　　　　　　 ｜	小指シフト（省略可）

　紅皿は、各レイアウトにおける文字同時打鍵のキーボードレイアウトを持っています。　下駄配列、新下駄配列、ローマ字入力用QWERT配列、蜂蜜小梅配列、薙刀式配列は、このレイアウトを使用しています。


レイアウト名　　　　　　　　　 ｜	シフト操作
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
ローマ字シフト無し　　　　　　 ｜	シフト無し
<d>　　　　　　　　　　　　　　｜	"d"キーと各キーの同時打鍵
<k>　　　　　　　　　　　　　　｜	"k"キーと各キーの同時打鍵
{l}　　　　　　　　　　　　　　｜	"l"キーと各キーの同時打鍵（"l"押下継続を含む）
{m}　　　　　　　　　　　　　　｜	"m"キーと各キーの同時打鍵（"m"押下継続を含む）
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
ローマ字小指シフト　　　　　　 ｜	小指シフト
英数シフト無し　　　　　　　　 ｜	シフト無し（省略可）
英数小指シフト　　　　　　　　 ｜	小指シフト（省略可）

　上記のレイアウトは、紅皿が読み込むキー配列ファイルによって変更することができます。

５．配列定義ファイル
５．１．文字コード
　読み込むことができる配列定義ファイルの文字コードは、UTF8です。拡張子が「bnz」と「yab」のファイルが配列定義ファイルになります。
５．２．各セクションの説明
５．２．１．[配列]セクション
[配列]セクションは、配列名とバージョンとURLを定義するものです。この内容は、紅皿の設定ダイアログに表示されます。

５．２．２．英数モードに係るセクション
　英数モードに係るセクションを記載していないときには、英数モードにおけるキーの入れ替えを行いません。
　[英数シフト無し]セクションは、英数モードかつ親指シフトや小指シフトでない状態でのキー打鍵を定義します。［英数小指シフト］セクションは、英数モードかつ小指シフトでのキー打鍵を定義します。[英数左親指シフト]セクションは、英数モードかつ左親指シフトでのキー打鍵を定義します。[英数右親指シフト]セクションは、英数モードかつ右親指シフトでのキー打鍵を定義します。

５．２．３．ローマ字モードに係るセクション
　ローマ字モードに係るセクションを記載していないときには、ローマ字モードにおけるキーの入れ替えを行いません。
　[ローマ字シフト無し]セクションは、ローマ字モードかつ親指シフトや小指シフトでない状態でのキー打鍵を定義します。［ローマ字小指シフト］セクションは、ローマ字モードかつ小指シフトでのキー打鍵を定義します。[ローマ字左親指シフト]セクションは、ローマ字モードかつ左親指シフトでのキー打鍵を定義します。[ローマ字右親指シフト]セクションは、ローマ字モードかつ右親指シフトでのキー打鍵を定義します。


５．２．４．親指シフトモードの定義
　[ローマ字シフト無し]セクション、[ローマ字左親指シフト]セクション、[ローマ字右親指シフト]セクション、［ローマ字小指シフト］セクションの４つの組み合わせにてローマ字モードにおける親指シフト入力を定義します。
　[英数シフト無し]セクションと、[英数左親指シフト]セクション、[英数右親指シフト]セクション、［英数小指シフト］セクションの４つの組み合わせにて、英数モードにおける親指シフト入力と小指シフト入力を定義します。

５．２．５．プリフィックスシフトモードの定義
　プリフィックスシフト（文字キー前置シフト）用の配列面がローマ字モードで4面・英数モードで4面が使えます。
　項目名は、[1ローマ字シフト無し]のように半角数字を前につけるか、[ローマ字１プリフィックスシフト]のように、モード名の後に半角数字を記載して、その後に「プリフィックスシフト」と記載してください。
　[ローマ字シフト無し]セクションと、[ローマ字１プリフィックスシフト]セクションなどのプリフィックスシフトセクションの組み合わせで、ローマ字モードにおけるプリフィックスシフトを定義します。
　[英数シフト無し]セクションと、[英数１プリフィックスシフト]セクションなどのプリフィックスシフトセクションの組み合わせで、英数モードにおけるプリフィックスシフトを定義します。

５．２．６．文字同時打鍵モードの定義
　キーを指定する文字を「<」と「>」（半角不等号）で囲って書いた後に配列面定義を書くと、文字キーによる同時打鍵シフト方式の配列を定義することができます。「<*>」は、配列面で定義された文字の同時打鍵を意味します。
　なお、キーを指定する文字を「{」と「」」（中括弧）で囲って書いた後に配列面定義を書くと、更にキーを指定する文字を押下した状態で、他方のキーを押下することで、同時打鍵が可能です。「{*}」は、配列面で定義された文字を押下した状態を意味します。「<*>」や「{*}」の省略時には、「<*>」が記載されていると解釈されます。
　[ローマ字シフト無し]セクションや[英数シフト無し]セクションなどと、<a>～<z>,<@>,<[>,<]>,<:>,<,>,<.>,<\>,<*>,{a}～{z},{@},{[},{]},{:},{,},{.},{\},{*}のうち何れかの組み合わせで、各セクションにおける文字同時打鍵を定義します。
　２つのキー指定文字と「<*>」や「{*}」の配列面定義（省略可能）を連続して書くことにより、３キー同時押しを定義可能です。更にキー指定文字は、スペースキーで区切ることにより、同時に複数を記載可能です。

５．３．配列面
　「,」（半角コンマ）を区切りとして、Ｅ段１３～１４列、Ｄ段１２列、Ｃ段１２列、Ｂ段１１列の範囲で、キーに割り当てる文字を記載してください。
　
５．４．キーへの割り当て
５．４．１．キーに割り当て可能な文字
　割り当て可能な文字は、「ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろわをんゔァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロワヲンヴ、。゛゜「」－・！”＃＄％＆’（）＊＋，－．／０１２３４５６７８９：；＜＝＞？＠ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ［￥］＾＿｀‘ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ｛｜｝～逃入空後消挿上左右下家終前次無日換変濁半拗修」です。
　「逃」はエスケープキー、「入」はエンターキー、「空」はスペースキー、「後」はバックスペースキー、「消」はデリートキー、「挿」はインサートキー、「上」「左」「右」「下」はカーソル移動キー、「家」はホームキー、「終」はエンドキー、「前」はページアップキー、「次」はページダウンキー、「無」は割り当て無し、「日」はカタカナ／ひらがな、「換」は無変換、「変」は変換、「濁」は濁音変換、「半」は半濁音変換、「拗」は拗音変換、「修」は濁音・半濁音・拗音への変換です。

５．４．２．キーへの仮想キーコード割り当て
　「v」（半角）の後に半角１６進数で仮想キーコードを指定すると、そのコードのキーストロークを割り当てることができます。

５．４．３．キーへの文字直接出力
　文字をシングルクォーテーションやダブルクォーテーションで囲むことにより、そのままアプリケーションに出力可能です。（注：Windows10 May 2020 Update以降では不具合発生する場合があります。）
　
５．４．４．修飾キー
　文字の前に修飾キーを示す「csaw」を記載することで、修飾キーを出力可能です。「c」はコントロールキー、「s」はシフトキー、「a」はALTキー、「w」はWindowsキーによる修飾です。

５．４．５．機能キー
　［機能キー］のセクションに続いて、機能キーの変更定義を記載すると、機能キーを変更することができます。定義元の機能キーは、「Space,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12,カタカナ/ひらがな」、定義先の機能キーは、「Space,Space&Shift,Backspace,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12,カタカナ/ひらがな」です。

６．	アンインストール方法
６．１．インストーラ版
タスクトレイの紅皿アイコンを右クリックして、終了をクリックしてbenizaraを停止させます。そして、コントロールパネルの「プログラムのアンインストール」を選択し、Benizaraを削除してください。
６．２．実行ファイル版
タスクトレイの紅皿アイコンを右クリックして、終了をクリックしてbenizaraを停止させます。そして、DelBenizaraTask.batを実行したのちに、Benizara.exeが格納されたフォルダを削除してください。

７．	作者への連絡方法
Linkedin：https://www.linkedin.com/in/ken-ichiro-ayaki-965b2a8a/
Mail: kenichiro_ayaki@users.osdn.me

８．	配布ファイルとその構成
Benizara.exe ・・・ 紅皿の実行ファイルです。
Benizara.ini・・・紅皿の設定情報ファイルです。
NICOLA配列.bnz・・・NICOLA配列のファイルです。
Orzレイアウト.bnz・・・orz配列のファイルです。
親指シフト表記付きUSBライトタッチキーボード配列.bnz・・・親指シフト表記付きUSBライトタッチキーボード（ライフラボ社）のキーボード配列です。
月U9完成版.bnz・・・月配列のファイルです。
下駄配列.bnz・・・下駄配列のファイルです。
新下駄.bnz・・・新下駄配列のファイルです。
飛鳥123.bnz・・・飛鳥123配列のファイルです。
JISかな配列.bnz・・・JISかな配列のファイルです。
ローマ字入力用QWERTY配列.bnz・・・ローマ字入力で母音と子音が前後したときでも、本来のローマ字を出力します。
薙刀式配列(JIS横書き).bnz・・・横書き用薙刀式です。記号配列はJIS配列に似せています。
薙刀式配列(JIS縦書き).bnz・・・縦書き用薙刀式です。記号配列はJIS配列に似せています。
薙刀式配列(US横書き).bnz・・・横書き用薙刀式です。記号配列はUS配列に似せています。
薙刀式配列(US縦書き).bnz・・・縦書き用薙刀式です。記号配列はUS配列に似せています。
蜂蜜小梅(小指シフトで英小文字).bnz・・・蜂蜜小梅配列です。
蜂蜜小梅(小指シフトで英大文字).bnz・・・蜂蜜小梅配列です。

９．	履歴
ver.0.1.1　…　初版
ver.0.1.2　…　WindowsキーとAltキーの単独押し動作を許可するため
　　　　　　　　Hotkey登録を外し、タイマー割込みで監視するようにした
ver.0.1.3　…　Performance Counter 対応、管理者権限への昇格機能、IME判定の不具合対応。
ver.0.1.3.1　…　親指キーの単独打鍵時のキーリピート、ログ機能追加。
ver.0.1.3.2　…　空白と変換を親指キーに設定可能。親指キー単体のタイムアウト抑止。
ver.0.1.3.3　…　キーレイアウトファイルの変更が次回起動時に反映されなかった不具合の対処。
ver.0.1.3.4　…　キーレイアウトファイルの読み込み時のエラー処理の追加。
ver.0.1.3.5　…　親指キーオン→文字キーオン→他の親指キーオンの処理Bと、親指キーオン文字キーオンオフの処理Eを仕様書に適合するように修正。
ver.0.1.3.6　…　同時複数起動の抑止、シフトキーとコントロールキーと上下左右カーソルキーのフックを外す、google日本語入力への仮対応、タイプウェルで仮名文字を入力する際の配列を除外。
Ver.0.1.4.0　…　英数モードのように、入力キーとアプリケーションへの出力キーとが一致している場合にキーをフックしないように変更。入力キーorz配列で、かな長音がおかしくなる件に対応。親指シフト表記付きUSBライトタッチキーボード配列の「ぁ」の入力ができなかった件に対応。
Ver.0.1.4.2　…　Windows 10 May 2020 Updateに対応するため、アプリに出力する文字をすべて半角または制御記号とした。
Ver.0.1.4.3　…　キー配列ファイルに平仮名を記載可能とし、紅皿設定のキーレイアウトにリアルタイムのキー情報を表示させた。
Ver.0.1.4.4　…　プレフィックスシフトと文字同時打鍵に対応し、月配列と下駄配列と新下駄配列のレイアウトファイルを追加した。
Ver.0.1.4.5　…　親指シフトキーの設定が保存されていなかったのを直した。メニューによる一時停止機能を追加した。
Ver.0.1.4.6　…　NICOLA-F配列に対応するため、E14をBackspace以外に設定可能とした。濁音・半濁音・拗音の入力キーを定義した。小指シフトモードでのコード送信を実現した。
Ver.0.1.4.7　…　蜂蜜小梅配列に対応するため、親指シフトモード時の同時打鍵を実現した。薙刀式に対応するため、３キーの同時打鍵とスペース＆シフトに対応した。
以上
