ちーたんタッチボードでキーを離したときだけ文字を入力する

ユーザーさんからキーを離したときにだけ文字を入力したいけどどうすればいいかという質問がありました。

英字や数字などのキーは既定では物理キーボードの動作と同じく、押した瞬間に1文字打たれ、押しっぱなしにしていると一定時間後に連続で文字が入力されるという動作になっています。

この動作を変えたい場合はボード側の設定を変えることによって可能になっています。

ちーたんタッチボードでは各キーの動作を「Processes」パラメータで上書きすることによって動作を変えることができます。次のように設定するとキーを押して離したときだけ文字が入力されるようになります。

【例】Aキーを離したときだけ動作させるようにする

[{"KeyType": "A","ExecuteTiming":"Released","PressRepeat":"Once"}]

「KeyType」は対応するキーを識別する名前で、「ExecuteTiming」を「Released」にすると離したときだけ動作するようになります。ただし、これだけだと押下中の連続動作は残ったままになってしまうので、「PressRepeat」を「Once」にして1回だけ動作するようにします。

「ボード作成 Excel ツール」を使ってボードを作成する場合は「Processes」に入力して対象キーにまとめてコピーすればいいだけなので簡単です。使い方はホームページを参照してください。

2017-02-02 09_44_35-rmtdt.sorceryforce.net_3404 - リモート デスクトップ接続

一応標準キーボードに対してこれらの設定を行ったサンプルを OneDrive に置いておきます。使ってみたい方はダウンロードしてください。


[ちーたんタッチボード] XAML ファイルからボードコンテナ定義ファイルの作成方法

ブログのコメントでどうやって作るのかというコメントがありましたのでサイトの Q&A のページに記載しました。機能概要のページには XAML ファイルからボードコンテナ定義ファイルを作れますと書いてたんですが、まだ仮実装の段階だったので作り方とかの記載を後回しにしていました。

XAML ファイルの定義もまだ決まっていないので今回は定義を書かずにサンプルファイルだけ公開する形にしました。定義のほうは今後のバージョンで決めていきたいと思います。

また、仮実装であるため、完全なボードコンテナ定義ファイルを作ることはできません。作れるのはボードのサイズ、キーの位置、サイズ、テキストなどでそのほか細かなパラメータは直接 .setting ファイルを編集する必要があります。また、.setting ファイルを新規に作成する機能だけですので、既存の .setting ファイルに対して修正をすることはできません。

作り方は以下の Q&A のページに記載しています。

XAML のサンプルファイルはダウンロードページからダウンロードできます。


ちーたんタッチボード Ver 0.10 のマウスパッド (予定)

Ver 0.01 ではボードの各キーをすべてテキストで表示させていましたが、Ver 0.10 ではいくつかのキーを画像に置き換える予定です。たぶん一番変わるのがマウスパッドだと思います。とりあえず今はこんな感じです。

2014-04-14 00_24_46-MyTouchBoard2

ちょっとごちゃごちゃした感じになったような気もしますが、とりあえず見ただけでそのキーがどういった動作をするのかがわかるようにはしてみました。

キーに使用している画像自体は Boards フォルダ内に PNG ファイルとしてそのまま置く形になるので、ちょっと変えたいなーっていう場合は置き換えることもできます。ただし、新しいバージョンのボードコンテナ定義ファイルを入れるときに上書きされるので注意してください。(Ver 0.10 以降は明示的に上書きしようとしない限りは上書きされないようになります)

一応現在配布している Ver 0.01 にもこのボードコンテナ定義ファイルは適用できるのですが、Ver 0.10 から追加される設定メニューも含めているため、公開は ちーたんタッチボード Ver 0.10 の公開と同じタイミングになるかと思います。


ソフトウェアキーボード&マウスパッドアプリ「ちーたんタッチボード Ver 0.01」公開しました

Twitter の方ではお知らせしていたのですが、こちらに書くのをすっかり忘れていました。前回ブログでお伝えしたとおりちーたんつ~るずの第1弾をリリースしました。その名も「ちーたんタッチボード」です。

ちーたんタッチボードがどんなアプリかと申しますと、Windows タブレットのデスクトップモードを快適に扱うためのソフトウェアキーボードとマウスパッドをセットにしたアプリケーションになります。

最近 8インチ型の Windows タブレットが売れているというニュースを聞いた方も多いかと思います。搭載している OS の大半は Windows 8.1 Professional であり、タブレット向けに作られた Modern (仮名) と従来のデスクトップアプリが動かせる2つのモードを持ったハイブリッドな OS です。

従来のデスクトップアプリを動かせるところがとても魅力的なのですが、ほとんどの端末がタッチ操作前提のデバイスになっており、従来のマウス操作向けに作ったアプリをタッチで操作しようとすると結構使いづらいところがあったりします。

