Интервал обновления значения iTunes COM PlayerPositionMS

Я работаю над двумя приложениями C# winforms и WPF, которые используют iTunes COM, и заметил некоторое странное поведение при доступе к свойству PlayerPositionMS, которое представляет собой позицию игрока в миллисекундах. Точность значения PlayerPositionMS зависит от того, имеет ли приложение iTunes фокус или нет. Целью моих двух приложений было бы максимально точное обновление позиции игрока. Любая помощь будет оценена.

Ниже приведен пример кода, иллюстрирующий мою точку зрения. Это приложение winforms с одной меткой и таймером. Интервал таймера по умолчанию составляет 100 миллисекунд, а метод tick обновляет текст метки значением свойства PlayerPositionMS. Когда iTunes получает фокус, метка обновляется, как и ожидалось. Но когда приложение winforms или что-то еще имеет фокус, метка обновляется примерно каждую секунду. Поведение одинаково для winforms и WPF.

  • Версия iTunes: 12.9.0.167.
  • Версия iTunesLib: 1.13

Фрагмент формы:

введите здесь описание изображения

Код формы:

namespace Test
{
    partial class Form_Test
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.label_Position = new System.Windows.Forms.Label();
            this.timer_Test = new System.Windows.Forms.Timer(this.components);
            this.SuspendLayout();
            // 
            // label_Position
            // 
            this.label_Position.AutoSize = true;
            this.label_Position.Location = new System.Drawing.Point(12, 9);
            this.label_Position.Name = "label_Position";
            this.label_Position.Size = new System.Drawing.Size(16, 13);
            this.label_Position.TabIndex = 0;
            this.label_Position.Text = "---";
            // 
            // timer_Test
            // 
            this.timer_Test.Enabled = true;
            this.timer_Test.Tick += new System.EventHandler(this.UpdateLabel);
            // 
            // Form_Test
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(205, 33);
            this.Controls.Add(this.label_Position);
            this.Name = "Form_Test";
            this.Text = "Test Form";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.Label label_Position;
        private System.Windows.Forms.Timer timer_Test;
    }
}

Код:

using iTunesLib;
using System;
using System.Windows.Forms;

namespace Test
{
    public partial class Form_Test : Form
    {
        private static iTunesApp _itunes = new iTunesLib.iTunesApp();

        public Form_Test()
        {
            InitializeComponent();
        }

        private void UpdateLabel(object sender, EventArgs e)
        {
            if (_itunes.CurrentTrack != null && _itunes.PlayerState == ITPlayerState.ITPlayerStatePlaying)
                label_Position.Text = _itunes.PlayerPositionMS.ToString();
        }
    }
}

person atownson    schedule 08.10.2018    source источник


Ответы (1)


Вызов метода Resume перед доступом к свойству PlayerPositionMS, похоже, помогает решить эту проблему:

private void UpdateLabel(object sender, EventArgs e)
{
    if (_itunes.CurrentTrack != null && _itunes.PlayerState == ITPlayerState.ITPlayerStatePlaying)
    {
        _itunes.Resume();
        label_Position.Text = _itunes.PlayerPositionMS.ToString();
    }
}
person atownson    schedule 19.10.2018