[INMN06283]Windows Vista 環境で[F10]キーを押下してもFunctionkeyPress イベントが発生しない
対象製品
InputMan for .NET 4.0J Windows Forms Edition
発生環境
Windows Vista + Microsoft IME / Microsoft Office IME 2007
詳細
この問題はファンクションキーコントロールで発生します。
Windows Vista上で、F10キーを押下した場合ファンクションキーコントロールの
FunctionkeyPressイベントが発生しません。
この問題の原因は、ユーザーがF10キーを押下したとき、ファンクションキーコントロールがそのメッセージを受け取る前に、IMEがメッセージをフックしてしまいます。そのため、メッセージがファンクションキーコントロールまで届かず、F10キー押下してもFunctionKeyPressイベントが発生しない問題が発生します。
Windows Vista上で、F10キーを押下した場合ファンクションキーコントロールの
FunctionkeyPressイベントが発生しません。
この問題の原因は、ユーザーがF10キーを押下したとき、ファンクションキーコントロールがそのメッセージを受け取る前に、IMEがメッセージをフックしてしまいます。そのため、メッセージがファンクションキーコントロールまで届かず、F10キー押下してもFunctionKeyPressイベントが発生しない問題が発生します。
回避方法
この現象を回避するには、FormのProcessKeyPreview メソッドをオーバーライドする方法が考えられます。
以下の例は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
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);
}
}
}
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