using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace Vibrate_CS
{
    public partial class Form1 : Form
    {
        /// <summary>
        /// Включает виброзвонок
        /// </summary>
        /// <returns>S_OK сообщает об успешном вызове функции. В случае ошибки 
        /// возвращается E_FAIL
        ///</returns>
        [DllImport("aygshell")]
        private static extern int Vibrate(
           int cvn,
           IntPtr rgvn,
           uint fRepeat,
           uint dwTimeout);

        /// <summary>
        /// Останавливает виброзвонок
        /// </summary>
        /// <returns>S_OK сообщает об остановке виброзвонка. В случае ошибки 
        /// возвращается E_FAIL
        /// </returns>
        [DllImport("aygshell")]
        private static extern int VibrateStop();

        /// <summary>
        /// Получает сведения о возможности воспроизведения виброзвонка устройством.
        /// </summary>
        /// <param name="caps">Перечисление VIBRATEDEVICECAPS,
        /// определяющее возможности воспроизведения виброзвонка устройстом. 
        ///</param>
        [DllImport("aygshell")]
        private static extern int VibrateGetDeviceCaps(
            VibrationCapabilities caps);

         /// <summary>
        /// Используется функцией VibrateGetDeviceCaps для определения возможности
        /// воспроизведения виброзвонка.
        /// </summary>
        public enum VibrationCapabilities : int
        {
            VDC_Amplitude,
            VDC_Frequency,
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void mnuStopVibrate_Click(object sender, EventArgs e)
        {
            StopVibrate();
        }

        private void mnuVibrate_Click(object sender, EventArgs e)
        {
            StartVibrate();
        }

        /// <summary>
        /// Включаем виброзвонок
        /// </summary>
        /// <returns>В успешном случае возвращается TRUE, в случае ошибки - FALSE.</returns>
        public static bool StartVibrate()
        {
            int result = Vibrate(0, IntPtr.Zero, 0xffffffff, 0xffffffff);

            if (result != 0)
            {
                return false;
            }
            return true;
        }

        /// <summary>
        /// Останавливаем виброзвонок
        /// </summary>
        /// <returns>В успешном случае возвращается TRUE, в случае ошибки - FALSE.</returns>
        public static bool StopVibrate()
        {
            int result = VibrateStop();

            if (result != 0)
            {
                return false;
            }
            return true;
        }
    }
}