2016/12/31

スキン作成時の注意点

トグルボタンはFocusable="False"にセットする

<ToggleButton Focusable="False"/>
スキンを開いた直後等キーボードフォーカスが他のウィンドウにない状態の時
トグルボタンを押した後 エンターキーやスペースキーでトグルボタンが押されてしまう
トグルボタンの動作としては合っているが ソフトキーボードとしては余計な動作なのでFalseに設定し無効にする
z:LRToggleButtonはデフォルトでFalseになっているので設定不要

ControlTemplateにTargetTypeがない時のTemplateBinding

'System.NotSupportedException'
'System.Xaml.XamlObjectWriterException' が出るが普通に動いている気がする
RelativeSource TemplatedParentにするか TargetType指定で消えた

ResourcesのSolidColorBrushはソートし表示される

x:Keyの名前順にソートするので それを踏まえて名前を付けていただくと見やすくなります
スペースも許容されるので利用してください

エスケープ

xmlと同じです
よく使うもの
&: &amp;
>: &gt;
<: &lt;
": &quot;
': &apos;

&#[10進数]; または &#x[16進数];
&#10;と&#xa;はどちらも改行「\n」です

xaml固有のものは「{}」があります
""の最初に「{」を置く場合Binding等と混同しないよう"{}{"とする必要があります


スキン作成 プロジェクト

作成直後


スキン作成には要らないフォルダやファイルばかりですが特に気にしないでOKです

フォルダ構成


Skinフォルダを作成してその中にスキンを入れてください
図のようにzeKey.exeとXceed.Wpf.Toolkit.dllをコピーしておくとテストが楽になります

ファイル参照

外部ファイルの参照は
"pack://siteoforigin:,,,/Skin/image.png"や
"pack://siteoforigin:,,,/Skin/_img/image.png"のようになります


スキン整理

zeKey自体にはスキン整理機能は付いていません(外部ファイルの扱いが難しいため)
エクスプローラーで変更することになります

右クリックメニューに開くメニューがあります
変更後は再取得してください

スキン名.xaml(スキン本体)とスキン名.config(スキン設定)はセットです
リネームや移動で.configを変えなかった場合は スキン設定が初期設定に戻ります

スキン名やフォルダ名を変更したい

好きなように変更できます(_から始まる名前にするとzeKeyに表示されませんので注意)

フォルダを移動させたい

外部ファイルを使用していなければ スキンファイルを移動するだけです
同名のスキンがある時はどちらかの名前を変えてください

外部ファイルを使用している場合はスキン読み込みエラーになるので 外部ファイルも移動する必要があります
エラーにファイル名が出るので 元と同じフォルダ構成でファイルをコピーします(複数スキンで共用している場合があります 共用がなければ移動で構いません)
スキンフォルダ 
    サンプルフォルダ
        サンプル.xaml
        画像.png
となっていた場合スキンフォルダ直下におろすには
スキンフォルダ
    サンプル.xaml
    画像.png
と します

スキンフォルダ
    サンプルフォルダ
        画像フォルダ
            画像.png
        サンプル.xaml
となっている場合は
スキンフォルダ
    画像フォルダ
        画像.png
    サンプル.xaml
と なります

外部ファイル名が他のスキンで使用している外部ファイル名と被った場合 スキン内のファイル名と外部ファイル名を変えてください
スキンフォルダ
    サンプルフォルダ
        サンプル.xaml("pack://siteoforigin:,,,/Skin/画像.png")
        画像.png
        他のスキン.xaml("pack://siteoforigin:,,,/Skin/画像.png")
        画像.png
となってしまった場合
スキンフォルダ
    サンプル.xaml("pack://siteoforigin:,,,/Skin/画像1.png")
    画像1.png
    他のスキン.xaml
    画像.png
という具合です

外部ファイル指定

xamlで <Image Source="a.png" />のように指定するとexeに埋め込まれているリソースの指定になりますのでスキンでは使えません(Visual Studio上では使えるように見えるので注意)

外部ファイルを読み込む場合は
<Image Source="file:///c:/a.png" />
<Image Source="http://www.___.com/a.png" />
<Image Source="pack://siteoforigin:,,,/Skin/a.png" />
のようにするのですが file:やhttp:を許すと危険すぎるので xeKeyのスキンでは使えなくしています

pack://siteoforiginは本来zeKey.exeからの相対パス指定ですが 扱いづらいので
zeKeyでは "pack://siteoforigin:,,,/Skin/" を該当スキンのフルパスと解釈します(スキンフォルダではありません そのスキンのあるフォルダです)
必ず/Skin/と表記する必要があります

該当スキンのあるフォルダ以下しかアクセスできません

<Image Source="pack://siteoforigin:,,,/a.png" />
<Image Source="pack://siteoforigin:,,,/../a.png" />
<Image Source="pack://siteoforigin:,,,/skin/a.png" />
<Image Source="pack://siteoforigin:,,,/Skin/../a.png" />
<Image Source="pack://siteoforigin:,,,/Skin/../a/a.png" />
すべてエラー

<Image Source="pack://siteoforigin:,,,/Skin/a.png" />
<Image Source="pack://siteoforigin:,,,/Skin/a/a.png" />
OK

<Image Source="pack://siteoforigin:,,,/Skin/../Skin/a.png" />
無意味だがOK

siteoforiginの意味が違うので気持ち悪いのですが スキン作成の簡便さとスキンフォルダを変更可能にするため 現時点ではこれがよいのかなと思っています

2016/12/23

紹介動画を投稿しました

1年も掛かってるとかどうかしてるとしか思えないんですが 今年中に公開されるぎりぎりで思い切って公開しました

http://www.nicovideo.jp/watch/sm30282369

Vectorにて公開しました

http://www.vector.co.jp/soft/winnt/util/se514849.html
いつまでもだらだらやっても仕方がないので思い切って公開しました

色々思いついた機能を追加をしていたりしていたのですが ブログの説明を更新したり サンプルスキンを用意したりが面倒で 完成がのびのびになってしまい
結局自分が使わない機能をオミットしシンプルなものにしました

しかし今年中に公開される期日ぎりぎりに勢いでアップロードしてしまったので すでにバグがありますw
・タイプライター風スキンの小さいスペースキーに割り当てがない
・落書きスキンで使用しているWidth HeightのBindingが効いていない
・「エクスプローラーでスキンフォルダを開く」メニューが効かない
年明けにVer. 1.0.1に差し替えます

2016/11/24

設定ファイル

設定ファイルを削除した時のデフォルト値
[]は実際には付けない []が付いているものはデフォルト値または値がない場合省略される

zeKey.config

zeKey自体の設定ファイル
SkinFolder: exeフォルダ下のSkinフォルダ フォルダ指定した場合フルパス
Startup.File: SkinFolderからの相対パス

<Setting>
  <Window>
    <Top>100</Top>
    <Left>100</Left>
    <Width>700</Width>
    <Height>600</Height>
    [<HideStart>false</HideStart>]
    [<TopMost>false</TopMost>]
    <VerticalSplitter>200</VerticalSplitter>
    <HorizontalSplitter>200</HorizontalSplitter>
  </Window>
  <SkinFolder>Skin</SkinFolder>
  <Startups>
    [<Startup>
      <File></File>
    </Startup>]
  </Startups>
  [<IgnoreSaveError>false</IgnoreSaveError>]
  [<DesktopFrame>false</DesktopFrame>]
  [<DesktopTool>false</DesktopTool>]
</Setting>

スキン名.config

各スキンの設定ファイル
メイリオ好きなのでデフォ値ですがWin10に入っていないこともある??
入ってないと游ゴになるのかどうか?よくわかりません

<Setting>
  <Position>
    <Top>100</Top>
    <Left>100</Left>
    <Width></Width>
    <Height></Height>
  </Position>
  <AutoHide>
    <IsEnabled>false</IsEnabled>
    <HideType>SlideTop</HideType>
    <OffsetX>5</OffsetX>
    <OffsetY>5</OffsetY>
    <HideAnimation>
      <Mode>Instantly</Mode>
      <Delay>1</Delay>
      <Duration>0.5</Duration>
    </HideAnimation>
    <ShowAnimation>
      <Mode>Instantly</Mode>
      <Delay>1</Delay>
      <Duration>0.5</Duration>
    </ShowAnimation>
  </AutoHide>
  <Font>
    <Family>メイリオ</Family>
    <Style>Normal</Style>
    <Weight>Normal</Weight>
    <Stretch>Normal</Stretch>
    <Size>16</Size>
  </Font>
  <Colors>
    [<Color>
      <Name></Name>
      <Code></Code>
    </Color>]
  </Colors>
</Setting>

同梱スキン - 落書き.xaml


全画面スキンテスト
ブログの画像作成用に適当に作ったスキン
全画面スキンはちょっとした設定ミスでPC操作が効かなくなるため十分注意すること
スキン作成者向けオプション-デスクトップにzeKeyツールを表示する
にチェックを入れておくことを推奨
入れ忘れて操作不能になった場合 すべてキーボード操作で[Ctrl]+[Alt]+[Del]でタスクマネージャを起動しzeKeyを終了する

2016/11/23

同梱スキン - テンキー.xaml


トグルボタンでの2面切り替えサンプル
数字入力の機会があまりないので 使い勝手が良いかどうかはわかりません
キーボードのFnキーのような機能は ボタンを2つ用意して表示非表示を切り替えるのが簡単で作りやすいです

同梱スキン - コンパクト.xaml


TypeKeys指定サンプル
デザインセンスがないので残念な出来ですが キー数が少ない特別な用途向け(1列だけとか特定アプリ専用等)のベースに使えるかもしれません

同梱スキン - フルキーボード.xaml


スキン自作のためのテンプレート用
大量のコメントで行数は多いですが 改造しやすいようにできていますので自作のベースに最適です

同梱スキン - タイプライター風.xaml


テンプレートサンプル用 実用性はあまりありません
画像を1枚使っていますがスペースキーの質感用です 大した意味はありません
丸いキーはxamlだけで出来ています 見た目に関しては想像できるものは大体実現可能です
どのスキンもキーの定義部分が同じようになって冗長なんですが スタイルを使って出来る限り短くしています

同梱スキン - Keyboard.xaml


自分(T.N)用に作ったもの

2016/08/23

KEYEVENTF_EXTENDEDKEY

zeKeyのメイン機能 キーコード送信にはSendInputを使っています
SendInputには KEYBDINPUT構造体に値をセットして渡すのですが dwFlagsには常にKEYEVENTF_EXTENDEDKEY(拡張キーフラグ)を付けていました

正しくは右Shiftやフルキーボードでいう矢印やDelの列のキー等に付くものなのですが 余計につけても動くという情報も見ましたし 実際動いていました

しかしVisual StudioのエディタでCtrl+ホイール(コードの拡大縮小)をしたところ不具合が出ました(その後のテストでShiftもおかしいと判明)

左Ctrlに拡張キーフラグがセットされているとKeyDownは認識されてコードの拡大縮小はできますが KeyUpは無視するようで通常のスクロールにはならず拡大縮小が継続されてしまいました(当然ですが右Ctrlなら拡張キーなので想定通りの動作になります)

セットするべきキーとセットしないキーは実際実験すればすぐわかるのですが Key列挙体には見た事もない実験のできないキーがたくさんあって困ってしまいます
仮想キーコードが決まれば拡張フラグも決まると思うのですがなんとかならないものか

現状 面倒なので左Alt Ctrl Shiftだけ付けないようにしていますw

2016/08/22

xamlでエキスパンダーのヘッダーにツールチップ表示

拙作のスキン画面にあるエキスパンダー
<Expander Header="スキンフォルダ(_D)">
のヘッダーにツールチップを付けようとしたところ

<Expander Header="スキンフォルダ(_D)" ToolTip="なんたら">
では内部全体に付いてしまいました(当たり前)

<Expander>
  <Expander.Header>
    <TextBlock Text="スキンフォルダ(_D)" ToolTip="なんたら"/>
  </Expander.Header>
</Expander>
にしたらツールチップは思った通りにヘッダーに付きました(当たり前)
しかし スキンフォルダ(_D)と表示されてアクセスキー機能が働かなくなりました
アクセスキー(アクセラレータキー)とは
メニューバーの[ファイル(F)]とかのFの部分
通常はAlt+Fで選択されます 条件によってはAlt無しでも動きます
ちなみに[コピー(C) Ctrl+C]のCtrl+Cの部分はショートカットキーです
実際には何を使ってるのかをライブビジュアルツリー(VS2015の新機能 便利ですね)で見てみたところAccessTextとなっていました
ほとんどの場合AccessTextに自動でラップされるようで表に出てきませんが こういう場合は明示的に書く必要があります

で結局
<Expander>
  <Expander.Header>
    <AccessText Text="スキンフォルダ(_D)" ToolTip="なんたら"/>
  </Expander.Header>
</Expander>
にすればよいということです
テンプレート書く羽目になるかと思っていたので 簡単に解決してよかったです

2016/08/07

かな入力モード ConversionMode

以下の情報は私の環境での結果です 違う環境ではどうなっているか分かりません
Windows7 MS-IME 日本語109キーキーボード

ローマ字入力かな入力の切り替えは
          <z:LRButton.LeftTypeKeys>
            <z:TypeKeys TypeKey="LeftAlt">
              <z:TypeKeys TypeKey="OemCopy" />
            </z:TypeKeys>
          </z:LRButton.LeftTypeKeys>
で注意喚起のダイアログが出た上で トグル動作でした
この場合 入力モードは正常に取得できました

IMEオンの時かなキー
<z:LRButton TypeKey="OemCopy">
だけを押すと一時的に変えるモードなのかよくわかりませんが 何かキーを押すまで入力モードが反映されませでした

かなモードでの英数入力は 英数キー(Capsキー)ですが
<z:LRButton TypeKey="OemAttn">
でトグル動作でした
<z:LRButton TypeKey="Capital"/>
はCapsのトグル動作でした

KeyState.ConversionModeに実際値が入っています IMEオフの時は {x:Null} です

引用 (AutoHotkey)(IMEの制御をする 編) - もらかなです。
状態一覧表
0 = かな入力 半角英数
3 = かな入力 半角カナ
8 = かな入力 全角英数
9 = かな入力 全角ひらがな
11 = かな入力 全角カタカナ
16 = ローマ字入力 半角英数
19 = ローマ字入力 半角カタカナ
24 = ローマ字入力 全角英数
25 = ローマ字入力 全角ひらがな
27 = ローマ字入力 全角カタカナ

zeKeyセキュリティ対策

今のところzeKeyでは

外部アセンブリ禁止

Blend機能は惜しい気もしますが そこまで必要性は感じないし ほかのDLL読み込んでまで必要な機能が思いつかない
DLL自作出来るような人はもっといいのを作ってください

namespaceはスキン用以外読み込ませない

C#は逆コンパイルも簡単らしいので(よく知りませんが)クラス名やメンバ名がわかってもいいように namespaceを分けてxmlns:zを決め打ちすることで安全性が上がるはず
System等が欲しいなと思う時もあるんですが あまりにも広範囲すぎて危なそうなので禁止します

スキンからのアクセスをそのフォルダ以下に制限

Image等のSourceを内部で強制変換します

HyperlinkExクリックで確認ダイアログ

当然ですね

をセキュリティ対策としたいと思います

セキュリティガバガバはさすがにイヤですが ユーザーの自由度がなくなってしまっては意味が無いのでこのあたりが落し所かなと思います
もちろん大穴が見つかったら修正するつもりですが どうしようもない場合公開中止もあるかもしれません

セキュリティ対策をユーザーの責任でキャンセルを許すかどうかですが
スキン設定ファイルにユーザー固有値を含めた上で暗号化して保存する等で 十分安全を担保して実現可能だと思います がそこまで必要か悩み中です


悪意のあるスキンを使ってしまった というのは
例えば ランチャーソフト向けに(ランチャーソフトとは無関係の悪意がある人が)便利設定と偽って設定ファイルとPC破壊バッチファイルをセットで公開し それを使ってしまったのと大差ないというのは言いすぎでしょうか?
それとも ブラウザのバグを突いてHPを開いただけでPCがクラッシュするような状況に近いのでしょうか?
前者はさすがに使ったユーザーの責任 後者はソフト側にも責任(法的には損害賠償などは無理でしょうが)があるような感じがしますが スキンファイルの扱いは前者寄りだと思うのですがどうでしょう?

無責任な言い方かもしれませんが 十二分に注意喚起して それ以上はユーザー責任で使ってもらうしかないかなと思います

2016/08/06

簡単! Path作成

xamlで標準で使えるデータとしてPathがあります
ベクターデータなので画像よりサイズが小さいですし 拡大しても荒れません
作成チュートリアルとしてEnterキーを作ってみます

Blend for Visual Studio 2015

Visual Studio Community 2015をインストールすると一緒に付いてくる Blend for Visual Studio 2015で作成します

コルタナさんで検索しBlendを起動して 新規WPFプロジェクトを作ります

Canvas


アセット-コントロール-パネルからCanvasをドラッグ&ドロップします

Canvasを右クリックしてレイアウト-すべてリセット

Rectangle

アセット-図形-RectangleをCanvasにドラッグ&ドロップ

Rectangleを選択してプロパティウィンドウから RadiusX,Yをマウスホイールで5に変更して角を丸めます

Rectangleをコピー&ペーストで4つ作ります

Rectangleをサイズ調整し↑のように重ねます

結合

重ねたRectangleをCtrlクリックで両方選択して 右クリック-結合-合算でPathにします

もうひとつ↑のように合算します

最後のRectangleを↑のように配置して今度は減算します
位置がずれるとガタガタになるのでマウスホイールで拡大したり RectangleのFillを無しにしたりしてしっかり合わせてください
減算の時は抜きたい方(左下のRectangle)を先に選択し 抜かれる方(右上のPath)を後に選択します

ペンツール

ペンツールを選択するとPathのコントロールポイントが見えるようになります
ドローソフトに慣れている方はベジェ曲線等で自由に描いてみてください

合算で出来てしまった不要なポイントをクリックして削除します

xaml

デザインからXAMLに切り替えます(↑はXamlStylerでFormat XAMLをした後です)

以上で終了です スキンにコピペして使ってみましょう
 <Path Width="92"
            Height="127"
            Data="M5.5,0.5 L86.5,0.5 C89.26,0.5 91.5,2.74 91.5,5.5 L91.5,32.5 91.5,121.5
            C91.5,124.26 89.26,126.5 86.5,126.5 L21.5,126.5 C18.74,126.5 16.5,124.26   
            16.5,121.5 L16.5,64.5 C16.5,61.74 14.26,59.5 11.5,59.5 L5.5,59.5 C2.74,59.5  
            0.5,57.26 0.5,54.5 L0.5,5.5 C0.5,2.74 2.74,0.5 5.5,0.5 z"
            Fill="#FFF4F4F5"
            Stretch="Fill"
            Stroke="Black" />
数値に微妙な誤差が出ていてちょっと気持ち悪いので 小数点第3位を四捨五入してすっきりさせました

絵心があればイラスト等も描けるのですが 私は無いのでこれで精一杯ですw

レインボーアニメーション

一発ネタっぽいですがww

某天国.xaml より(わかりやすいように背景のみにしています)
元ネタ Rainbow color Animation by GradientStops[index].offset : Color « Windows Presentation Foundation « VB.Net Tutorial
<Rectangle Margin="15,50,15,15">
  <Rectangle.Fill>
    <LinearGradientBrush x:Name="brush">
      <LinearGradientBrush.GradientStops>
        <GradientStop Color="Red"/>
        <GradientStop Color="Orange"/>
        <GradientStop Color="Yellow"/>
        <GradientStop Color="Green"/>
        <GradientStop Color="Blue"/>
        <GradientStop Color="Indigo"/>
        <GradientStop Color="Violet"/>
      </LinearGradientBrush.GradientStops>
    </LinearGradientBrush>
  </Rectangle.Fill>
  <Rectangle.Triggers>
    <EventTrigger RoutedEvent="Rectangle.Loaded">
      <BeginStoryboard>
        <Storyboard SpeedRatio="3" TargetName="brush">
          <DoubleAnimation Duration="0:0:7"
                            RepeatBehavior="Forever"
                            Storyboard.TargetProperty="GradientStops[0].Offset"
                            To="1"/>
          <DoubleAnimation BeginTime="0:0:1"
                            Duration="0:0:7"
                            RepeatBehavior="Forever"
                            Storyboard.TargetProperty="GradientStops[1].Offset"
                            To="1"/>
          <DoubleAnimation BeginTime="0:0:2"
                            Duration="0:0:7"
                            RepeatBehavior="Forever"
                            Storyboard.TargetProperty="GradientStops[2].Offset"
                            To="1"/>
          <DoubleAnimation BeginTime="0:0:3"
                            Duration="0:0:7"
                            RepeatBehavior="Forever"
                            Storyboard.TargetProperty="GradientStops[3].Offset"
                            To="1"/>
          <DoubleAnimation BeginTime="0:0:4"
                            Duration="0:0:7"
                            RepeatBehavior="Forever"
                            Storyboard.TargetProperty="GradientStops[4].Offset"
                            To="1"/>
          <DoubleAnimation BeginTime="0:0:5"
                            Duration="0:0:7"
                            RepeatBehavior="Forever"
                            Storyboard.TargetProperty="GradientStops[5].Offset"
                            To="1"/>
          <DoubleAnimation BeginTime="0:0:6"
                            Duration="0:0:7"
                            RepeatBehavior="Forever"
                            Storyboard.TargetProperty="GradientStops[6].Offset"
                            To="1"/>
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
  </Rectangle.Triggers>
</Rectangle>
コピペコードですが スキンロード時に タイミングをずらしながら7色の基準位置を変更するアニメーションを開始して 虹スクロールするようになっています
そのため最初は単色なのと 左右両端で色が変わる時に ちょっと期待(画像を無限スクロールするようなイメージ)と違う動作になっていますが まあそんなに目立たないでしょう
単独で使う場合は何か他の方法がいいかもしれませんが 思いついていませんw

EventTrigger と Storyboard は非常に強力なので何かいいアイデアを思いついたら どんどん活用したいですね

zeKeyのTypeKeyで指定する値とキーボードの対応表

ぶっちゃけた話 .NETのSystem.Windows.Input.Key をそのまま使っています
ここここをみればいいんですが とても見やすいとは思えないのでまとめました

日本語109キーボードでの対応表


画像クリックで元画像
グレーのキーは文字そのままで通ります(xamlでは大文字小文字の区別はしないようです)
半角/全角キーとひらがな/カタカナキーは 特殊な挙動をしますので実際にキーコードを追ってください(とはいえzeKeyで完全に再現するのは無理です)
IMEのOnOffはKanjiModeで良いです

ややこしい記号キー部分

意味とキーが合っているものは意味のある名前 合ってないものは番号にしました
詳しくは↓の表を見てください

xamlで通るSystem.Windows.Input.Key値

複数の定義があるKey値やKeyConverterで変換されるものも含む
日本語キーボードになさそうなものは除外
Key値説明
Cancel, BREAKBreak キー Ctrl+Pause
Back, BACKSPACE, BKSP, BSBackspace キー
TabTAB キー
ClearClear キー NumLock中にテンキーの5キー
Return, EnterEnter キー
PausePause キー
Capital, CapsLockCapsLock キー
KanaModeIMEかなモード キー
KanjiModeIME漢字モード キー Alt+半角/全角
Escape, ESCEsc キー
ImeConvert変換 キー
ImeNonConvert無変換 キー
SpaceSpace キー
Prior, PageUp, PGUPPageUp キー
Next, PageDown, PGDNPageDown キー
EndEnd キー
HomeHome キー
Left← キー
Up↑ キー
Right→ キー
Down↓ キー
Snapshot, PrintScreen, PRTSCPrintScreen キー
Insert, INSInsert キー
Delete, DELDelete キー
D00 キー(テンキーでは無い方) 数字のみの0は不可
D99 キー(テンキーでは無い方) 数字のみの9は不可
AA キー
ZZ キー
LWin, WINDOWS, WIN, LEFTWINDOWS左Windows キー
RWin, RIGHTWINDOWS右Windows キー
Apps, APPLICATIONアプリケーション キー
NumPad0テンキーの0 キー
|
NumPad9テンキーの9 キー
Multiplyテンキーの* キー
Addテンキーの+ キー
Subtractテンキーの- キー
Decimalテンキーの. キー
Divideテンキーの/ キー
F1F1 キー
|
F12F12 キー
NumLockNumLock キー
ScrollScrollLock キー
LeftShift, SHIFT左Shift キー
RightShift右Shift キー
LeftCtrl, CONTROL, CTRL左Ctrl キー
RightCtrl右Ctrl キー
LeftAlt, ALT左Alt キー
RightAlt右Alt キー
BrowserBackブラウザーの戻る キー
BrowserForwardブラウザーの進む キー
BrowserRefreshブラウザーの更新 キー
BrowserStopブラウザーの中止 キー
BrowserSearchブラウザーの検索 キー
BrowserFavoritesブラウザーのお気に入り キー
BrowserHomeブラウザーのホーム キー
VolumeMute音量ミュート キー
VolumeDown音量ダウン キー
VolumeUp音量アップ キー
MediaNextTrackメディアの次のトラック キー
MediaPreviousTrackメディアの前のトラック キー
MediaStopメディアの停止 キー
MediaPlayPauseメディアの再生/一時停止 キー
SelectMediaメディアの選択 キー
LaunchMailメールを起動 キー
LaunchApplication1アプリケーション1の起動 キー
LaunchApplication2アプリケーション2の起動 キー
Oem1, OemSemicolon, SEMICOLON:* キー (注意)
OemPlus;+ キー
OemComma, COMMA,< キー
OemMinus, MINUS-= キー
OemPeriod, PERIOD.> キー
Oem2, OemQuestion/? キー
Oem3, OemTilde@` キー (注意)
Oem4, OemOpenBrackets[{ キー
Oem5, OemPipe¥| キー
Oem6, OemCloseBrackets]} キー
Oem7, OemQuotes, QUOTES^~ キー (注意)
Oem102, OemBackslash, BACKSLASH¥_ キー

以下IME関連?
私も良くわからないのでキーコードを表示しながらキーボードを打ってみてください
FinalModeThe IME Final mode key.
ImeAcceptThe IME Accept key.
ImeModeChangeThe IME Mode change request.
OemAttn, DbeAlphanumericThe OEM_ATTN key.
OemFinish, DbeKatakana, FINISHThe OEM_FINISH key.
OemCopy, DbeHiraganaThe OEM_COPY key.
OemAuto, DbeSbcsCharThe OEM_AUTO key.
OemEnlw, DbeDbcsCharThe OEM_ENLW key.
OemBackTab, DbeRomanThe OEM_BACKTAB key.
Attn, DbeNoRomanThe ATTN key.

xamlでの色指定方法

xamlで色の指定をする時に
<Border Background="○○"/>等
の○○に入れる文字列です

RGB 値で

#rgb
例:#F00

#argb
例:#80F0 半透明

#rrggbb
例:#00FFFF 水色

#aarrggbb
例:#800000FF 半透明

文字で

xamlで 文字による指定可能な色は Colors クラス にある色のようです
リンクの下のほうに色見本がありますが 全部画像で非常に使いづらいので「UNIX X11 colors」で検索してください
DarkSeaGreen 以外は同じだそうです(wikipediaによると)

例:DeepPink 濃いピンク

システムリソースで

<Border>
  <Border.Background>
    <SolidColorBrush Color="{DynamicResource {x:Static SystemColors.GradientActiveCaptionColorKey}}"/>
  </Border.Background>
</Border>
のようにして Windowsで個人設定した色をリアルタイムで反映させることが出来ます
上の例ではボーダー背景を アクティブタイトルバー色に設定
詳しくは SystemColors クラス を参照

ユーザーごとの好みにあったスキン色に設定できますが どんな色かの予想が付かないので注意が必要です

2016/08/05

チュートリアル 05 zeKeyで色変更


<!--  zeKey skinfile  https://ze-key.blogspot.jp/  -->
<z:Keyboard xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:z="clr-namespace:zeKey.Skin;assembly=zeKey"
            Width="300"
            Height="72"
            z:DragMoveBehavior.CanMove="True"
            Background="{DynamicResource 背景}"
            Foreground="{DynamicResource 文字}">
  <z:Keyboard.Resources>
    <SolidColorBrush x:Key="文字" Color="Black" />
    <SolidColorBrush x:Key="背景" Color="White" />
  </z:Keyboard.Resources>
  <Grid>
    <Viewbox>
      <TextBlock>
        Hello, world!
      </TextBlock>
    </Viewbox>
    <z:ResizeGrip />
  </Grid>
</z:Keyboard>

<!--
  <z:Keyboard.Resources>というタグが出てきました
  使いまわしたいブラシやスタイルの置き場です
  詳しい説明は省きますがzeKeyの機能により
  SolidColorBrush(単色ブラシ)は色の変更ができるようになります
  x:KeyにzeKeyの色タブで表示される文字 Colorに初期設定色を指定して
  "{DynamicResource 背景}"のように参照します

  色をリアルタイムで変更可能になりましたが つまみの色まで変わってしまいました
  親の属性の値が子要素に引き継がれるものがあります FontSizeもそうでした
  z:KeyboardのBackground Foreground指定が
  TextBlock z:ResizeGripに引き継がれて色が変わります
  20行目を
    <z:ResizeGrip Foreground="Black"/>
  に変えてください 新たに指定した場合は 引き継いだ規定値より優先されます
  こうするとテキストだけが変わるようになります
-->
SolidColorBrushを色のように扱っていますが 正確にはBrushは色ではなく塗りです
なのでグラデーションブラシや画像ブラシ等もあります
Background等の属性はほとんどの場合 Brushを要求するので簡単に指定できるようにSolidColorBrushで指定することにしています
グラデーションは別の機会に解説します

チュートリアル 04 リサイズ追従

<!--  zeKey skinfile  https://ze-key.blogspot.jp/  -->
<z:Keyboard xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:z="clr-namespace:zeKey.Skin;assembly=zeKey"
            Width="300"
            Height="72"
            z:DragMoveBehavior.CanMove="True"
            Background="White">
  <Grid>
    <Viewbox>
      <TextBlock>
        Hello, world!
      </TextBlock>
    </Viewbox>
    <z:ResizeGrip />
  </Grid>
</z:Keyboard>

<!--
  中身がリサイズによって拡大縮小するようになりました
  大きさが変わるのでフォントサイズ指定は意味がなくなったので削除しました

  10行目を
  <Viewbox Stretch="Fill">
  に変えてみてください
  また6行目を削除してみてください
  そのうちのどれかは希望する動作だと思います
-->
拡大縮小にはViewboxが便利です 中身を自分のサイズに自動調整します
拡縮方法(Stretch)と拡縮方向(StretchDirection)を選べます

ViewboxはGridいっぱいに広がっており Gridはz:Keyboardいっぱいに広がっているため TextBlockは結局z:Keyboardのサイズになります

チュートリアル 03 リサイズグリップ

<!--  zeKey skinfile  https://ze-key.blogspot.jp/  -->
<z:Keyboard xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:z="clr-namespace:zeKey.Skin;assembly=zeKey"
            Width="300"
            Height="72"
            z:DragMoveBehavior.CanMove="True"
            Background="White"
            FontSize="48">
  <Grid>
    <TextBlock>
      Hello, world!
    </TextBlock>
    <z:ResizeGrip />
  </Grid>
</z:Keyboard>

<!--
  リサイズ可能にするつまみが付きました
  
  タグによって子供の要素を複数持てるものと1つだけしか持てないものがあります
  Keyboardは1つしか持てないので間に要素を複数持てるGridというのを挟みます
  Gridは文字は持てないので「Hello, world!」をTextBlockという文字表示用コントロールに挟みます
  14行目がリサイズ用のつまみです デフォルトでは右下に3本線のつまみが出ます
  
  Width="300" Height="72"と数値で指定しています
  今まではスキンは中身のサイズに合わせるという設定になっていました
  なのでフォントサイズによって大きさが自動で変わりましたが
  リサイズ可能にするには数値を指定して自動サイズ設定を解除する必要があります
  
  これでリサイズするようになりました
  しかし期待している動作はこれではないと思います
  次回リサイズに中身も追従するようにします
-->
うすうす感じているかもしれませんが z:が付くものはzeKey独自のコントロールです
実はz:の付かない<ResizeGrip>もあるのですが中の処理が違うため使えません

チュートリアル 02 ドラッグ移動


<!--  zeKey skinfile  https://ze-key.blogspot.jp/  -->
<z:Keyboard xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:z="clr-namespace:zeKey.Skin;assembly=zeKey"
            z:DragMoveBehavior.CanMove="True"
            Background="White"
            FontSize="48">
  Hello, world!
</z:Keyboard>

<!--
  3行増えまして マウスドラッグで移動可能になりました
  5行目がマウスで移動できるようにする設定です
  今のところ付けたら動かせると思っておけばOKです
  
  ドラッグしやすいように 6行目で背景色を付け 7行目で文字を大きくしました
-->
Visual Studioで編集している場合はプロパティウィンドウでいろいろと変更可能です
実験してみてください

チュートリアル 01 最小のスキン

<!--https://ze-key.blogspot.jp-->
<z:Keyboard xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:z="clr-namespace:zeKey.Skin;assembly=zeKey">
  Hello, world!
</z:Keyboard>

<!--
  最小のスキンファイル
  スペースや改行 表示する文字以外 1文字も削れません
  
  画面左上100,100の位置に「Hello, world!」と表示する
  スキン設定のうち 概要 色は何も表示されないが フォント 隠す設定 詳細は変更可能
  マウスでの移動 リサイズはできない
-->
お約束のハロワです
1行目はコメントですがスキンファイルには必須です 最低でも2行目以内には「https://ze-key.blogspot.jp」の表記がないとスキンとして読み込みません

2~4行目は開始タグですが訳が分かりませんね とりあえずそう書くものと思ってください
xamlはhtmlよりタグの中が長くなりやすいです

5行目 htmlと同じように内容(コンテンツ)部分です

6行目 終了タグです スキンは<z:Keyboard></z:Keyboard>で囲わなければいけません(コメントは除く)

2016/08/04

スキン改造 - 画像


ソリューションに画像を追加して224行目にImegeを入れましょう
        <Image Canvas.Left="456"
               Height="295"
               Source="pack://siteoforigin:,,,/Skin/sd20_lie-down.png" />


キートップがちょっと邪魔なので透明度を設定します


面白いかは別として Contentを利用すればこういう事もできます

        <z:LRRepeatButton Canvas.Left="230"
                          Canvas.Top="240"
                          Width="115"
                          Height="35"
                          Content="スペース"
                          TypeKey="Space" >
          <z:LRRepeatButton.Background>
            <ImageBrush ImageSource="pack://siteoforigin:,,,/Skin/sd20_lie-down.png"
                                 Stretch="Uniform"/>
          </z:LRRepeatButton.Background>
        </z:LRRepeatButton>
こういう方法もあります

好きな画像を使って自分だけのキーボードにしてみましょう
配布する場合は著作権に注意してください

スキン改造 - 配置


キーを減らすのは簡単です 選択してDelキーです(メニューや右クリックメニューにもあります)


複数選択はCtrl+クリックで出来ます
マウスドラッグで選択もできますが 余計なものも選択されたり移動になってしまったりするので Ctrl+クリックが確実です


キーの位置はマウスでドラッグするかプロパティ-レイアウト-Left Topでマウスホイール またはコードに直接数値を入れることで変更できます
幅と高さも同様です


大きさや位置変更もマウス操作で好きにいじりましょう
その際書式メニューに 整列や同じサイズに揃える がありますので使ってください


全体のサイズを変える時は一旦z:KeyboardのWidth Heightを削除しCanvasのサイズを変更します


大きさが決まったらCanvasのWidth Heightと同じ数値をz:KeyboardのWidth Heightに設定します(そうしないとリサイズが出来なくなってしまいます)


TN仕様そっくりになってしまいましたが それぞれ自分の理想の配置にしてください

スキン改造 - キートップ

手始めに「フルキーボード」スキンを改造していきます


スキン作成環境 構築編3の要領でVSでプロジェクトを作り「フルキーボード.xaml」を追加-既存の項目として読み込みます(zeKeyの参照も忘れずに) これでSkinフォルダにコピーされ元のファイルとは別のファイル扱いになっていますので 編集してもOKです 念のためファイル名を変えておきましょう

単純にキートップの文字を変える場合は 変えたいキーを選択し プロパティウィンドウかコードウィンドウでContentを書き換えます

ひらがな等2行になるものはちょっと面倒ですがこんな感じでしょうか?
        <z:LRRepeatButton Canvas.Left="140"
                          Canvas.Top="80"
                          Width="35"
                          Height="35"
                          TypeKey="D3" >
          <z:LRRepeatButton.Content>
            <TextBlock >
              <Run Text="# ぁ" />
              <LineBreak />
              <Run Text="3 あ" />
            </TextBlock>
          </z:LRRepeatButton.Content>
        </z:LRRepeatButton>

こだわって隙間等の微調整もいくらでもできますが フォントが変わると簡単にずれるので程々にしておくのがよいと思います(数が多くて面倒なだけww)

スキン改造 - 基本

Visual Studioの簡単な説明


スキン(.xaml)を開くとデザイナとコードエディタが出ます
左右か上下か選べます 幅やズームを調整できます
グリッド表示やスナップ メニューや右クリックメニューに順序や整列があります


何か選択してプロパティウィンドウを表示すると アイテムのプロパティを変更できます
よく使うのは ブラシ 共通 レイアウト zeKey あたりでしょうか


コードの緑色はコメントです 一通り読んでおきましょう

2016/08/03

データバインディング

xamlにはデータバインディングという強力な機能があります
プログラム内の値やxamlの要素間で値を結びつけることができます
結びつけるというのは単に値を取得するというわけではなく 変更がリアルタイムに反映され表示が変化します
変更通知モードによっては UIの操作をプログラム側のデータ変更として通知できます
またプログラムにコマンドが用意されていれば プログラムコードを直接呼ぶことができます

zeKeyではプログラム内の値(データコンテキスト)は CapsLock等のモード付キーの状態やキー送信のコマンド等が用意されています
<DataTrigger Binding="{Binding ModeKeys.ImeLock}" Value="true">

<MouseBinding Command="{Binding TypeKeyCommand}" CommandParameter="Up" Gesture="{z:WheelUp}" />

{}波括弧で囲われた部分はマークアップ拡張といってバインディング等を楽に書けるようにした xamlの拡張部分です

{に続いてBindingと書かれた部分がバインディングで 続く値を=の前の値と結びます
説明だけではわかりにくいのでサンプルスキンで使っているところを参考にしてください

xaml基礎

xamlとは

xaml(eXtensible Application Markup Language)は
xml(eXtensible Markup Language)を拡張したファイル形式です
xmlはhtmlのようなツリー構造をテキストで表現するファイル形式です
htmlとJavaScriptのような関係で xamlとC#等でプログラムを作る際に見た目の記述に使います

詳しい説明は他のサイトを見て頂くとして 簡単に説明します

xamlはひとつだけ要素を持ちます(ルート要素)

<要素></要素>
がひとつの塊です

要素は中身を持つことが出来ます(子要素)

<要素>何か</要素>

中身を持っていない場合
<要素></要素>

<要素/>
と省略できます

子供の子供の...と深くすることが出来ます

<要素>
    <子要素>
        <孫要素/>
    </子要素>
</要素>

内側より先に外が終わることは出来ません

<要素>
    <子要素>
        <孫要素>
    </子要素>
        <孫要素/>
</要素>
  NG

子要素を複数持てるものがあります(持て無いものもあります)

<要素>
    <子要素>
        <孫要素/>
        <孫要素/>
    </子要素>
    <子要素/>
</要素>

要素は属性を持てます 属性は「=””」で値を指定します

<要素 属性1="値" 属性2="値" 属性3="値"/>

改行や複数の空白は無視されます

<要素 属性1="値"
       属性2="値">
    <子要素>
        <孫要素/>
    </子要素>
</要素>

<要素 属性1="値" 属性2="値"><子要素><孫要素/></子要素></要素>
は同じです

<!-- -->で囲われた部分はコメントになり無視されます

<要素>
    <!--コメント-->
    <子要素/>
</要素>

しかしコメントも要素の一種なので「<>」の中には書けません
<要素 属性1="値"
<!--コメント-->
"属性2="値"/>
NG

属性を「<要素.属性>」として子要素にすることが出来ます

<要素 属性="値"/>

<要素>
    <要素.属性>値</要素.属性>
</要素>
は同じです

実は子要素を持つというのは 要素ごとに決まっている既定属性値に入れているということです
実例を出します
<TextBlock>
    zeKey
</TextBlock>
は子要素として文字列「zeKey」を持っています TextBlock の 既定属性は Text なので
<TextBlock Text="zeKey"/>
と同じ意味になります

<TextBlock>
     <TextBlock.Text>
        zeKey
    </TextBlock.Text>
</TextBlock>
と展開することも出来ます この場合ただ長くなっただけで無意味ですが

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
</Grid>
のように属性値を複数持てる属性を指定する場合に使います

値はすべて文字列です

しかしxamlを読み込む段階で自動で変換されます
<TextBlock Width="100"/>
100は数値に変換されます

ですが属性が期待している値に 変換できないような値は 当然エラーになります
<TextBlock Width="テキストブロック"/>
NG

要素 属性は大文字小文字を区別します

<Textblock width="100"/>
NG

2016/08/02

プロジェクト

ではスキン作成用のプロジェクトを作ります

スタートページの新しいプロジェクト... または メニューの ファイル - 新規作成 - プロジェクト... を選択
Visual C# WPFアプリケーション 適当な名前を付けて OKボタン
ソリューションのディレクトリを作成はアンチェック


ソリューション エクスプローラーで参照を右クリック 参照の追加... または メニューの プロジェクト - 参照の追加... を選択


さらに 参照...ボタンを押して


zeKeyをインストールしたフォルダのzeKey.exeを選択します


ソリューション エクスプローラーでスキンプロジェクトの右クリックから 追加 - 新しいフォルダー または メニューの プロジェクト - 新しいフォルダー でSkinフォルダを作成
 

ここまではスキン作成用プロジェクトの設定です
スキンを複数作る場合は以下を繰り返せばOKです


Skinフォルダにサンプルスキンをドラッグ&ドロップしてください
Skinフォルダにコピーされます


ソリューション エクスプローラーでスキンをダブルクリックし開きます
無事に表示されましたでしょうか


以上でスキン作成の準備が出来ました
エラーが出るようでしたら
  • メニューの ビルド - ソリューションのリビルド をしてみてください
警告が出ると思われるのでプロジェクトのプロパティでターゲットを.NET4.6に変更します

  • xamlファイルを開きなおすとエラーが消えることがあります
  • VS自体を再起動でエラーが消えることがあります
それでも駄目な時は設定をもう一度確認してください

スキンフォルダ(インストールファルダ\Skin)の扱い

サブフォルダも作れますので 適当に整理してください
スキンに使う画像等はスキンと同じフォルダかその子孫フォルダに入れてください(スキンより上や兄弟フォルダではいけません)
起動中の名前変更やフォルダ移動等は感知しませんので再取得(スキンフォルダ(D)を右クリックもしくはCtrl+R)が必要です

「_」アンダーバーから始まるフォルダやファイルは非表示になります
リソースフォルダやバックアップ用ファイル等に利用してください