2011-11-04 2 views
12

내 Windows 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 레퍼런스를 갖는 것과 윈도우 폼에 끼워 넣는 것 사이의 격차를 좁히지 못하는 것 같다.

아무도 이것을 시도한 적이 없으며 내가 가지고있는 것보다 더 많이 얻었습니까?

+0

주소 도구 모음 DeskBand에서 필요한 기능에 대한 자세한 정보를 제공 할 수 있습니까? 이 인터페이스는 Windows 7부터 사용되지 않으므로 향후 Windows 버전에서는 지원되지 않을 수 있습니다. –

+0

저는 Deskband와 Links 나 Custom BAND 같은 다른 deskbands를 WinForm에 넣고 작업 표시 줄에 나타나게하고 싶습니다. – deanis

+0

그래서 구현하고자하는 'IDeskBand'가 아닐 수도 있습니다. 나는 주소와 링크 도구 모음이 DeskBand COM 객체라는 것을 확신합니다. 그래서 나는'IDeskBand'로 점프했습니다. 그래서 내가 실제로하려고하는 것은 대상 COM 객체를 쿼리하는 것입니다.이 객체는 일치하는 Guid를 얻기 위해 할 수 있습니다. Activate.CreateInstance로 인스턴스화합니다. 내가 WinForm에서 COM 개체를 호스팅하기 위해 점프하려고 할 때 상황이 나 빠지게되는 경우가 있습니다. – deanis

답변

1

DeskBand는 Explorer에서 호스팅하기로되어 있기 때문에 지원되지 않는다고 생각합니다. 그러나 여기에 예제 코드를 작성하여 시작하는 방법을 보여줍니다.

아이디어는 탐색기 대신 "사이트"가되어야한다는 것입니다. 여기 Creating Custom Explorer Bars, Tool Bands, and Desk Bands 설명서를 보면 코드가 탐색기처럼 작동하는지 확인해야합니다. 그래서, 할 일은 책상 밴드 객체에 "Site"구현을 제공하는 것이며,이 구현이 제공해야하는 첫 번째 인터페이스는 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

잘 거룩한 담배, 그 일했다! 방금 주소 도구 모음과 Tablet PC 입력 판 도구 모음을 호스팅했습니다. 어떤 이유로 링크가 저를 위해 작동하지 않습니다. 왜 그런지 모르겠다면, 나는 어떤 조언도하고 싶습니다. 나는 또한 이러한 컨트롤의 크기를 조정하는 방법을 알아야하지만 적어도 지금은 볼 수 있습니다. 감사합니다 사이먼! – deanis

+0

누구나이 도구 막대의 크기를 어떻게 조정할 수 있는지 알고 계십니까? 여러 가지 다른 전화를 시도했지만 운이 없었습니다. – deanis

관련 문제