作成日: 2026/02/10 最終更新日: 2026/02/10
文書種別
不具合
発生環境
.NET 8
状況
回避方法あり
詳細
C1TextBox などの C1 Input コントロール に フォーカスが当たっている状態で、this.ProcessTabKey(false) メソッド を呼び出してフォーカスを逆方向へ移動しようとしても、正常にフォーカスが遷移しません。
ProcessCmdKey イベントなどで、ProcessTabKeyメソッド を実行した場合の結果は以下の通りとなります。
- 正方向(前方)への移動:`ProcessTabKey(true)` は期待どおり動作
- 逆方向(後方)への移動:`ProcessTabKey(false)` はフォーカスが移動せず失敗
ProcessCmdKey イベントなどで、ProcessTabKeyメソッド を実行した場合の結果は以下の通りとなります。
- 正方向(前方)への移動:`ProcessTabKey(true)` は期待どおり動作
- 逆方向(後方)への移動:`ProcessTabKey(false)` はフォーカスが移動せず失敗
回避方法
【回避方法1】
次にフォーカス可能なコントロールを探し、GetNextControl メソッドでフォーカスを移動します。
◎サンプルコード(C#)
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
var keyCode = keyData & Keys.KeyCode;
bool hasShift = (keyData & Keys.Shift) == Keys.Shift;
bool isEnter = keyCode == Keys.Enter;
bool goForward = !hasShift; // Shiftキーが押されていなければ前方へ移動する
if (isEnter)
{
Control? nc = this.ActiveControl;
// Shift+Enter で 逆方向に移動している時のみ C1InputHost の親取得
if (goForward == false && nc?.Parent is C1InputHost)
nc = nc.Parent;
// 次のフォーカス可能なコントロールを探す
do
{
nc = this.GetNextControl(nc, goForward);
if (nc == null)
nc = this.GetNextControl(null, goForward);
} while (nc != null && !(nc.CanFocus && !(nc is Label)));
nc?.Focus();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
【回避方法2】
ProcessTabKey の代わりに、 SendKeys.Send メソッドでTAB キーの入力操作を行うことでShift + TAB キーの動作を再現し、フォーカスを後方に移動します。
◎サンプルコード(C#)
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
// 各キーが押されているかどうかを確認
var keyCode = keyData & Keys.KeyCode;
bool hasShift = (keyData & Keys.Shift) == Keys.Shift;
bool isEnter = keyCode == Keys.Enter;
bool isTab = keyCode == Keys.Tab;
// Shift 単体は処理終了
if (keyCode == Keys.ShiftKey || keyCode == Keys.LShiftKey || keyCode == Keys.RShiftKey)
return base.ProcessCmdKey(ref msg, keyData);
// 現在のキー押下情報をデバッグ出力
Debug.WriteLine($"ProcessCmdKey: keyData={keyData}, hasShift={hasShift}");
if (isEnter && !hasShift)
{
// Enter → 次へ(Tab相当)
this.ProcessTabKey(true);
return true;
}
else if (isEnter && hasShift)
{
//// Shift + Enter → 前へ(Shift +Tab 相当)
//this.ProcessTabKey(false); // ただし、C1コントロールでうまく動作しない
// Tabキーを送る
// Shift キーは押しているので、Tab キーを追加して、Shift+ Tab 相当の動作をさせる
BeginInvoke(() => SendKeys.SendWait("{TAB}"));
//BeginInvoke(() => SendKeys.SendWait("+{TAB}")); // こちらでもよいが、Shift キーを押した状態は解除される
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}