@msdn=http://search.microsoft.com/search/results.aspx?qu=$$$ @pinvoke=http://pinvoke.net/$$$.htm Summary: Exposes methods to enable and query translucency effects in a deskband object. !!!!C# Definition: [ComImport] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid("79D16DE4-ABEE-4021-8D9D-9169B261D657")] public interface IDeskBand2 { // IOleWindow methods [PreserveSig] int GetWindow(out IntPtr phwnd); [PreserveSig] int ContextSensitiveHelp([In, MarshalAs(UnmanagedType.Bool)] bool fEnterMode); // IDockingWindow methods [PreserveSig] int ShowDW([In, MarshalAs(UnmanagedType.Bool)] bool fShow); [PreserveSig] int CloseDW([In] Int32 dwReserved); [PreserveSig] int ResizeBorderDW(ref RECT rcBorder, [In, MarshalAs(UnmanagedType.IUnknown)] ref object punkToolbarSite, [MarshalAs(UnmanagedType.Bool)] bool fReserved); // IDeskBand methods [PreserveSig] int GetBandInfo([In] Int32 dwBandID, [In] Int32 dwViewMode, [In, Out] ref DESKBANDINFO pdbi); // IDeskband2 methods void CanRenderComposited(out bool pfCanRenderComposited); void SetCompositionState(bool fCompositionEnabled); void GetCompositionState(out bool pfCompositionEnabled); } !!!!VB Definition: <ComImport()> _ <InterfaceType(ComInterfaceType.InterfaceIsDual)> _ <Guid("79D16DE4-ABEE-4021-8D9D-9169B261D657")> _ Public Interface IDeskBand2 Sub GetBandInfo(dwBandID As UInt32, dwViewMode As UInt32, ByRef pdbi As DESKBANDINFO) Sub CanRenderComposited(ByRef pfCanRenderComposited As Boolean) Sub GetCompositionState(ByRef pfCompositionEnabled As Boolean) Sub SetCompositionState(<MarshalAs(UnmanagedType.Bool)> fCompositionEnabled As Boolean) End Interface !!!!User-Defined Types: !!!!Notes: !!!!VB Sample DeskbandObject Class: Imports System.Windows.Forms Imports System.Runtime.InteropServices Imports SHDocVw Imports System.Reflection Imports System.Diagnostics Imports System.Drawing Imports System.ComponentModel Imports Microsoft.Win32 '<Assembly: AssemblyKeyFile("..\..\..\BandObjects.snk")> ''' <summary> ''' Implements generic Band Object functionality. ''' </summary> ''' <example> ''' [Guid("AE07101B-46D4-4a98-AF68-0333EA26E113")] ''' [BandObject("Hello World Bar", BandObjectStyle.Horizontal | BandObjectStyle.ExplorerToolbar , HelpText = "Shows bar that says hello.")] ''' public class HelloWorldBar : BandObject ''' { /*...*/ } ''' </example> Public Class BandObject Inherits UserControl Implements IObjectWithSite ' Implements IDeskBand Implements IDeskBand Implements IDockingWindow Implements IOleWindow Implements IInputObject Implements IDeskBand2 ''' <summary> ''' Reference to the host explorer. ''' </summary> Protected Explorer As WebBrowserClass Protected BandObjectSite As IInputObjectSite ''' <summary> ''' This event is fired after reference to hosting explorer is retreived and stored in Explorer property. ''' </summary> Public Event ExplorerAttached As EventHandler Public Sub New() InitializeComponent() End Sub Private Sub InitializeComponent() Me.SuspendLayout() ' 'BandObject ' Me.BackColor = System.Drawing.Color.Transparent Me.Name = "BandObject" Me.ResumeLayout(False) End Sub ' Function ShowDeskBand(<[In](), MarshalAs(UnmanagedType.Struct)> ByRef clsid As Guid) As Integer Implements IDeskBand2.ShowDeskBand ' End Function ' Function HideDeskBand(<[In](), MarshalAs(UnmanagedType.Struct)> ByRef clsid As Guid) As Integer Implements IDeskBand.HideDeskBand ' End Function ' Function IsDeskBandShown(<[In](), MarshalAs(UnmanagedType.Struct)> ByRef clsid As Guid) As Integer Implements IDeskBand2.IsDeskBandShown 'End Function ' Function DeskBandRegistrationChanged() As Integer Implements IDeskBand2.DeskBandRegistrationChanged ' End Function ''' <summary> ''' Title of band object. Displayed at the left or on top of the band object. ''' </summary> <Browsable(True)> _ <DefaultValue("")> _ Public Property Title() As [String] Get Return _title End Get Set(value As [String]) _title = value End Set End Property Private _title As [String] ''' <summary> ''' Minimum size of the band object. Default value of -1 sets no minimum constraint. ''' </summary> <Browsable(True)> _ <DefaultValue(GetType(Size), "-1,-1")> _ Public Property MinSize() As Size Get Return _minSize End Get Set(value As Size) _minSize = value End Set End Property Private _minSize As New Size(-1, -1) ''' <summary> ''' Maximum size of the band object. Default value of -1 sets no maximum constraint. ''' </summary> <Browsable(True)> _ <DefaultValue(GetType(Size), "-1,-1")> _ Public Property MaxSize() As Size Get Return _maxSize End Get Set(value As Size) _maxSize = value End Set End Property Private _maxSize As New Size(-1, -1) ''' <summary> ''' Says that band object's size must be multiple of this size. Defauilt value of -1 does not set this constraint. ''' </summary> <Browsable(True)> _ <DefaultValue(GetType(Size), "-1,-1")> _ Public Property IntegralSize() As Size Get Return _integralSize End Get Set(value As Size) _integralSize = value End Set End Property Private _integralSize As New Size(-1, -1) Public Overridable Sub GetBandInfo(dwBandID As UInt32, dwViewMode As UInt32, ByRef dbi As DESKBANDINFO) Implements IDeskBand.GetBandInfo, IDeskBand2.GetBandInfo dbi.wszTitle = Me.Title dbi.ptActual.x = Me.Size.Width dbi.ptActual.y = Me.Size.Height dbi.ptMaxSize.x = Me.MaxSize.Width dbi.ptMaxSize.y = Me.MaxSize.Height dbi.ptMinSize.x = Me.MinSize.Width dbi.ptMinSize.y = Me.MinSize.Height dbi.ptIntegral.x = Me.IntegralSize.Width dbi.ptIntegral.y = Me.IntegralSize.Height dbi.dwModeFlags = DBIM.TITLE Or DBIM.ACTUAL Or DBIM.MAXSIZE Or DBIM.MINSIZE Or DBIM.INTEGRAL End Sub Sub CanRenderComposited(ByRef pfCanRenderComposited As Boolean) Implements IDeskBand2.CanRenderComposited pfCanRenderComposited = True End Sub Sub GetCompositionState(ByRef pfCompositionEnabled As Boolean) Implements IDeskBand2.GetCompositionState pfCompositionEnabled = True End Sub Sub SetCompositionState(<MarshalAs(UnmanagedType.Bool)> fCompositionEnabled As Boolean) Implements IDeskBand2.SetCompositionState fCompositionEnabled = True End Sub ''' <summary> ''' Called by explorer when band object needs to be showed or hidden. ''' </summary> ''' <param name="fShow"></param> Public Overridable Sub ShowDW(fShow As Boolean) Implements IDeskBand.ShowDW, IDockingWindow.ShowDW If fShow Then Show() Else Hide() End If End Sub ''' <summary> ''' Called by explorer when window is about to close. ''' </summary> Public Overridable Sub CloseDW(dwReserved As UInt32) Implements IDeskBand.CloseDW, IDockingWindow.CloseDW Dispose(True) End Sub ''' <summary> ''' Not used. ''' </summary> Public Overridable Sub ResizeBorderDW(prcBorder As IntPtr, punkToolbarSite As [Object], fReserved As Boolean) Implements IDeskBand.ResizeBorderDW, IDockingWindow.ResizeBorderDW End Sub Public Overridable Sub GetWindow(ByRef phwnd As System.IntPtr) Implements IDeskBand.GetWindow, IDockingWindow.GetWindow, IOleWindow.GetWindow phwnd = Handle End Sub Public Overridable Sub ContextSensitiveHelp(fEnterMode As Boolean) Implements IDeskBand.ContextSensitiveHelp, IDockingWindow.ContextSensitiveHelp, IOleWindow.ContextSensitiveHelp End Sub Public Overridable Sub SetSite(pUnkSite As [Object]) Implements IObjectWithSite.SetSite If BandObjectSite IsNot Nothing Then Marshal.ReleaseComObject(BandObjectSite) End If If Explorer IsNot Nothing Then Marshal.ReleaseComObject(Explorer) Explorer = Nothing End If BandObjectSite = DirectCast(pUnkSite, IInputObjectSite) If BandObjectSite IsNot Nothing Then 'pUnkSite is a pointer to object that implements IOleWindowSite or something similar 'we need to get access to the top level object - explorer itself 'to allows this explorer objects also implement IServiceProvider interface '(don't mix it with System.IServiceProvider!) 'we get this interface and ask it to find WebBrowserApp Dim sp As _IServiceProvider = TryCast(BandObjectSite, _IServiceProvider) Dim guid As Guid = ExplorerGUIDs.IID_IWebBrowserApp Dim riid As Guid = ExplorerGUIDs.IID_IUnknown Try Dim w As Object sp.QueryService(guid, riid, w) 'once we have interface to the COM object we can create RCW from it Explorer = DirectCast(Marshal.CreateWrapperOfType(TryCast(w, IWebBrowser), GetType(WebBrowserClass)), WebBrowserClass) OnExplorerAttached(EventArgs.Empty) 'we anticipate this exception in case our object instantiated 'as a Desk Band. There is no web browser service available. Catch generatedExceptionName As COMException End Try End If End Sub Public Overridable Sub GetSite(ByRef riid As Guid, ByRef ppvSite As [Object]) Implements IObjectWithSite.GetSite ppvSite = BandObjectSite End Sub ''' <summary> ''' Called explorer when focus has to be chenged. ''' </summary> Public Overridable Sub UIActivateIO(fActivate As Int32, ByRef Msg As MSG) Implements IInputObject.UIActivateIO If fActivate <> 0 Then Dim ctrl As Control = GetNextControl(Me, True) 'first If ModifierKeys = Keys.Shift Then ctrl = GetNextControl(ctrl, False) End If 'last If ctrl IsNot Nothing Then ctrl.[Select]() End If Me.Focus() End If End Sub Public Overridable Function HasFocusIO() As Int32 Implements IInputObject.HasFocusIO Return If(Me.ContainsFocus, 0, 1) 'S_OK : S_FALSE; End Function ''' <summary> ''' Called by explorer to process keyboard events. Undersatands Tab and F6. ''' </summary> ''' <param name="msg"></param> ''' <returns>S_OK if message was processed, S_FALSE otherwise.</returns> Public Overridable Function TranslateAcceleratorIO(ByRef msg As MSG) As Int32 Implements IInputObject.TranslateAcceleratorIO If msg.message = &H100 Then 'WM_KEYDOWN If msg.wParam = CUInt(Keys.Tab) OrElse msg.wParam = CUInt(Keys.F6) Then 'keys used by explorer to navigate from control to control If SelectNextControl(ActiveControl, If(ModifierKeys = Keys.Shift, False, True), True, True, False) Then Return 0 End If End If End If 'S_OK Return 1 'S_FALSE End Function ''' <summary> ''' Override this method to handle ExplorerAttached event. ''' </summary> ''' <param name="ea"></param> Protected Overridable Sub OnExplorerAttached(ea As EventArgs) RaiseEvent ExplorerAttached(Me, ea) End Sub ''' <summary> ''' Notifies explorer of focus change. ''' </summary> Protected Overrides Sub OnGotFocus(e As System.EventArgs) MyBase.OnGotFocus(e) BandObjectSite.OnFocusChangeIS(TryCast(Me, IInputObject), 1) End Sub ''' <summary> ''' Notifies explorer of focus change. ''' </summary> Protected Overrides Sub OnLostFocus(e As System.EventArgs) MyBase.OnLostFocus(e) If ActiveControl Is Nothing Then BandObjectSite.OnFocusChangeIS(TryCast(Me, IInputObject), 0) End If End Sub ''' <summary> ''' Called when derived class is registered as a COM server. ''' </summary> <ComRegisterFunctionAttribute()> _ Public Shared Sub Register(t As Type) Dim guid As String = t.GUID.ToString("B") Dim rkClass As RegistryKey = Registry.ClassesRoot.CreateSubKey("CLSID\" & guid) Dim rkCat As RegistryKey = rkClass.CreateSubKey("Implemented Categories") Dim boa As BandObjectAttribute() = DirectCast(t.GetCustomAttributes(GetType(BandObjectAttribute), False), BandObjectAttribute()) Dim name As String = t.Name Dim help As String = t.Name Dim style As BandObjectStyle = 0 If boa.Length = 1 Then If boa(0).Name IsNot Nothing Then name = boa(0).Name End If If boa(0).HelpText IsNot Nothing Then help = boa(0).HelpText End If style = boa(0).Style End If rkClass.SetValue(Nothing, name) rkClass.SetValue("MenuText", name) rkClass.SetValue("HelpText", help) If 0 <> (style And BandObjectStyle.Vertical) Then rkCat.CreateSubKey("{00021493-0000-0000-C000-000000000046}") End If If 0 <> (style And BandObjectStyle.Horizontal) Then rkCat.CreateSubKey("{00021494-0000-0000-C000-000000000046}") End If If 0 <> (style And BandObjectStyle.TaskbarToolBar) Then rkCat.CreateSubKey("{0DF44EAA-FF21-4412-828E-260A8728E7F1}") End If If 0 <> (style And BandObjectStyle.ExplorerToolbar) Then Registry.LocalMachine.CreateSubKey("SOFTWARE\Microsoft\Internet Explorer\Toolbar").SetValue(guid, name) End If End Sub ''' <summary> ''' Called when derived class is unregistered as a COM server. ''' </summary> <ComUnregisterFunctionAttribute()> _ Public Shared Sub Unregister(t As Type) Dim guid As String = t.GUID.ToString("B") Dim boa As BandObjectAttribute() = DirectCast(t.GetCustomAttributes(GetType(BandObjectAttribute), False), BandObjectAttribute()) Dim style As BandObjectStyle = 0 If boa.Length = 1 Then style = boa(0).Style End If If 0 <> (style And BandObjectStyle.ExplorerToolbar) Then Registry.LocalMachine.CreateSubKey("SOFTWARE\Microsoft\Internet Explorer\Toolbar").DeleteValue(guid, False) End If Registry.ClassesRoot.CreateSubKey("CLSID").DeleteSubKeyTree(guid) End Sub End Class !!!!VB Sample Sample Deskband Class: Imports System.ComponentModel Imports System.Windows.Forms Imports BandObjectLib Imports System.Runtime.InteropServices <Guid("C6FC82EA-AF64-43AF-BA1F-32A634C5FCC7")> _ <BandObject("Hello World Bar", BandObjectStyle.Horizontal Or BandObjectStyle.TaskbarToolBar, HelpText:="Shows bar that says hello.")> _ Public Class HelloWorldBar2 Inherits BandObject Private WithEvents button1 As System.Windows.Forms.Button Private components As System.ComponentModel.Container = Nothing Public Sub New() InitializeComponent() End Sub Protected Overrides Sub Dispose(disposing As Boolean) If disposing Then If components IsNot Nothing Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub #Region "Component Designer generated code" Private Sub InitializeComponent() Me.button1 = New System.Windows.Forms.Button() Me.SuspendLayout() ' 'button1 ' Me.button1.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ Or System.Windows.Forms.AnchorStyles.Left) _ Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) Me.button1.BackColor = System.Drawing.SystemColors.HotTrack Me.button1.ForeColor = System.Drawing.SystemColors.Info Me.button1.Location = New System.Drawing.Point(0, 0) Me.button1.Name = "button1" Me.button1.Size = New System.Drawing.Size(62, 24) Me.button1.TabIndex = 0 Me.button1.Text = "Say Hello" Me.button1.UseVisualStyleBackColor = False ' 'HelloWorldBar2 ' Me.Controls.Add(Me.button1) Me.MinSize = New System.Drawing.Size(150, 24) Me.Name = "HelloWorldBar2" Me.Size = New System.Drawing.Size(62, 24) Me.Title = "Hello Bar" Me.ResumeLayout(False) End Sub #End Region Private Sub button1_Click(sender As Object, e As System.EventArgs) Handles button1.Click MessageBox.Show("ZZZZZZ Hello, World!") End Sub End Class !!!!VB Sample ComIntorp: Imports System.Drawing Imports System.Runtime.InteropServices Imports System.Windows.Forms MustInherit Class ExplorerGUIDs Public Shared ReadOnly IID_IWebBrowserApp As New Guid("{0002DF05-0000-0000-C000-000000000046}") Public Shared ReadOnly IID_IUnknown As New Guid("{00000000-0000-0000-C000-000000000046}") End Class <Flags> _ Public Enum DBIM As UInteger MINSIZE = &H1 MAXSIZE = &H2 INTEGRAL = &H4 ACTUAL = &H8 TITLE = &H10 MODEFLAGS = &H20 BKCOLOR = &H40 End Enum <StructLayout(LayoutKind.Sequential, CharSet := CharSet.Unicode)> _ Public Structure DESKBANDINFO Public dwMask As UInt32 Public ptMinSize As Point Public ptMaxSize As Point Public ptIntegral As Point Public ptActual As Point <MarshalAs(UnmanagedType.ByValTStr, SizeConst := 255)> _ Public wszTitle As [String] Public dwModeFlags As DBIM Public crBkgnd As Int32 End Structure <ComImport> _ <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _ <Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352")> _ Public Interface IObjectWithSite Sub SetSite(<[In], MarshalAs(UnmanagedType.IUnknown)> pUnkSite As [Object]) Sub GetSite(ByRef riid As Guid, <MarshalAs(UnmanagedType.IUnknown)> ByRef ppvSite As [Object]) End Interface <ComImport(), Guid("6D67E846-5B9C-4db8-9CBC-DDE12F4254F1"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _ Public Interface ITrayDeskband <PreserveSig()> _ Function ShowDeskBand(<[In](), MarshalAs(UnmanagedType.Struct)> ByRef clsid As Guid) As Integer <PreserveSig()> _ Function HideDeskBand(<[In](), MarshalAs(UnmanagedType.Struct)> ByRef clsid As Guid) As Integer <PreserveSig()> _ Function IsDeskBandShown(<[In](), MarshalAs(UnmanagedType.Struct)> ByRef clsid As Guid) As Integer <PreserveSig()> _ Function DeskBandRegistrationChanged() As Integer End Interface <ComImport> _ <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _ <Guid("00000114-0000-0000-C000-000000000046")> _ Public Interface IOleWindow Sub GetWindow(ByRef phwnd As System.IntPtr) Sub ContextSensitiveHelp(<[In]> fEnterMode As Boolean) End Interface <ComImport> _ <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _ <Guid("012dd920-7b26-11d0-8ca9-00a0c92dbfe8")> _ Public Interface IDockingWindow Sub GetWindow(ByRef phwnd As System.IntPtr) Sub ContextSensitiveHelp(<[In]> fEnterMode As Boolean) Sub ShowDW(<[In]> fShow As Boolean) Sub CloseDW(<[In]> dwReserved As UInt32) Sub ResizeBorderDW(prcBorder As IntPtr, <[In], MarshalAs(UnmanagedType.IUnknown)> punkToolbarSite As [Object], fReserved As Boolean) End Interface <ComImport()> _ <InterfaceType(ComInterfaceType.InterfaceIsDual)> _ <Guid("79D16DE4-ABEE-4021-8D9D-9169B261D657")> _ Public Interface IDeskBand2 Sub GetBandInfo(dwBandID As UInt32, dwViewMode As UInt32, ByRef pdbi As DESKBANDINFO) Sub CanRenderComposited(ByRef pfCanRenderComposited As Boolean) Sub GetCompositionState(ByRef pfCompositionEnabled As Boolean) Sub SetCompositionState(<MarshalAs(UnmanagedType.Bool)> fCompositionEnabled As Boolean) End Interface <ComImport()> _ <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _ <Guid("EB0FE172-1A3A-11D0-89B3-00A0C90A90AC")> _ Public Interface IDeskBand Sub GetWindow(ByRef phwnd As System.IntPtr) Sub ContextSensitiveHelp(<[In]()> fEnterMode As Boolean) Sub ShowDW(<[In]()> fShow As Boolean) Sub CloseDW(<[In]()> dwReserved As UInt32) Sub ResizeBorderDW(prcBorder As IntPtr, <[In](), MarshalAs(UnmanagedType.IUnknown)> punkToolbarSite As [Object], fReserved As Boolean) Sub GetBandInfo(dwBandID As UInt32, dwViewMode As UInt32, ByRef pdbi As DESKBANDINFO) End Interface <ComImport> _ <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _ <Guid("0000010c-0000-0000-C000-000000000046")> _ Public Interface IPersist Sub GetClassID(ByRef pClassID As Guid) End Interface <ComImport> _ <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _ <Guid("00000109-0000-0000-C000-000000000046")> _ Public Interface IPersistStream Sub GetClassID(ByRef pClassID As Guid) Sub IsDirty() Sub Load(<[In], MarshalAs(UnmanagedType.[Interface])> pStm As [Object]) Sub Save(<[In], MarshalAs(UnmanagedType.[Interface])> pStm As [Object], <[In]> fClearDirty As Boolean) Sub GetSizeMax(<Out> ByRef pcbSize As UInt64) End Interface <ComImport> _ <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _ <Guid("6d5140c1-7436-11ce-8034-00aa006009fa")> _ Public Interface _IServiceProvider Sub QueryService(ByRef guid As Guid, ByRef riid As Guid, <MarshalAs(UnmanagedType.[Interface])> ByRef Obj As [Object]) End Interface <ComImport> _ <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _ <Guid("68284faa-6a48-11d0-8c78-00c04fd918b4")> _ Public Interface IInputObject Sub UIActivateIO(fActivate As Int32, ByRef msg As MSG) '[return:MarshalAs(UnmanagedType.Error)] <PreserveSig> _ Function HasFocusIO() As Int32 <PreserveSig> _ Function TranslateAcceleratorIO(ByRef msg As MSG) As Int32 End Interface <ComImport> _ <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _ <Guid("f1db8392-7331-11d0-8c99-00a0c92dbfe8")> _ Public Interface IInputObjectSite <PreserveSig> _ Function OnFocusChangeIS(<MarshalAs(UnmanagedType.IUnknown)> punkObj As [Object], fSetFocus As Int32) As Int32 End Interface Public Structure POINT Public x As Int32 Public y As Int32 End Structure Public Structure MSG Public hwnd As IntPtr Public message As UInt32 Public wParam As UInt32 Public lParam As Int32 Public time As UInt32 Public pt As POINT End Structure !!!!VB Sample Attributes: Imports System.Runtime.InteropServices Imports System.Reflection ''' <summary> ''' Represents different styles of a band object. ''' </summary> <Flags> _ <Serializable> _ Public Enum BandObjectStyle As UInteger Vertical = 1 Horizontal = 2 ExplorerToolbar = 4 TaskbarToolBar = 8 End Enum ''' <summary> ''' Specifies Style of the band object, its Name(displayed in explorer menu) and HelpText(displayed in status bar when menu command selected). ''' </summary> <AttributeUsage(AttributeTargets.[Class])> _ Public Class BandObjectAttribute Inherits System.Attribute Public Sub New() End Sub Public Sub New(name__1 As String, style__2 As BandObjectStyle) Name = name__1 Style = style__2 End Sub Public Style As BandObjectStyle Public Name As String Public HelpText As String End Class Documentation: IDeskBand2@msdn on MSDN
Edit Interfaces.IDeskBand
You do not have permission to change this page. If you feel this is in error, please send feedback with the contact link on the main page.