3

C# で IE ツールバーを作成しましたが、ツールバーから子 Windows フォームを開くと、子フォームでタブ キーが機能せず、フィールドからフィールドに移動できないことを除いて、すべて正常に動作しています。

興味深いのは、form.show() の代わりに form.showDialog() を使用して子フォームを開くと、タブが通常どおりに機能することです。

私が作成したツールバーは、この記事とこの記事に基づいています

いくつかの記事で述べたように、TranslateAcceleratorIO を実装しましたが、まだ運がありません。

これが TranslateAcceleratorIO() と HasFocusIO() の実装です (ツールバンド クラスに実装されています)。

        [DllImport("user32.dll")]
        public static extern int TranslateMessage(ref MSG lpMsg);

        [DllImport("user32", EntryPoint = "DispatchMessage")]
        static extern bool DispatchMessage(ref MSG msg);

        public int HasFocusIO()
        {                            
            return this.ContainsFocus ? 0 : 1; //S_OK : S_FALSE;
        }

        public int TranslateAcceleratorIO(ref MSG msg)
        {                
            if (msg.message == 0x100)//WM_KEYDOWN
                if (msg.wParam == (uint)Keys.Tab || msg.wParam ==(uint)Keys.F6)
                {
                    if (SelectNextControl(
                            ActiveControl,
                            ModifierKeys == Keys.Shift ? false : true,
                            true,
                            true,
                            false)
                        )
                    {
                        return 0;//S_OK
                    }
                }
                else
                {                        
                    TranslateMessage(ref msg);
                    DispatchMessage(ref msg);
                    return 0;//S_OK
                }
            return 1;//S_FALSE
        }

私はまた、このような TranslateAccelerator を試してみましたが、運がありませんでした:

   public int TranslateAcceleratorIO(ref MSG msg)
    {

        TranslateMessage(ref msg);
        DispatchMessage(ref msg);
        return 0;//S_OK
    }

他の誰かがこの問題に遭遇しましたか?

4

2 に答える 2

1

HasFocusIOも実装していますか?メインのツールバー クラスも HasFocusIO を実装して true を返す必要があると思います。

IE ツールバーに関するこの種の問題は、しばらくの間、私の人生の悩みの種でした。私が最終的に行ったのは、個別の UI スレッドを作成し、それらのスレッドでダイアログをモーダルにすることでした。これにより、一連の奇妙な問題が解消されました。しかし、HasFocusIO と TranslateAcceleratorIO の実装は、この特定のものでうまくいくはずです。

于 2008-10-20T21:29:23.243 に答える
0

これらをどこで実装していますか?そこにあるものから判断するのは難しいですが、それらをフォームに実装していますか、それともデスクバンド クラスに実装していますか?

それらを DeskBand 実装に実装する必要があり、HasFocusIO は (ツールバーにフォーカスがあるときだけでなく) ウィンドウの 1 つにフォーカスがあるときはいつでも true を返す必要があります。次に、Tab、Delete、矢印キーなどのメッセージをデスクバンド内の TranslateAcceleratorIO にディスパッチし、そこからフォームに渡す必要があります。

IE プラグイン フレームワークは、このように信じられないほどハックです。

于 2008-10-21T15:31:26.757 に答える