DOBON.NET DOBON.NETプログラミング掲示板過去ログ

複数タブのショートカットキー認識方法

分類:[.NET]

はじめまして。教えて下さいませ。

現在VB.NETにて複数タブを使用したアプリケーションを作っています。
この複数タブの中にはそれぞれ「登録(&S)」「削除(&A)」という同じ機能の
ボタンがあります。
上記のショートカットキーを動作させたいのですが、それぞれのタブに同じボタンが
存在する為に「どのタブのどのボタンか」を認識させないといけないようです。
私がやろうとしている方法は

1.どのショートカットキーがおされたか
2.現在アクティブなタブがどれか
3.アクティブなタブ+ショートカットキーの場合にそれぞれの処理を行う

この3つを行いたいのですが、いまいち上手くいきません。
良い方法がありましたら教えていただけたら幸いです。
> はじめまして。教えて下さいませ。
>
> 現在VB.NETにて複数タブを使用したアプリケーションを作っています。
> この複数タブの中にはそれぞれ「登録(&S)」「削除(&A)」という同じ機能の
> ボタンがあります。
> 上記のショートカットキーを動作させたいのですが、それぞれのタブに同じボタンが
> 存在する為に「どのタブのどのボタンか」を認識させないといけないようです。
> 私がやろうとしている方法は
>
> 1.どのショートカットキーがおされたか
> 2.現在アクティブなタブがどれか
> 3.アクティブなタブ+ショートカットキーの場合にそれぞれの処理を行う
>
> この3つを行いたいのですが、いまいち上手くいきません。
> 良い方法がありましたら教えていただけたら幸いです。

[Alt+Hoge]のWindows標準のアクセラレータ機能ですね。
それで、実現しようとするのはかなり面倒でしょうね。

ムリヤリ実現するには、今カレントなTabを見ればいいんでしょうが、
ボタンイベントが冗長になってしまいます。
後からソースを見た時にもわかりづらいかと・・・
いっそ、タブからそのボタンを追い出して上げれば上記の方法でもわかりやすいかと。

それがダメなら、手作りでショートカット機能をつけた方が柔軟でしょう。
私は、Buttonを継承しShortcutKeyプロパティを手作りで追加してやってます。
> [Alt+Hoge]のWindows標準のアクセラレータ機能ですね。
> それで、実現しようとするのはかなり面倒でしょうね。
>
> ムリヤリ実現するには、今カレントなTabを見ればいいんでしょうが、
> ボタンイベントが冗長になってしまいます。
> 後からソースを見た時にもわかりづらいかと・・・
> いっそ、タブからそのボタンを追い出して上げれば上記の方法でもわかりやすいかと。
>
> それがダメなら、手作りでショートカット機能をつけた方が柔軟でしょう。
> 私は、Buttonを継承しShortcutKeyプロパティを手作りで追加してやってます。

はい、かなり面倒です・・・。
なんでこの「複数Tabに同じアクセスキー付のボタン」にこだわっているかというと
開発してるアプリケーションの仕様がリプレース物な為です。
なので、勝手にボタンを外に出したりできないのです。
ModifierKeysプロパティを使用したりしてみたのですが、コードの書き方が下手なせいか
ALTだけ、Aだけという判断になってしまって、なかなか「ALT+A」という判断を
してくれません。
どなたかいい方法はありませんでしょうか・・・
■No5168に返信(ちづるさんの記事)
> はい、かなり面倒です・・・。
> なんでこの「複数Tabに同じアクセスキー付のボタン」にこだわっているかというと
> 開発してるアプリケーションの仕様がリプレース物な為です。
> なので、勝手にボタンを外に出したりできないのです。

つまり、既存箇所の移動または削除はダメってことですか…。
より窮屈になってしまってるんですね。
しかし、「追加」はOKなのではないでしょうか?

> ALTだけ、Aだけという判断になってしまって、なかなか「ALT+A」という判断を
> してくれません。

これの意味がちょっとわかりませんでした。
よろしければコードをコピペして頂けませんか?
■No5176に返信(java.lang.Nullpoさんの記事)
> つまり、既存箇所の移動または削除はダメってことですか…。
> より窮屈になってしまってるんですね。
> しかし、「追加」はOKなのではないでしょうか?

基本は「前の形とまったく同じもの」という条件の為、「追加」も厳しいのが現状です・・・。


> これの意味がちょっとわかりませんでした。
> よろしければコードをコピペして頂けませんか?

KeyDownイベントで処理を行おうとすると、ALTを押した瞬間に処理が走り、そのまま
ロジックを通り抜けてしまうのです。

Private sub KeyDown(〜〜〜〜〜〜)

If e.Alt Then
  If (Control.ModifierKeys = Keys.Alt And e.KeyValue = 65) = True Then
           If アクティブなタブ Then
   各処理
           End If
  End If
End If

こんな感じで書いてます
FormのKeyPreviewをTrueにしておき、以下のコードでやると動きました。
本当はボタンクリックイベント内自体に関数コールを記述して、
Select Case タブ名 で分岐させた方がスマートでしょうね。

  Private Sub frmMain_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
    If e.Modifiers = Keys.Alt Then
      Select Case e.KeyCode
        Case Keys.A
          If タブ名 ・・・
            btnA.PerformClick()
            MessageBox.Show("[&A]のボタンを押下しました。")
          End If

        Case Keys.E
          If タブ名 ・・・
            btnE.PerformClick()
            MessageBox.Show("[&E]のボタンを押下しました。")
          End If
      End Select
    End If
  End Sub
■No5181に返信(java.lang.Nullpoさんの記事)

動きました!
ありがございました!
ちなみにTab内でDataGridを使用していて、グリッド選択時は動いてくれず
グリッド押下時にフォーカスをテキストボックスに移したら、希望どおりの動きになりました。

本当に助かりました!

DOBON.NET | プログラミング道 | プログラミング掲示板