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

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

英字や数字などのキーは既定では物理キーボードの動作と同じく、押した瞬間に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 の公開と同じタイミングになるかと思います。

]]>

[.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;
  }
}
]]>