「Enterキーを押した時、まるでTabキーを押したかのように、次のコントロールにフォーカスを移す」へのコメント http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html 「Enterキーを押した時、まるでTabキーを押したかのように、次のコントロールにフォーカスを移す」に投稿されたコメントの一覧 ja https://dobon.net/banner/dbs1.gif http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html 「Enterキーを押した時、まるでTabキーを押したかのように、次のコントロールにフォーカスを移す」へのコメント 88 31 評価の理由 http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#23 知りたいことが理解できました。ありがとうございます。]]> Tue, 02 Jun 2020 21:52:10 +0900 http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#23 評価の理由 http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#22 It is very helpful to me. Thanks]]> Wed, 01 Mar 2017 14:28:36 +0900 http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#22 通常のコメント http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#21
私が試した限りでは、KeyDownイベントの方法でも正常に動作しました。KeyDownイベントハンドラを重複して追加していたり、ProcessDialogKeyメソッドの方法と併用しているということはないでしょうか?]]>
Wed, 24 Jun 2015 00:41:44 +0900 http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#21
通常のコメント http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#20 Thu, 14 May 2015 07:58:45 +0900 http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#20 評価の理由 http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#19 keyDownとkeyUpの違いがよくわかりました]]> Sun, 04 Jan 2015 00:22:53 +0900 http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#19 通常のコメント http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#18
> なるほど確かに、確認したところ、期待する動作が確認できました。

ご確認いただき、ありがとうございました。間違ったサンプルでご迷惑をおかけしてしまい、申し訳ありませんでした。記事は近いうちに修正させていただきます。また何かありましたら、よろしくお願いいたします。]]>
Fri, 14 Nov 2014 01:31:13 +0900 http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#18
通常のコメント http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#17
なるほど確かに、確認したところ、期待する動作が確認できました。

APIを直接呼び出すのと挙動が違ったので不思議に思ってたのですが、なるほど、サンプルではShiftが押された時には+をつけてSendKeys.Send()してましたね。

ProcessDialogKey()内で、SendKeys.Send("{TAB}")を利用して制御するのが最もベストですね。
長々とお付き合いいただき、ありがとうございました。]]>
Thu, 13 Nov 2014 15:21:45 +0900 http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#17
通常のコメント http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#16
ご報告ありがとうございます。教えていただいたコードを拝見して気が付いたのですが、そもそも私の記事のSendKeysを使ったサンプルが間違えており、Shiftキーが押されていてもいなくても「SendKeys.Send("{TAB}")」とするだけでよかったのかもしれません。実際私が試した限りでは、それでうまく行きました。試していただけると、幸いです。]]>
Thu, 13 Nov 2014 01:22:48 +0900 http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#16
通常のコメント http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#14 [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
public static extern uint keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);

protected override bool ProcessDialogKey(Keys keyData)
{
if (((keyData & Keys.KeyCode) == Keys.Return) &&
((keyData & (Keys.Alt | Keys.Control)) == Keys.None))
{
var vk = (byte)0x0009; // VK_TAB
keybd_event(vk, 0, (uint)0, UIntPtr.Zero);
return true;
}

return base.ProcessDialogKey(keyData);
}]]>
Wed, 12 Nov 2014 13:37:15 +0900 http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#14
通常のコメント http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#13
[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

protected override bool ProcessDialogKey(Keys keyData)
{
if (((keyData & Keys.KeyCode) == Keys.Return) &&
((keyData & (Keys.Alt | Keys.Control)) == Keys.None))
{
var msg = (uint)0x0100; // WM_KEYDOWN
var wParam = new IntPtr(0x0009); // VK_TAB
var lParam = IntPtr.Zero;
PostMessage(this._getActiveControl(this).Handle, msg, wParam, lParam);
return true;
}
return base.ProcessDialogKey(keyData);
}

// 現在フォーカスを得ているコントロールを取得
private Control _getActiveControl(ContainerControl cc)
{
var control = ((ContainerControl)cc).ActiveControl;

if (control.Focused) { return control; }

return this._getActiveControl((ContainerControl)control);
}]]>
Wed, 12 Nov 2014 11:40:14 +0900 http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#13
通常のコメント http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#12
ありがとうございます。
確認したところ、期待通りの動作をしました。

