Программируем Windows 7: Taskbar. Часть 2 - ThumbButtons

Недавно я рассказывал о том, как в Windows 7 можно отображать прогресс выполнения операции прямо в панели задач Windows. На этот раз мы продолжим разговаривать про возможности Windows 7 для программиста и рассмотрим возможность добавления собственных кнопок управления в preview окна.

Подобную функциональность вы уже могли заметить при использовании Windows 7. Например, подобные кнопки существуют для Windows Media Player. Они позволяют переключать треки, а также останавливать воспроизведение. Всего таких кнопок можно создать не более семи.

Несомненно, такая функциональность может быть полезна не только для Media Player, но и для наших приложений. Давайте посмотрим как можно реализовать это в нашем приложении.

Как я уже говорил, для всех системных функций Windows 7 существует обертка на .NET, которая называется .NET Interop Sample Library. Мы пользовались услугами этой библиотеки когда управляли состоянием progress bar. Сейчас мы также воспользуемся этой библиотекой.

Создание наших кнопок должно происходить в момент обработки события WM_TaskbarButtonCreated. Поэтому в форме необходимо переопределить метод WndProc и обрабатывать моменты появления этого события.

protected override void WndProc(ref Message m)
{
    if (m.Msg == Windows7Taskbar.TaskbarButtonCreatedMessage)
    {
        // initialize buttons
    }

    base.WndProc(ref m);
}

Для инициализации кнопок необходим объект ThumbButtonManager. Этот объект управляет поведением и отображением этих кнопок. Этот объект можно создать, используя метод расширения CreateThumbButtonManager. После этого необходимо воспользоваться методом CreateThumbButton и создать объект кнопки. После того, как все кнопки будут созданы необходимо добавить их на панель задач при помощи метода AddThumbButtons.

protected override void WndProc(ref Message m)
{
    if (m.Msg == Windows7Taskbar.TaskbarButtonCreatedMessage)
    {
        InitializeThumbButtons();
    }
 
    base.WndProc(ref m);
}

protected void InitializeThumbButtons()
{
    ThumbButtonManager thumbButtonManager = 
        WindowsFormsExtensions.CreateThumbButtonManager(this);

    var decreaseThumbButton = thumbButtonManager.CreateThumbButton(1, 
        Icons.Navigation_First_2, "To reduce the progress");

    decreaseThumbButton.Clicked += delegate
    {
      // ..
    };

    thumbButtonManager.AddThumbButtons(decreaseThumbButton);
}

Теперь, при запуске приложения можно увидеть что появилась одна кнопка управления. Однако, если мы попробуем нажать на нее, то увидим, что обработчик события не срабатывает. Для того, чтобы обработчик начал работать необходимо в методе WndProc явно передать возможность объекту ThumbButtonManager обрабатывать события.

В итоге получим следующий несложный код.

private ThumbButtonManager _thumbButtonManager;

protected override void WndProc(ref Message m)
{
    if (m.Msg == Windows7Taskbar.TaskbarButtonCreatedMessage)
    {
        InitializeThumbButtons();
    }
    
    if (_thumbButtonManager != null)
        _thumbButtonManager.DispatchMessage(ref m);

    base.WndProc(ref m);
}

protected void InitializeThumbButtons()
{
    if (_thumbButtonManager == null)
    {
        _thumbButtonManager = WindowsFormsExtensions.CreateThumbButtonManager(this);
    }
    
    var decreaseThumbButton = _thumbButtonManager.CreateThumbButton(1,
      Icons.Navigation_First_2, "To reduce the progress");

    decreaseThumbButton.Clicked += delegate
    {
        Progress.Text = (float.Parse(Progress.Text) - 10).ToString();
        WindowsFormsExtensions.SetTaskbarProgress(this, float.Parse(Progress.Text));
    };

    // other buttons

    _thumbButtonManager.AddThumbButtons(decreaseThumbButton, normalStateThumbButton,
      indeterminateStateThumbButton, pauseStateThumbButton,
      errorStateThumbButton, increaseThumbButton);
}

Это приложение содержит кнопки для управления прогрессом (как и в прошлом случае) и содержит 6 кнопок.