none
RdpViewerコンポーネントに対するキーボード/マウスイベントをカスタマイズしたい RRS feed

  • 質問

  • WDS API のビューア側アプリケーションにおいてキーボードイベントをカスタマイズしようとしています。
    例えば以下のような処理を行いたいと考えています。

    ・[F1]キーを実行すると、相手側ではなく、自機に反映させる。
    ・[F12]キーを実行すると、設定画面を表示する。
    ・特定のキー、もしくは [Ctrl]キーと組み合わせて実行すると設定画面を表示する。
    といった処理です。

    しかし、アプリケーションウィンドウでキー入力をしても、ボタンやエディットボックスにフォーカスがあるときはKeyDown や KeyPress、KeyUpでメッセージを取得できますが、RdpViewerにフォーカスと合わせるとメッセージを取得できずに相手(Sharer)側にキーメッセージを送ってしまいます。

    アプリケーションウィンドウではなく、RdpViewerコンポーネントに対してイベント処理の設定をしようとしましたが、プロパティウィンドウのイベントにはKeyDownなどのイベントが表示されないため、直接、以下のコードを記述してみましたが、これでもキーイベントは取得できませんでした。
    また、マウスイベントも同様に取得できません。

     // WinSharer側との接続が確立
     private void OnConnectionEstablished(object sender, EventArgs e)
     {
      this.pRdpViewer.KeyPress += new KeyPressEventHandler(this.RdpViewer_KeyPress);
      this.pRdpViewer.KeyDown += new KeyEventHandler(this.RdpViewer_KeyDown);
      this.pRdpViewer.KeyUp += new KeyEventHandler(this.RdpViewer_KeyUp);
     }

     // KeyDownメッセージ
     private void RdpViewer_KeyDown(object sender, KeyEventArgs e)
     {
      System.Diagnostics.Debug.Write("RdpViewer_KeyDown (" + e.KeyCode.ToString() + ")\n");
     }

     // KeyPressメッセージ
     private void RdpViewer_KeyPress(object sender, KeyPressEventArgs e)
     {
      System.Diagnostics.Debug.Write("RdpViewer_KeyPress (" + e.KeyChar.ToString() + ")\n");
      //e.Handled = true;
     }

     // KeyUpメッセージ
     private void RdpViewer_KeyUp(object sender, KeyEventArgs e)
     {
      System.Diagnostics.Debug.Write("RdpViewer_KeyUp (" + e.KeyCode.ToString() + ")\n");
     }

    もし、WDSを使用したデスクトップ共有において、キーボード、マウスイベントのカスタマイズについての情報がありましたらアドバイス願います。
    以上、よろしくお願いします。


    マンモス
    2010年4月20日 7:31

すべての返信

  • // まったく確認していません。

    IMessageFilter.PreFilterMessage を使って、WM_KEYDOWN や WM_KEYUP、マウス関連のメッセージなどを奪うのはどうでしょうか?

    2010年4月20日 7:50
  • アドバイスありがとうございます。

    PreFilterMessage の方が KeyDown よりも先にメッセージを取得できることがドキュメントに記載されていましたので、期待を持って試してみましたが、どうも RDPViewer にフォーカスを合わせるとメッセージを取得できず、相手にキーメッセージが送られてしまいます。
    KeyDown同様、他のコントロールにフォーカスがあるときはキーメッセージを取得できます。

    今回、IMessageFilter 実装で追加したコードは以下の通りです。

    namespace WinViewer
    {
     public partial class WinViewer : Form
     {
      // ■IMessageFilter追加
      public class MessageFilter : IMessageFilter
      {
       private const int WM_KEYDOWN = 0x100;

       public bool PreFilterMessage(ref Message m)
       {
        if (m.Msg == WM_KEYDOWN)
        {
         MessageBox.Show("MessageFilter:" + m.WParam.ToString("X") + "キーが入力されました");
        }
        return false;
       }
      }
      private MessageFilter _messageFilter = new MessageFilter(); // ■IMessageFilter追加

      private void WinViewer_Load(object sender, EventArgs e)
      {
       Application.AddMessageFilter(_messageFilter); // ■IMessageFilter追加
      }
      // ...
     }
    }

    もう少し調査します。
    ありがとうございました。


    マンモス
    2010年4月21日 8:15