12

自分の WinForm で Windows タスクバーから Address ツールバーを表示しようとしています。{01E04581-4EEE-11d0-BFE9-00AA005B4383}Address ツールバー ( )の CLSID を取得でき、IDeskBandそれへの参照を取得できます。しかし...その後は?

Guid bandCLSID = new Guid("{01E04581-4EEE-11d0-BFE9-00AA005B4383}");
Type bandType = Type.GetTypeFromCLSID(bandCLSID);
IDeskBand deskband = (IDeskBand)Activator.CreateInstance(bandType);

でホストしようとしましたAxHostが、Address ツールバーは ActiveX コントロールではありません。電話してみた

(deskband as IOleObjectWithSite).SetSite(various interfaces);

また

(deskband as IDockingWindow).ShowDW(true);

他のさまざまなインターフェースとそのメソッドと同様に、私が何をしてもどこにも行かないようです。そのツールバーがどこにでも表示されるのを実際に見ることができれば、私は大喜びです。IDeskBandしかし、参照を持っていることとそれを Windows フォームにプラグインすることの間のギャップを埋めることはできないようです。

以前にこれを試みて、私よりも先に進んだ人はいますか?

4

1 に答える 1

1

DeskBand は Explorer によってホストされるはずなので、これはサポートされていないと思いますが、これを行う方法を示し、開始するのに役立つサンプル フォーム コードを次に示します。

アイデアは、Explorer ではなく、「サイト」である必要があるということです。こちらのドキュメントをご覧になる場合は、カスタム エクスプローラー バー、ツール バンド、およびデスク バンドの作成を参照してください。コードがエクスプローラーの動作と同じように動作することを確認する必要があります。したがって、最初に行うことは、デスク バンド オブジェクトに「Site」実装を与えることです。この実装が提供する必要がある最初のインターフェイスは IOleWindow です。デスク バンド オブジェクトは、「サイト」に親ウィンドウのハンドルを尋ねます。フォームのハンドルを指定するだけで (たとえば)、デスク バンド自体がフォームの子として表示されます。

ここに画像の説明を入力

注: Form または Control クラスを IOleWindow 実装者として使用することはできません。これは、既に舞台裏で実装されているため (Winforms 実装)、この実装は非常に限定的であるため、ここに示すようにカスタム サイトが必要になります。

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private IObjectWithSite _band = (IObjectWithSite)Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("{01E04581-4EEE-11d0-BFE9-00AA005B4383}")));
        private BandSite _site;

        public Form1()
        {
            InitializeComponent();
        }

        protected override void CreateHandle()
        {
            base.CreateHandle();
            if (_site == null)
            {
                _site = new BandSite(Handle);
                _band.SetSite(_site);
            }
        }

        private class BandSite : IOleWindow
        {
            private IntPtr _hwnd;

            public BandSite(IntPtr hwnd)
            {
                _hwnd = hwnd;
            }

            void IOleWindow.GetWindow(out IntPtr hwnd)
            {
                hwnd = _hwnd;
            }

            void IOleWindow.ContextSensitiveHelp(int fEnterMode)
            {
                throw new NotImplementedException();
            }
        }
    }

    [ComImport, Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IObjectWithSite
    {
        void SetSite([MarshalAs(UnmanagedType.IUnknown)] object pUnkSite);

        [return: MarshalAs(UnmanagedType.IUnknown)]
        object GetSite(ref Guid riid);
    }

    [ComImport, Guid("00000114-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IOleWindow
    {
        void GetWindow(out IntPtr hwnd);
        void ContextSensitiveHelp(int fEnterMode);
    }
}
于 2011-12-02T18:08:33.880 に答える