オーバーライドに委ねると、恐らくContainerControlを継承しているコントロールをすべてそうしなければならないのではないかと懸念していましたが、PropertyGrid、ToolStripContainer、ToolStripPanel、UpDownBase、UserControlは問題ないようです。

全コントロールを試したわけではありませんが、SplitContainerだけが曲者のようです。
正直、Formのオーバーライドだけで済ませたいところですが、GetNextControl()、SelectNextControl()による荒業をしないとダメそうでバグの温床になりそうだし、要件にあるなら、ご提示いただいた方法がベストかもですね。

私の方でも、もし今後、より良い方法論が見つかりましたら、ご連絡させていただきます。]]>
Mon, 10 Nov 2014 10:02:42 +0900 http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#12
通常のコメント http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#11
ご報告ありがとうございます。私も試してみましたが、おっしゃるとおりでした。ProcessTabKeyまたはSelectNextControlを使ってフォーカスを移動させると、うまく行きませんでした。

SplitContainerのProcessDialogKeyをオーバーライドして同様のことを行うと、うまくいくようです。ただしこの場合、ProcessTabKeyがTrueを返した時だけ「return true」とし、それ以外では「return base.ProcessDialogKey(keyData)」とする必要があります。

public class SplitContainerEx : SplitContainer
{
protected override bool ProcessDialogKey(Keys keyData)
{
if (((keyData & Keys.KeyCode) == Keys.Return) &&
((keyData & (Keys.Alt | Keys.Control)) == Keys.None))
{
if (this.ProcessTabKey((keyData & Keys.Shift) != Keys.Shift))
{
return true;
}
}
return base.ProcessDialogKey(keyData);
}
}

> Shift+Enter押下時にも、一度は正しく動作しますが、Shiftキーを離さず連続してEnterを押しても、Shiftが認識されず、Enterの動作をしてしまいます。

私も試してみましたが、そうなりました。SendKeys.Sendは厳しいかもしれませんね...

もっと良い方法が見つかりましたら、また報告させていただきます。]]>
Mon, 10 Nov 2014 01:08:59 +0900 http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#11
通常のコメント http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#10
すみません、いくつか検証した結果、GroupBox、TabControl、Panelは問題ないようでした。
問題があるのは、SplitContainerでした。

C# 2012 .NET Framework 4.5

【ProcessDialogKeyメソッドとProcessTabKeyメソッドを使用する方法】
SplitContainer内の最初のコントロールにフォーカスが移ったあと、更にEnterを押すと、SplitContainer外の次のコントロールにフォーカスしてしまいます。
(Tab押下は、SplitContainer内の終端コントロールまで遷移したら、SplitContainer外のコントロールへ遷移する)

【Tabキーを押した時と同じ動作をさせる別の方法 - SendKeys.Send()】
Enter押下時は正しく動作します。
Shift+Enter押下時にも、一度は正しく動作しますが、Shiftキーを離さず連続してEnterを押しても、Shiftが認識されず、Enterの動作をしてしまいます。
(都度、Shiftを押し直せば期待する動作をしますが、Shift+Tabは、都度Shiftを押す必要がないので、すべての挙動が同じとは言い切れません。)

SendKeys.Send()の挙動で、なんとかShiftを認識させることができればベストなんですが・・・。
なにかお知恵を拝借できたら幸いです。]]>
Fri, 07 Nov 2014 15:11:35 +0900 http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#10
通常のコメント http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#9
「ProcessDialogKeyメソッドとProcessTabKeyメソッドを使用する方法」で試してみました。プロパティを変更していないフォームにPanelコントロールを配置して、その中と外にTexoBoxコントロールを配置しました。この場合は、Enterキーを押すと、Panelの内外関係なく次のコントロールにフォーカスが移動し、問題ありませんでした。そちらではうまくいかないでしょうか?]]>
Thu, 06 Nov 2014 00:55:58 +0900 http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#9
通常のコメント http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#8 SendKeys.Send("{TAB}")は試していませんが・・・。]]> Wed, 05 Nov 2014 16:02:08 +0900 http://dobon.net/cgi-bin/pc/pc.php?mode=v&id=control%2Fenterliketab.html#8