[INMN06283]Windows Vista 環境で[F10]キーを押下してもFunctionkeyPress イベントが発生しない

文書番号 : 24268     文書種別 : 制限事項     最終更新日 : 2007/07/04
文書を印刷する
対象製品
InputMan for .NET 4.0J Windows Forms Edition
発生環境
Windows Vista + Microsoft IME / Microsoft Office IME 2007
詳細
この問題はファンクションキーコントロールで発生します。
Windows Vista上で、F10キーを押下した場合ファンクションキーコントロールの
FunctionkeyPressイベントが発生しません。

この問題の原因は、ユーザーがF10キーを押下したとき、ファンクションキーコントロールがそのメッセージを受け取る前に、IMEがメッセージをフックしてしまいます。そのため、メッセージがファンクションキーコントロールまで届かず、F10キー押下してもFunctionKeyPressイベントが発生しない問題が発生します。

回避方法
この現象を回避するには、FormのProcessKeyPreview メソッドをオーバーライドする方法が考えられます。

以下の例はFunctionKeyPressイベントのハンドルに加えてFormのProcessKeyPreviewをオーバーライドした実装例です。

[VB]
Public Class Form1

  ' F10キーが処理されたかどうかのフラグを設定します。
  Private isF10_Processed As Boolean = False

  Protected Overrides Function ProcessKeyPreview(ByRef m As Message) As Boolean

    If m.WParam = CType(Keys.F10, IntPtr) Then
      ' F10が処理されていない場合、処理を実行します。
      If Not Me.isF10_Processed Then
        Const WM_SYSKEYUP As Integer = &H105
        If m.Msg = WM_SYSKEYUP Then
          ' カスタマ処理を実行します。
          ProcessCustomLogic(CType(m.WParam, GrapeCity.Win.Input.ButtonKeys))
        End If
      End If
    End If

    ' フラグを常にクリアします。
    Me.isF10_Processed = False
    Return MyBase.ProcessKeyPreview(m)

  End Function

  Private Sub ProcessCustomLogic(ByVal key As GrapeCity.Win.Input.ButtonKeys)
    ' カスタマ処理を実装します。
    MessageBox.Show(key.ToString() + " が押されました")
  End Sub

  Private Sub FunctionKey1_FunctionKeyPress(ByVal sender As System.Object, ByVal e As GrapeCity.Win.Input.FunctionKeyPressEventArgs) Handles FunctionKey1.FunctionKeyPress
    If e.Key = GrapeCity.Win.Input.ButtonKeys.F10 Then
      ' F10が処理されたことを記録します。
      Me.isF10_Processed = True
    End If

    ' カスタマ処理を実行します。
    Me.ProcessCustomLogic(e.Key)
  End Sub
End Class


[C#]
namespace WindowsFormsApplication1
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    // F10キーが処理されたかどうかのフラグを設定します。
    bool isF10_Processed = false;

    protected override bool ProcessKeyPreview(ref Message m)
    {
      if (m.WParam == (IntPtr)(Keys.F10))
      {
        // F10が処理されていない場合、処理を実行します。
        if (!isF10_Processed)
        {
          const int WM_SYSKEYUP = 0x105;
          if (m.Msg == WM_SYSKEYUP)
          {
            // カスタマ処理を実行します。
            ProcessCustomLogic ((GrapeCity.Win.Input.ButtonKeys)m.WParam);
          }
        }
      }

      // フラグを常にクリアします。
      isF10_Processed = false ;
      return base.ProcessKeyPreview(ref m);
    }

    private void ProcessCustomLogic(GrapeCity.Win.Input.ButtonKeys key)
    {
      // カスタマ処理を実装します。
      MessageBox.Show(key.ToString () + " が押されました");
    }

    private void functionKey1_FunctionKeyPress(object sender, GrapeCity.Win.Input.FunctionKeyPressEventArgs e)
    {
      if (e.Key == GrapeCity.Win.Input.ButtonKeys.F10)
      {
        // F10が処理されたことを記録します。
        isF10_Processed = true;
      }

      // カスタマ処理を実行します。
      ProcessCustomLogic(e.Key);
    }
  }
}

この文書は、以前は次のFAQ IDで公開されていました : 7017