そこでデスクトップアプリもできる限り快適に使うことができるようにと今回「ちーたんタッチボード」を作成しました。とはいってもほとんど自分用に作ったものなのですが、それなりに機能をつけてしまったので、ほかに使いたい方がいれば使っていただけるように公開しました。

ちーたんタッチボードの最大の特徴は「キーの配置設定を別ファイルに書きだしているため自由に配置を変更できる」「タッチでマウスカーソルを操作できるため、細かい操作も可能」なところです。もちろん通常のソフトウェアキーボードとしても使えます。

まだまだいろんな機能がありますので、その中からいくつか紹介します。詳しい説明やダウンロードページは専用のページを用意していますのでそちらをご覧ください。

あとすみません。また Ver 0.01 であるため、設定画面がなかったりドキュメントがなかったりしますが今度追加していきたいと思います。大部分の機能は実装済みなので設定ファイル直接いじればいろいろ変更できたりしますが・・・。

機能一部紹介

 

好みのボードの選択・追加

同じキーボードでもユーザーによって使いやすいレイアウト、慣れているレイアウトがあるかと思います。ソフトウェアキーボードでも同様で、例えば OS 付属のソフトウェアキーボードでも使いやすい、使いにくいがあると思います。

ちーたんタッチボードではそれを考慮し、ユーザーに合わせてボードに載せるキーの配置を自由に設定できるようにしました。

ちーたんタッチボードではボードの各キーの配置や大きさ、表示などをボードの設定ファイルで管理しています。配布サイトから入手した設定ファイルを配置することによって好みのキー配置のボードを追加することができます。

キーの自由な配置

Borads フォルダ下にある「.setting」ファイルは各ボードコンテナのキーのレイアウトを定義したファイルであり、JSON というテキスト形式で作成されています。よって、ユーザーが設定ファイルを開いてキーを追加したり位置の変更やサイズの変更などを行うことができます。不要なキーを削除してよりコンパクトなボードを作成することもできますので、自分なりのボードを作成してみてください。

用途に合わせたボードを選択

ボードを自由に選択できるということは通常の文書入力のとしてだけではなく、特定のアプリケーションに特化したボードとして使用することもできます。

例えばキーボードやゲームパッドにしか対応していないゲームを遊ぶ時や、イラストを描く際のショートカットキー配置などです。もちろんこれ以外の使い方もあるかもしれませんので自由にボードを選択してみてください。

 

マウスカーソルの操作

デスクトップ向けアプリの多くはマウスを使っての操作を前提としたアプリが多いため、タッチのみのデバイスで操作しようとすると操作対象が小さくて操作しにくい場合が多々あります。それを補うために擬似的に画面上にマウスパッドを配置してマウスカーソルを操作できる機能があります。

マウスカーソルの移動は2パターンあり、指を動かしただけ移動するマウスパッドモードとタッチポイントから指を移動した方向にカーソルが移動し続けるマウススティックモードがあります。

マウスパッドはタップによりマウスクリック、ダブルクリックの動作も行うことができます。(設定変更必要あり)

マウスホイールの機能もあります。ホイールによる動作はウィンドウ上にカーソルがあるかによって変わる場合がありますのでご注意ください。

マウスボタンもひととおり実装してあります。以下のボタンが使用できます。

  • 左ボタン
  • 右ボタン
  • 中央ボタン
  • X1ボタン
  • X2ボタン

一つのキーに複数の動作割り当て

一つのキーに対して複数の操作を割り当てることができます。たとえば「Ctrl」と「C」のキーを割り当てることによって「コピー」の動作、「Ctrl」と「V」を割り当てることによって「貼り付け」の動作をひとつのキーで行うことができます。

例としてイラスト向けのボードではその動作を実装しています。

D-Pad (Directional pad)

D-Pad は一つのキーの中に上下左右をまとめた特殊なキーになっています。ゲームコントローラーにある十字キーを想像していただければわかりやすいかと思います。

D-Pad は通常のカーソルキーとは異なり、押した瞬間から連続でキー送信を行うようになっています。主にゲーム向けの機能となっていますが、ボードの設定で挙動は変更することはできます。

ゲーム向けとは書いてありますが、通常のアプリケーションにも使用することができます。

 

IME の状態表示 (仮実装)

テキストを入力する際に現在 IME が ON なのか OFF なのかわからないことがよくあるかと思います。ちーたんタッチボードでは IME の状態に応じてボードの色が変わるようになっているため、IME の状態を間違えずにテキストを入力しやすくなっています。

色は設定ファイルで変更することができます。


IME が OFF の状態


IME が ON の状態

ボードの透過

ボードは透過に対応しています。ボードが見づらい場合は透過なしでも構いませんし、裏に隠れているウィンドウが見えるようにしたい場合は適度な透明度を設定することができます。


