Click here to Skip to main content
15,886,788 members
Articles / Desktop Programming / Windows Forms

Clipz - A Friendly Introduction to the Windows 7 Taskbar Features

Rate me:
Please Sign up or sign in to vote.
4.91/5 (57 votes)
17 Dec 2009CPOL9 min read 71.8K   1.6K   123  
An overview of the Windows 7 taskbar features, and how to use then in your own applications.
//Copyright (c) Microsoft Corporation.  All rights reserved.

using System;

namespace Microsoft.WindowsAPICodePack.Shell.PropertySystem
{
    #region Property System Enumerations

    /// <summary>
    /// Delineates the format of a property string.
    /// </summary>
    /// <remarks>
    /// Typically use one, or a bitwise combination of 
    /// these flags, to specify the format. Some flags are mutually exclusive, 
    /// so combinations like <c>ShortTime | LongTime | HideTime</c> are not allowed.
    /// </remarks>
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1714:FlagsEnumsShouldHavePluralNames"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1008:EnumsShouldHaveZeroValue", Justification = "This is following the native API"), Flags]
    public enum PropertyDescriptionFormat
    {
        /// <summary>
        /// The format settings specified in the property's .propdesc file.
        /// </summary>
        Default = 0,

        /// <summary>
        /// The value preceded with the property's display name.
        /// </summary>
        /// <remarks>
        /// This flag is ignored when the <c>hideLabelPrefix</c> attribute of the <c>labelInfo</c> element 
        /// in the property's .propinfo file is set to true.
        /// </remarks>
        PrefixName = 0x1,

        /// <summary>
        /// The string treated as a file name.
        /// </summary>
        FileName = 0x2,

        /// <summary>
        /// The sizes displayed in kilobytes (KB), regardless of size. 
        /// </summary>
        /// <remarks>
        /// This flag applies to properties of <c>Integer</c> types and aligns the values in the column. 
        /// </remarks>
        AlwaysKB = 0x4,

        /// <summary>
        /// Reserved.
        /// </summary>
        RightToLeft = 0x8,

        /// <summary>
        /// The time displayed as 'hh:mm am/pm'.
        /// </summary>
        ShortTime = 0x10,

        /// <summary>
        /// The time displayed as 'hh:mm:ss am/pm'.
        /// </summary>
        LongTime = 0x20,

        /// <summary>
        /// The time portion of date/time hidden.
        /// </summary>
        HideTime = 64,

        /// <summary>
        /// The date displayed as 'MM/DD/YY'. For example, '3/21/04'.
        /// </summary>
        ShortDate = 0x80,

        /// <summary>
        /// The date displayed as 'DayOfWeek Month day, year'. 
        /// For example, 'Monday, March 21, 2004'.
        /// </summary>
        LongDate = 0x100,

        /// <summary>
        /// The date portion of date/time hidden.
        /// </summary>
        HideDate = 0x200,

        /// <summary>
        /// The friendly date descriptions, such as "Yesterday".
        /// </summary>
        RelativeDate = 0x400,

        /// <summary>
        /// The text displayed in a text box as a cue for the user, such as 'Enter your name'.
        /// </summary>
        /// <remarks>
        /// The invitation text is returned if formatting failed or the value was empty. 
        /// Invitation text is text displayed in a text box as a cue for the user, 
        /// Formatting can fail if the data entered 
        /// is not of an expected type, such as putting alpha characters in 
        /// a phone number field.
        /// </remarks>
        UseEditInvitation = 0x800,

        /// <summary>
        /// This flag requires UseEditInvitation to also be specified. When the 
        /// formatting flags are ReadOnly | UseEditInvitation and the algorithm 
        /// would have shown invitation text, a string is returned that indicates 
        /// the value is "Unknown" instead of the invitation text.
        /// </summary>
        ReadOnly = 0x1000,

        /// <summary>
        /// The detection of the reading order is not automatic. Useful when converting 
        /// to ANSI to omit the Unicode reading order characters.
        /// </summary>
        NoAutoReadingOrder = 0x2000,

        /// <summary>
        /// Smart display of DateTime values
        /// </summary>
        SmartDateTime = 0x4000
    }

    /// <summary>
    /// Specifies the display types for a property.
    /// </summary>
    public enum PropertyDisplayType
    {
        /// <summary>
        /// The String Display. This is the default if the property doesn't specify a display type.
        /// </summary>
        String = 0,

        /// <summary>
        /// The Number Display.
        /// </summary>
        Number = 1,

        /// <summary>
        /// The Boolean Display.
        /// </summary>
        Boolean = 2,

        /// <summary>
        /// The DateTime Display.
        /// </summary>
        DateTime = 3,

        /// <summary>
        /// The Enumerated Display.
        /// </summary>
        Enumerated = 4
    }

    /// <summary>
    /// Property Aggregation Type
    /// </summary>
    public enum PropertyAggregationType
    {
        /// <summary>
        /// The string "Multiple Values" is displayed.
        /// </summary>
        Default = 0,

        /// <summary>
        /// The first value in the selection is displayed.
        /// </summary>
        First = 1,

        /// <summary>
        /// The sum of the selected values is displayed. This flag is never returned 
        /// for data types VT_LPWSTR, VT_BOOL, and VT_FILETIME.
        /// </summary>
        Sum = 2,

        /// <summary>
        /// The numerical average of the selected values is displayed. This flag 
        /// is never returned for data types VT_LPWSTR, VT_BOOL, and VT_FILETIME.
        /// </summary>
        Average = 3,

        /// <summary>
        /// The date range of the selected values is displayed. This flag is only 
        /// returned for values of the VT_FILETIME data type.
        /// </summary>
        DateRange = 4,

        /// <summary>
        /// A concatenated string of all the values is displayed. The order of 
        /// individual values in the string is undefined. The concatenated 
        /// string omits duplicate values; if a value occurs more than once, 
        /// it only appears a single time in the concatenated string.
        /// </summary>
        Union = 5,

        /// <summary>
        /// The highest of the selected values is displayed.
        /// </summary>
        Max = 6,

        /// <summary>
        /// The lowest of the selected values is displayed.
        /// </summary>
        Min = 7
    }

    /// <summary>
    /// Property Enumeration Types
    /// </summary>
    public enum PropEnumType
    {
        /// <summary>
        /// Use DisplayText and either RangeMinValue or RangeSetValue.
        /// </summary>
        DiscreteValue = 0,

        /// <summary>
        /// Use DisplayText and either RangeMinValue or RangeSetValue
        /// </summary>
        RangedValue = 1,

        /// <summary>
        /// Use DisplayText
        /// </summary>
        DefaultValue = 2,

        /// <summary>
        /// Use Value or RangeMinValue
        /// </summary>
        EndRange = 3
    };

    /// <summary>
    /// Describes how a property should be treated for display purposes.
    /// </summary>
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1714:FlagsEnumsShouldHavePluralNames"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1008:EnumsShouldHaveZeroValue"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2217:DoNotMarkEnumsWithFlags"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1028:EnumStorageShouldBeInt32", Justification = "This is following the native API"), Flags]
    public enum PropertyColumnState : uint
    {
        /// <summary>
        /// Default value
        /// </summary>
        DefaultValue = 0x00000000,

        /// <summary>
        /// The value is displayed as a string.
        /// </summary>
        StringType = 0x00000001,

        /// <summary>
        /// The value is displayed as an integer.
        /// </summary>
        IntegerType = 0x00000002,

        /// <summary>
        /// The value is displayed as a date/time.
        /// </summary>
        DateType = 0x00000003,

        /// <summary>
        /// A mask for display type values StringType, IntegerType, and DateType.
        /// </summary>
        TypeMask = 0x0000000f,

        /// <summary>
        /// The column should be on by default in Details view.
        /// </summary>
        OnByDefault = 0x00000010,

        /// <summary>
        /// Will be slow to compute. Perform on a background thread.
        /// </summary>
        Slow = 0x00000020,

        /// <summary>
        /// Provided by a handler, not the folder.
        /// </summary>
        Extended = 0x00000040,

        /// <summary>
        /// Not displayed in the context menu, but is listed in the More... dialog.
        /// </summary>
        SecondaryUI = 0x00000080,

        /// <summary>
        /// Not displayed in the user interface (UI).
        /// </summary>
        Hidden = 0x00000100,

        /// <summary>
        /// VarCmp produces same result as IShellFolder::CompareIDs.
        /// </summary>
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Perfer", Justification = "This is following the native API")]
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Cmp", Justification = "This is following the native API")]
        PerferVarCmp = 0x00000200,

        /// <summary>
        /// PSFormatForDisplay produces same result as IShellFolder::CompareIDs.
        /// </summary>
        PreferFormatForDisplay = 0x00000400,

        /// <summary>
        /// Do not sort folders separately.
        /// </summary>
        NoSortByFolders = 0x00000800,

        /// <summary>
        /// Only displayed in the UI.
        /// </summary>
        ViewOnly = 0x00010000,

        /// <summary>
        /// Marks columns with values that should be read in a batch.
        /// </summary>
        BatchRead = 0x00020000,

        /// <summary>
        /// Grouping is disabled for this column.
        /// </summary>
        NoGroupBy = 0x00040000,

        /// <summary>
        /// Can't resize the column.
        /// </summary>
        FixedWidth = 0x00001000,

        /// <summary>
        /// The width is the same in all dots per inch (dpi)s.
        /// </summary>
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "DPI", Justification = "This is following the native API")]
        NoDPIScale = 0x00002000,

        /// <summary>
        /// Fixed width and height ratio.
        /// </summary>
        FixedRatio = 0x00004000,

        /// <summary>
        /// Filters out new display flags.
        /// </summary>
        DisplayMask = 0x0000F000,
    }

    /// <summary>
    /// Specifies the condition type to use when displaying the property in the query builder user interface (UI).
    /// </summary>
    public enum PropertyConditionType
    {
        /// <summary>
        /// The default condition type.
        /// </summary>
        None = 0,

        /// <summary>
        /// The string type.
        /// </summary>
        String = 1,

        /// <summary>
        /// The size type.
        /// </summary>
        Size = 2,

        /// <summary>
        /// The date/time type.
        /// </summary>
        DateTime = 3,

        /// <summary>
        /// The Boolean type.
        /// </summary>
        Boolean = 4,

        /// <summary>
        /// The number type.
        /// </summary>
        Number = 5,
    }

    /// <summary>
    /// Provides a set of flags to be used with IConditionFactory, 
    /// ICondition, and IConditionGenerator to indicate the operation.
    /// </summary>
    public enum PropertyConditionOperation
    {
        /// <summary>
        /// The implicit comparison between the value of the property and the value of the constant.
        /// </summary>
        Implicit,

        /// <summary>
        /// The value of the property and the value of the constant must be equal.
        /// </summary>
        Equal,

        /// <summary>
        /// The value of the property and the value of the constant must not be equal.
        /// </summary>
        NotEqual,

        /// <summary>
        /// The value of the property must be less than the value of the constant.
        /// </summary>
        LessThan,

        /// <summary>
        /// The value of the property must be greater than the value of the constant.
        /// </summary>
        GreaterThan,

        /// <summary>
        /// The value of the property must be less than or equal to the value of the constant.
        /// </summary>
        LessThanOrEqual,

        /// <summary>
        /// The value of the property must be greater than or equal to the value of the constant.
        /// </summary>
        GreaterThanOrEqual,

        /// <summary>
        /// The value of the property must begin with the value of the constant.
        /// </summary>
        ValueStartsWith,

        /// <summary>
        /// The value of the property must end with the value of the constant.
        /// </summary>
        ValueEndsWith,

        /// <summary>
        /// The value of the property must contain the value of the constant.
        /// </summary>
        ValueContains,

        /// <summary>
        /// The value of the property must not contain the value of the constant.
        /// </summary>
        ValueNotContains,

        /// <summary>
        /// The value of the property must match the value of the constant, where '?' matches any single character and '*' matches any sequence of characters.
        /// </summary>
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "DOS", Justification = "This is following the native API")]
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "WildCards", Justification = "This is following the native API")]
        DOSWildCards,

        /// <summary>
        /// The value of the property must contain a word that is the value of the constant.
        /// </summary>
        WordEqual,

        /// <summary>
        /// The value of the property must contain a word that begins with the value of the constant.
        /// </summary>
        WordStartsWith,

        /// <summary>
        /// The application is free to interpret this in any suitable way.
        /// </summary>
        ApplicationSpecific,
    }

    /// <summary>
    /// Specifies the property description grouping ranges.
    /// </summary>
    public enum PropertyGroupingRange
    {
        /// <summary>
        /// The individual values.
        /// </summary>
        Discrete = 0,

        /// <summary>
        /// The static alphanumeric ranges.
        /// </summary>
        Alphanumeric = 1,

        /// <summary>
        /// The static size ranges.
        /// </summary>
        Size = 2,

        /// <summary>
        /// The dynamically-created ranges.
        /// </summary>
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Dymamic", Justification = "This is following the native API")]
        Dymamic = 3,

        /// <summary>
        /// The month and year groups.
        /// </summary>
        Date = 4,

        /// <summary>
        /// The percent groups.
        /// </summary>
        Percent = 5,

        /// <summary>
        /// The enumerated groups.
        /// </summary>
        Enumerated = 6,
    }

    /// <summary>
    /// Describes the particular wordings of sort offerings.
    /// </summary>
    /// <remarks>
    /// Note that the strings shown are English versions only; 
    /// localized strings are used for other locales.
    /// </remarks>
    public enum PropertySortDescription
    {
        /// <summary>
        /// The default ascending or descending property sort, "Sort going up", "Sort going down".
        /// </summary>
        General,

        /// <summary>
        /// The alphabetical sort, "A on top", "Z on top".
        /// </summary>
        AToZ,

        /// <summary>
        /// The numerical sort, "Lowest on top", "Highest on top".
        /// </summary>
        LowestToHighest,

        /// <summary>
        /// The size sort, "Smallest on top", "Largest on top".
        /// </summary>
        SmallestToBiggest,

        /// <summary>
        /// The chronological sort, "Oldest on top", "Newest on top".
        /// </summary>
        OldestToNewest,
    }

    /// <summary>
    /// Describes the attributes of the <c>typeInfo</c> element in the property's <c>.propdesc</c> file.
    /// </summary>
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1028:EnumStorageShouldBeInt32"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1008:EnumsShouldHaveZeroValue", Justification = "This is following the native API"), Flags]
    public enum PropertyTypeFlags : uint
    {
        /// <summary>
        /// The property uses the default values for all attributes.
        /// </summary>
        Default = 0x00000000,

        /// <summary>
        /// The property can have multiple values.   
        /// </summary>
        /// <remarks>
        /// These values are stored as a VT_VECTOR in the PROPVARIANT structure.
        /// This value is set by the multipleValues attribute of the typeInfo element in the property's .propdesc file.
        /// </remarks>
        MultipleValues = 0x00000001,

        /// <summary>
        /// This property cannot be written to. 
        /// </summary>
        /// <remarks>
        /// This value is set by the isInnate attribute of the typeInfo element in the property's .propdesc file.
        /// </remarks>
        IsInnate = 0x00000002,

        /// <summary>
        /// The property is a group heading. 
        /// </summary>
        /// <remarks>
        /// This value is set by the isGroup attribute of the typeInfo element in the property's .propdesc file.
        /// </remarks>
        IsGroup = 0x00000004,

        /// <summary>
        /// The user can group by this property. 
        /// </summary>
        /// <remarks>
        /// This value is set by the canGroupBy attribute of the typeInfo element in the property's .propdesc file.
        /// </remarks>
        CanGroupBy = 0x00000008,

        /// <summary>
        /// The user can stack by this property. 
        /// </summary>
        /// <remarks>
        /// This value is set by the canStackBy attribute of the typeInfo element in the property's .propdesc file.
        /// </remarks>
        CanStackBy = 0x00000010,

        /// <summary>
        /// This property contains a hierarchy. 
        /// </summary>
        /// <remarks>
        /// This value is set by the isTreeProperty attribute of the typeInfo element in the property's .propdesc file.
        /// </remarks>
        IsTreeProperty = 0x00000020,

        /// <summary>
        /// Include this property in any full text query that is performed. 
        /// </summary>
        /// <remarks>
        /// This value is set by the includeInFullTextQuery attribute of the typeInfo element in the property's .propdesc file.
        /// </remarks>
        IncludeInFullTextQuery = 0x00000040,

        /// <summary>
        /// This property is meant to be viewed by the user.  
        /// </summary>
        /// <remarks>
        /// This influences whether the property shows up in the "Choose Columns" dialog, for example.
        /// This value is set by the isViewable attribute of the typeInfo element in the property's .propdesc file.
        /// </remarks>
        IsViewable = 0x00000080,

        /// <summary>
        /// This property is included in the list of properties that can be queried.   
        /// </summary>
        /// <remarks>
        /// A queryable property must also be viewable.
        /// This influences whether the property shows up in the query builder UI.
        /// This value is set by the isQueryable attribute of the typeInfo element in the property's .propdesc file.
        /// </remarks>
        IsQueryable = 0x00000100,

        /// <summary>
        /// Used with an innate property (that is, a value calculated from other property values) to indicate that it can be deleted.  
        /// </summary>
        /// <remarks>
        /// Windows Vista with Service Pack 1 (SP1) and later.
        /// This value is used by the Remove Properties user interface (UI) to determine whether to display a check box next to an property that allows that property to be selected for removal.
        /// Note that a property that is not innate can always be purged regardless of the presence or absence of this flag.
        /// </remarks>
        CanBePurged = 0x00000200,

        /// <summary>
        /// This property is owned by the system.
        /// </summary>
        IsSystemProperty = 0x80000000,

        /// <summary>
        /// A mask used to retrieve all flags.
        /// </summary>
        MaskAll = 0x800001FF,
    }

    /// <summary>
    /// Associates property names with property description list strings.
    /// </summary>
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1028:EnumStorageShouldBeInt32"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1008:EnumsShouldHaveZeroValue"), Flags]
    public enum PropertyViewFlags : uint
    {
        /// <summary>
        /// The property is shown by default.
        /// </summary>
        Default = 0x00000000,

        /// <summary>
        /// The property is centered.
        /// </summary>
        CenterAlign = 0x00000001,

        /// <summary>
        /// The property is right aligned.
        /// </summary>
        RightAlign = 0x00000002,

        /// <summary>
        /// The property is shown as the beginning of the next collection of properties in the view.
        /// </summary>
        BeginNewGroup = 0x00000004,

        /// <summary>
        /// The remainder of the view area is filled with the content of this property.
        /// </summary>
        FillArea = 0x00000008,

        /// <summary>
        /// The property is reverse sorted if it is a property in a list of sorted properties.
        /// </summary>
        SortDescending = 0x00000010,

        /// <summary>
        /// The property is only shown if it is present.
        /// </summary>
        ShowOnlyIfPresent = 0x00000020,

        /// <summary>
        /// The property is shown by default in a view (where applicable).
        /// </summary>
        ShowByDefault = 0x00000040,

        /// <summary>
        /// The property is shown by default in primary column selection user interface (UI).
        /// </summary>
        ShowInPrimaryList = 0x00000080,

        /// <summary>
        /// The property is shown by default in secondary column selection UI.
        /// </summary>
        ShowInSecondaryList = 0x00000100,

        /// <summary>
        /// The label is hidden if the view is normally inclined to show the label.
        /// </summary>
        HideLabel = 0x00000200,

        /// <summary>
        /// The property is not displayed as a column in the UI.
        /// </summary>
        Hidden = 0x00000800,

        /// <summary>
        /// The property is wrapped to the next row.
        /// </summary>
        CanWrap = 0x00001000,

        /// <summary>
        /// A mask used to retrieve all flags.
        /// </summary>
        MaskAll = 0x000003ff,
    }

    #endregion
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer PageLabs
United States United States
I'm the founder of PageLabs, a web-based performance and SEO optimization site.

Give your site a boost in performance, even take a free speed test!

http://www.pagelabs.com

Comments and Discussions