2011-11-04 11 views
12

自分のWinFormのWindowsタスクバーからアドレスツールバーを表示しようとしています。私はアドレスtoobar({01E04581-4EEE-11d0-BFE9-00AA005B4383})のCLSIDを取得することができ、それにIDeskBandの参照を得ることができます。しかし...そして何?ホストIDeskBandとWindowsフォーム

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

私はAxHostでそれをホストしようとしましたが、アドレスツールバーは、ActiveXコントロールではありません。私は

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

または

(deskband as IDockingWindow).ShowDW(true); 

だけでなく、他のインタフェースとそのメソッドを呼び出して、さまざまな試みたが、私は何もどこでも私を取得するようです。そのツールバーがどこにでも現れるのを実際に見ることができれば嬉しいです。しかし、私はIDeskBand参照を持つこととそれを私のWindowsフォームに差し込むこととの間のギャップを橋渡しすることはできません。

誰もこれを以前に試みたことがありますか?

+0

アドレスツールバーのDeskBandから、必要な機能についてさらに詳しく説明できますか?このインターフェイスはWindows 7で廃止されました。今後のバージョンのWindowsではサポートされない可能性があります。 –

+0

私はAddress deskbandとLinksやカスタムウィジェットのような他のデスクバンドを私のWinFormに入れて、タスクバーと同じように表示させたいと思っています。 – deanis

+0

それで、私が実装したいと思うIDeskBandではないかもしれません。私はかなりAddress and LinksツールバーがDeskBand COMオブジェクトであることを確信しています。そのため、私は 'IDeskBand'にジャンプしました。だから私が実際にやろうとしているのは、対象のCOMオブジェクトを照会することです。これは、一致するGUidを取得するために行うことができ、 'Activator.CreateInstance'を使用してインスタンス化します。私のために物事が崩れているところは、WinFormでCOMオブジェクトをホストするためのジャンプをしようとするときです。 – deanis

答えて

1

DeskBandはExplorerによってホストされるはずですので、これはサポートされていないと思われますが、ここでは、これを行う方法を示すサンプルコードがあります。

アイデアは、エクスプローラではなく「サイト」である必要があります。ここで文書Creating Custom Explorer Bars, Tool Bands, and Desk Bandsを見ると、エクスプローラのようにコードが動作するようにする必要があります。だから、机のバンドオブジェクトに "サイト"実装を与えることがまず必要です。この実装で提供する必要がある最初のインターフェイスはIOleWindowです。デスクバンドオブジェクトは親ウィンドウの処理内容を "サイト"に尋ねます。ただ、(例えば)フォームのハンドルを与え、デスクバンドは、フォームの子として自分自身を表示します。

enter image description here

注:それはすでに実装していますので、あなたは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); 
    } 
} 
+0

うーん、聖なる煙、それは働いた!私はちょうどアドレスツールバー、次にタブレットPC入力パネルのツールバーをホストしました。何らかの理由で、リンクが私のために働いていません。それがなぜなのか分かっていれば、私は何かヒントを得るでしょう。私はまた、これらのコントロールのサイズを変更する方法を理解する必要がありますが、少なくとも私は今それらを見ることができます。ありがとうサイモン! – deanis

+0

誰も私はこのツールバーのサイズをどのように考えている?私はいろいろな電話を試したが、運がなかった。 – deanis

関連する問題