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

[C#]Visual Studioにおけるステートメントのコードスニペット

実はいままで知らなかったんですが if 文や for 文を入力する際にコードスニペットを使って定型文を入力できたんですね。今までちまちま鍵かっこと書いていました。^^;

コードスニペットは Tab キーを押して入力できます。まず、if 文を例として、if 文を入力したい箇所にカーソルを置きます。

image

続いて「if」と入力します。インテリセンスが表示されるので途中で Tab キーを押して確定しても構いません。

image

下のように「if」の後ろにカーソルがある状態で Tab キーを押します。

image

下図のように必要なかっこが自動的に作られます。あとはオレンジ色になっている個所を修正していきます。

image

else 文が必要な場合は同様に else と入力した後に Tab キーを押せば鍵かっこが追加されます。これ以外の for や while, switch などにも使えるので試してみてください。

試していませんが、VB.NET とかもできるのではないかと思います。


[プレイ動画] 改造FF5 16-18 & ドラクエ3すごろくの動画アップ

4つ動画をアップしました。ドラクエについては今回でひとまず完結です。まだやりたいことはあるのですが、改造 FF5 の方がかなりボリュームが大きいのでこちらをまず優先させていきたいと思います。


Windows Server バックアップのスケジュールを任意に設定する

Windows Server バックアップでバックアップスケジュールを作成する際、下図のように最大で取れるバックアップ間隔は最大1日までとなっています。頻繁にバックアップを取りたくない場合は1週間単位や1か月単位で指定したいところですが、残念ながらここではそういった設定はできません。

image

ここのバックアップ スケジュールは設定を行うと実はタスク スケジューラーに設定されています。ということはそこの設定を変えれば自由にスケジュールを変更できるということです。

場所は「Microsoft」-「Windows」-「Backup」に「Microsoft-Windows-WindowsBackup」が作成されますのでこれを直接変更してください。

image

週1で実行する場合はこんな感じで設定します。

image

余談ですが、このスケジュールは Windows Server バックアップでスケジュールを設定した場合に更新されますので、スケジュールの設定を変更、例えばバックアップ対象を変えただけでもタスク スケジューラーの設定が戻りますのでその場合は再設定してあげる必要があります。