透過なし


透過率40%

ボードの背景への画像設定

ボードの背景に自由な画像を表示させることができます。標準ではキーの見やすさのために単色で表示させていますが、見にくくならないのであれば好きな画像を載せてみてもいいでしょう。画像が適度な透過画像であればボードも透過させることができます。

 

キーに画像設定

各キーにはテキストのほかに画像を表示させることもできます。テキストだけではわかりにくいキーの場合は画像を使用するとわかりやすくなるかもしれません

高DPI対応

OS の DPI の設定に合わせてボードのサイズが自動的に変わるようになっています。小さいデバイスで高解像度の環境でも適切な大きさでボードを表示、操作することができます。

XAML からボードコンテナ定義ファイル生成 (仮実装)

ボードコンテナ定義ファイルは Json 形式で定義されているため、直接テキストエディタで開いて修正することもできますが、キーの数が多いと面倒です。

現在仮実装ですが XAML ファイルでキーの配置を作成して所定のフォルダに配置し、ちーたんタッチボードを起動すると自動的にボードコンテナ定義ファイルが生成されます。ただし、現在仮実装であるため、一部は直接ファイルを編集する必要があります。


[.NET] 他のコントロールに押下キーの情報を渡す

アクティブでないウィンドウやコントロールに対してキーボードのキーを押したかのように情報を送るには、対象コントロールなどにフォーカスを当てて「SendKeys.Send」メソッド(または SendKeys.SendWait メソッド)を使うことによって送ることができます。

例えば、以下の例ではフォームがアクティブになっている状態でキーを押したときにテキストボックスに押したキー情報を送ってテキストを入力することができます。

private void form1_KeyPress(object sender, KeyPressEventArgs e)
{
  // アクティブなコントロールにキーを送るためフォーカスを当てる
  textBox1.Focus();
  SendKeys.SendWait(e.KeyChar.ToString());
}

フォームでキーが押されたときに Focus メソッドでテキストボックスにフォーカスを当て、SendKeys で押されたキーを送っています。送ったあとフォーカスを戻すのがベストだとは思いますが、必要に応じて入れてください。

基本的なコードはこれで OK なのですが、SendKeys では一部のコードが特殊な用途に使用されるキーであるため、このままでは送ることができません。対象キー、用途については以下の MSDN の SendKeys を参照してください。

特殊キーを通常の入力キーとして送るには中括弧({})で囲む必要があります。これを踏まえるとコードは以下のようになります。

private void form1_KeyPress(object sender, KeyPressEventArgs e)   
{   
  // アクティブなコントロールにキーを送るためフォーカスを当てる   
  textBox1.Focus();   
  
  switch (e.KeyChar)   
  {   
    case '^':   
    case '+':   
    case '%':   
    case '~':   
    case '(':   
    case ')':   
    case '{':   
    case '}':   
    case '[':   
    case ']':   
      // 特殊記号は中かっこで囲って送る   
      SendKeys.SendWait("{" + e.KeyChar + "}");   
      break;   
    default:   
      SendKeys.SendWait(e.KeyChar.ToString());   
      break;   
  }   
}

これで一見完成のように見えるのですが、実は動かしてみると「^(カレット)」キーを押したときになぜか「&(アンパサンド)」で送られてしまいます。.NET Framework のバグかはわかりませんが、これでは完全とは言えないため別案を使います。

WSH (Windows Script Host) にも同様に SendKeys の仕組みがあり、こちらは正常にカレットが送るのでこれを使います。WSH を使うには以下の手順を行う必要がります。

  1. 参照設定の追加で、COM タブから「Windows Script Host Object Model」を追加する。
  2. 参照設定に追加された「IWshRuntimeLibrary」のプロパティを開き、「相互運用機能型の埋め込み」を False に設定する。

そのうえで以下のようにコードを修正します。#if の条件を入れていますが、WSH を使うか使わないかで分けているだけなので不要であれば消してください。

private void form1_KeyPress(object sender, KeyPressEventArgs e)   
{   
  // アクティブなコントロールにキーを送るためフォーカスを当てる   
  textBox1.Focus();   
  
  switch (e.KeyChar)   
  {   
    case '^':  
#if true // Interop.IWshRuntimeLibrary を使ってよい場合   
      (new IWshRuntimeLibrary.WshShellClass()).SendKeys("{^}");   
      break;  
#endif   
    case '+':   
    case '%':   
    case '~':   
    case '(':   
    case ')':   
    case '{':   
    case '}':   
    case '[':   
    case ']':   
      // 特殊記号は中かっこで囲って送る   
      SendKeys.SendWait("{" + e.KeyChar + "}");   
      break;   
    default:   
      SendKeys.SendWait(e.KeyChar.ToString());   
      break;   
  }   
}