タッチキーボードを使用するとPreviewKeyDownなどのキー押下のイベントが発生しない

文書番号 : 41707     文書種別 : 制限事項     登録日 : 2018/03/16     最終更新日 : 2018/03/16
文書を印刷する
対象製品
MultiRow for Windows Forms 10.0J
詳細
この現象はシステムから送られるメッセージの順序が通常のキーボードとタッチキーボードで異なることが原因となります。
通常のキーボードの場合、キーが押された際のWM_KEYDOWNメッセージはWM_IME_STARTCOMPOSITIONより前に発生します。しかし、タッチキーボードの場合、WM_KEYDOWNメッセージはWM_IME_STARTCOMPOSITIONメッセージの後に発生します。

MultiRowはWM_IME_STARTCOMPOSITIONメッセージを受け取ることで編集を開始しフォーカスが編集コントロールに移動する実装となっております。そのため、タッチキーボードの場合には、MultiRowはWM_KEYDOWNメッセージを取得できず、結果としてPreviewKeyDownなどのキー押下のイベントを発生させるタイミングがありません。

上記によりこの動作はOSと製品の実装方法による制限となります。
回避方法
セルの編集開始をイベントとして取得したい場合にはPreviewKeyDownなどのキー押下のイベントではなく、MultiRowのセルが変更されたときやコントロールが入力フォーカスを受け取ったときに発生するCellEnterイベントおよびShownイベントを使用することで回避できます。以下の回避コードを参考に対応をご検討ください。

◎サンプルコード(VB)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  ' セル型の作成
  Dim textCell1 As New TextBoxCell()
  textCell1.Style.ImeMode = ImeMode.Hiragana
  ' MultiRowの設定
  GcMultiRow1.Template = Template.CreateGridTemplate(New GrapeCity.Win.MultiRow.Cell() {textCell1})
  GcMultiRow1.RowCount = 5
End Sub

' 初期表示のセルを編集モードにする
Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
  GcMultiRow1.BeginEdit(False)
End Sub

' セル移動時に編集モードにする
Private Sub GcMultiRow1_CellEnter(sender As Object, e As CellEventArgs) Handles GcMultiRow1.CellEnter
  GcMultiRow1.BeginEdit(False)
End Sub

◎サンプルコード(C#)
private void Form1_Load(object sender, EventArgs e)
{
  // セル型の作成
  TextBoxCell textCell1 = new TextBoxCell();
  textCell1.Style.ImeMode = ImeMode.Hiragana;
  // MultiRowの設定
  gcMultiRow1.Template = Template.CreateGridTemplate(new GrapeCity.Win.MultiRow.Cell[] { textCell1 });
  gcMultiRow1.RowCount = 5;
}

// 初期表示のセルを編集モードにする
private void Form1_Shown(object sender, EventArgs e)
{
  gcMultiRow1.BeginEdit(false);
}

// セル移動時に編集モードにする
private void gcMultiRow1_CellEnter(object sender, CellEventArgs e)
{
  gcMultiRow1.BeginEdit(false);
}