<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">
<rss version="0.91">
<channel>
<title>「Enterキーを押した時、まるでTabキーを押したかのように、次のコントロールにフォーカスを移す」へのコメント</title>
<link>http://dobon.net/cgi-bin/pc/pc.php?mode=v&amp;id=control%2Fenterliketab.html</link>
<description>「Enterキーを押した時、まるでTabキーを押したかのように、次のコントロールにフォーカスを移す」に投稿されたコメントの一覧</description>
<language>ja</language>
<image>
<url>https://dobon.net/banner/dbs1.gif</url>
<link>http://dobon.net/cgi-bin/pc/pc.php?mode=v&amp;id=control%2Fenterliketab.html</link>
<title>「Enterキーを押した時、まるでTabキーを押したかのように、次のコントロールにフォーカスを移す」へのコメント</title>
<width>88</width>
<height>31</height>
</image>
<item>
<title>評価の理由</title>
<link>http://dobon.net/cgi-bin/pc/pc.php?mode=v&amp;id=control%2Fenterliketab.html#23</link>
<description><![CDATA[評価：良い<br>知りたいことが理解できました。ありがとうございます。]]></description>
</item>
<item>
<title>評価の理由</title>
<link>http://dobon.net/cgi-bin/pc/pc.php?mode=v&amp;amp;id=control%2Fenterliketab.html#22</link>
<description><![CDATA[評価：良い<br>It is very helpful to me. Thanks]]></description>
</item>
<item>
<title>通常のコメント</title>
<link>http://dobon.net/cgi-bin/pc/pc.php?mode=v&amp;amp;id=control%2Fenterliketab.html#21</link>
<description><![CDATA[&gt; 「KeyDownイベントを使用する方法」ではTABを２回押した時と同じになりました（２つ移動してしまう）。「ProcessDialogKeyメソッドとProcessTabKeyメソッドを使用する方法」ではうまくいきました。<br><br>私が試した限りでは、KeyDownイベントの方法でも正常に動作しました。KeyDownイベントハンドラを重複して追加していたり、ProcessDialogKeyメソッドの方法と併用しているということはないでしょうか？]]></description>
</item>
<item>
<title>通常のコメント</title>
<link>http://dobon.net/cgi-bin/pc/pc.php?mode=v&amp;amp;id=control%2Fenterliketab.html#20</link>
<description><![CDATA[「KeyDownイベントを使用する方法」ではTABを２回押した時と同じになりました（２つ移動してしまう）。「ProcessDialogKeyメソッドとProcessTabKeyメソッドを使用する方法」ではうまくいきました。VS2013で2.0と4.5で試しました。]]></description>
</item>
<item>
<title>評価の理由</title>
<link>http://dobon.net/cgi-bin/pc/pc.php?mode=v&amp;amp;id=control%2Fenterliketab.html#19</link>
<description><![CDATA[評価：良い<br>keyDownとkeyUpの違いがよくわかりました]]></description>
</item>
<item>
<title>通常のコメント</title>
<link>http://dobon.net/cgi-bin/pc/pc.php?mode=v&amp;amp;id=control%2Fenterliketab.html#18</link>
<description><![CDATA[&gt;&gt; Shiftキーが押されていてもいなくても「SendKeys.Send(&quot;{TAB}&quot;)」とするだけでよかったのかもしれません。<br><br>&gt; なるほど確かに、確認したところ、期待する動作が確認できました。<br><br>ご確認いただき、ありがとうございました。間違ったサンプルでご迷惑をおかけしてしまい、申し訳ありませんでした。記事は近いうちに修正させていただきます。また何かありましたら、よろしくお願いいたします。]]></description>
</item>
<item>
<title>通常のコメント</title>
<link>http://dobon.net/cgi-bin/pc/pc.php?mode=v&amp;amp;id=control%2Fenterliketab.html#17</link>
<description><![CDATA[&gt; Shiftキーが押されていてもいなくても「SendKeys.Send(&quot;{TAB}&quot;)」とするだけでよかったのかもしれません。<br><br>なるほど確かに、確認したところ、期待する動作が確認できました。<br><br>APIを直接呼び出すのと挙動が違ったので不思議に思ってたのですが、なるほど、サンプルではShiftが押された時には+をつけてSendKeys.Send()してましたね。<br><br>ProcessDialogKey()内で、SendKeys.Send(&quot;{TAB}&quot;)を利用して制御するのが最もベストですね。<br>長々とお付き合いいただき、ありがとうございました。]]></description>
</item>
<item>
<title>通常のコメント</title>
<link>http://dobon.net/cgi-bin/pc/pc.php?mode=v&amp;amp;id=control%2Fenterliketab.html#16</link>
<description><![CDATA[&gt; あんな面倒なことしなくても、keybd_eventで十分でした。<br><br>ご報告ありがとうございます。教えていただいたコードを拝見して気が付いたのですが、そもそも私の記事のSendKeysを使ったサンプルが間違えており、Shiftキーが押されていてもいなくても「SendKeys.Send(&quot;{TAB}&quot;)」とするだけでよかったのかもしれません。実際私が試した限りでは、それでうまく行きました。試していただけると、幸いです。]]></description>
</item>
<item>
<title>通常のコメント</title>
<link>http://dobon.net/cgi-bin/pc/pc.php?mode=v&amp;amp;id=control%2Fenterliketab.html#14</link>
<description><![CDATA[あんな面倒なことしなくても、keybd_eventで十分でした。<br>[System.Runtime.InteropServices.DllImport(&quot;user32.dll&quot;, SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]<br>public static extern uint keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);<br><br>protected override bool ProcessDialogKey(Keys keyData)<br>{<br>if (((keyData &amp; Keys.KeyCode) == Keys.Return) &amp;&amp;<br>((keyData &amp; (Keys.Alt | Keys.Control)) == Keys.None))<br>{<br>var vk = (byte)0x0009;    // VK_TAB<br>keybd_event(vk, 0, (uint)0, UIntPtr.Zero);<br>return true;<br>}<br><br>return base.ProcessDialogKey(keyData);<br>}]]></description>
</item>
<item>
<title>通常のコメント</title>
<link>http://dobon.net/cgi-bin/pc/pc.php?mode=v&amp;amp;id=control%2Fenterliketab.html#13</link>
<description><![CDATA[以下で出来ました。未リファクタですがご参考まで。<br><br>[System.Runtime.InteropServices.DllImport(&quot;user32.dll&quot;, SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]<br>public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);<br><br>protected override bool ProcessDialogKey(Keys keyData)<br>{<br>if (((keyData &amp; Keys.KeyCode) == Keys.Return) &amp;&amp;<br>((keyData &amp; (Keys.Alt | Keys.Control)) == Keys.None))<br>{<br>var msg = (uint)0x0100;             // WM_KEYDOWN<br>var wParam = new IntPtr(0x0009);    // VK_TAB<br>var lParam = IntPtr.Zero;<br>PostMessage(this._getActiveControl(this).Handle, msg, wParam, lParam);<br>return true;<br>}<br>return base.ProcessDialogKey(keyData);<br>}<br><br>// 現在フォーカスを得ているコントロールを取得<br>private Control _getActiveControl(ContainerControl cc)<br>{<br>var control = ((ContainerControl)cc).ActiveControl;<br><br>if (control.Focused) { return control; }<br><br>return this._getActiveControl((ContainerControl)control);<br>}]]></description>
</item>
<item>
<title>通常のコメント</title>
<link>http://dobon.net/cgi-bin/pc/pc.php?mode=v&amp;amp;id=control%2Fenterliketab.html#12</link>
<description><![CDATA[&gt; SplitContainerのProcessDialogKeyをオーバーライドして同様のことを行うと、うまくいくようです<br><br>ありがとうございます。<br>確認したところ、期待通りの動作をしました。<br><br>オーバーライドに委ねると、恐らくContainerControlを継承しているコントロールをすべてそうしなければならないのではないかと懸念していましたが、PropertyGrid、ToolStripContainer、ToolStripPanel、UpDownBase、UserControlは問題ないようです。<br><br>全コントロールを試したわけではありませんが、SplitContainerだけが曲者のようです。<br>正直、Formのオーバーライドだけで済ませたいところですが、GetNextControl()、SelectNextControl()による荒業をしないとダメそうでバグの温床になりそうだし、要件にあるなら、ご提示いただいた方法がベストかもですね。<br><br>私の方でも、もし今後、より良い方法論が見つかりましたら、ご連絡させていただきます。]]></description>
</item>
<item>
<title>通常のコメント</title>
<link>http://dobon.net/cgi-bin/pc/pc.php?mode=v&amp;amp;id=control%2Fenterliketab.html#11</link>
<description><![CDATA[&gt; 問題があるのは、SplitContainerでした。<br><br>ご報告ありがとうございます。私も試してみましたが、おっしゃるとおりでした。ProcessTabKeyまたはSelectNextControlを使ってフォーカスを移動させると、うまく行きませんでした。<br><br>SplitContainerのProcessDialogKeyをオーバーライドして同様のことを行うと、うまくいくようです。ただしこの場合、ProcessTabKeyがTrueを返した時だけ「return true」とし、それ以外では「return base.ProcessDialogKey(keyData)」とする必要があります。<br><br>public class SplitContainerEx : SplitContainer<br>{<br>    protected override bool ProcessDialogKey(Keys keyData)<br>    {<br>        if (((keyData &amp; Keys.KeyCode) == Keys.Return) &amp;&amp;<br>            ((keyData &amp; (Keys.Alt | Keys.Control)) == Keys.None))<br>        {<br>            if (this.ProcessTabKey((keyData &amp; Keys.Shift) != Keys.Shift))<br>            {<br>                return true;<br>            }<br>        }<br>        return base.ProcessDialogKey(keyData);<br>    }<br>}<br><br>&gt; Shift+Enter押下時にも、一度は正しく動作しますが、Shiftキーを離さず連続してEnterを押しても、Shiftが認識されず、Enterの動作をしてしまいます。<br><br>私も試してみましたが、そうなりました。SendKeys.Sendは厳しいかもしれませんね...<br><br>もっと良い方法が見つかりましたら、また報告させていただきます。]]></description>
</item>
<item>
<title>通常のコメント</title>
<link>http://dobon.net/cgi-bin/pc/pc.php?mode=v&amp;amp;id=control%2Fenterliketab.html#10</link>
<description><![CDATA[&gt; Panelの内外関係なく次のコントロールにフォーカスが移動し、問題ありませんでした。そちらではうまくいかないでしょうか？<br><br>すみません、いくつか検証した結果、GroupBox、TabControl、Panelは問題ないようでした。<br>問題があるのは、SplitContainerでした。<br><br>C# 2012 .NET Framework 4.5<br><br>【ProcessDialogKeyメソッドとProcessTabKeyメソッドを使用する方法】<br>SplitContainer内の最初のコントロールにフォーカスが移ったあと、更にEnterを押すと、SplitContainer外の次のコントロールにフォーカスしてしまいます。<br>(Tab押下は、SplitContainer内の終端コントロールまで遷移したら、SplitContainer外のコントロールへ遷移する)<br><br>【Tabキーを押した時と同じ動作をさせる別の方法 - SendKeys.Send()】<br>Enter押下時は正しく動作します。<br>Shift+Enter押下時にも、一度は正しく動作しますが、Shiftキーを離さず連続してEnterを押しても、Shiftが認識されず、Enterの動作をしてしまいます。<br>(都度、Shiftを押し直せば期待する動作をしますが、Shift+Tabは、都度Shiftを押す必要がないので、すべての挙動が同じとは言い切れません。)<br><br>SendKeys.Send()の挙動で、なんとかShiftを認識させることができればベストなんですが・・・。<br>なにかお知恵を拝借できたら幸いです。]]></description>
</item>
<item>
<title>通常のコメント</title>
<link>http://dobon.net/cgi-bin/pc/pc.php?mode=v&amp;amp;id=control%2Fenterliketab.html#9</link>
<description><![CDATA[&gt; パネルなどのコンテナ内と外にコントロールが存在するとTabキー通りの遷移をしません。<br><br>「ProcessDialogKeyメソッドとProcessTabKeyメソッドを使用する方法」で試してみました。プロパティを変更していないフォームにPanelコントロールを配置して、その中と外にTexoBoxコントロールを配置しました。この場合は、Enterキーを押すと、Panelの内外関係なく次のコントロールにフォーカスが移動し、問題ありませんでした。そちらではうまくいかないでしょうか？]]></description>
</item>
<item>
<title>通常のコメント</title>
<link>http://dobon.net/cgi-bin/pc/pc.php?mode=v&amp;amp;id=control%2Fenterliketab.html#8</link>
<description><![CDATA[パネルなどのコンテナ内と外にコントロールが存在するとTabキー通りの遷移をしません。<br>SendKeys.Send(&quot;{TAB}&quot;)は試していませんが・・・。]]></description>
</item>
</channel>
</rss>