メヘンニミン

たくさんの言語に触れたい.走り書きで見る整理ブログです.

Leap Motion でPCバイバイ(*´∨`*)ノ"する


Leap Motion でランチャー - YouTube

「今日の作業は終わり!!」という時に,ふわっとクールにさよならしたい.

C#,フォームの常駐アプリケーションです.バックグラウンドの操作でもスリープさせます.

//Leap.Controllerを継承したクラスのonFrameをイジる
public override void OnFrame(Controller controller)
{
    Frame frame = controller.Frame();
    if (!frame.Hands.IsEmpty && 30 < frame.Id - localStamp)
    {
         //指が5本
         if (4 < frame.Fingers.Count)
         {
              Hand hand = frame.Hands[0];
              Vector normal = hand.PalmNormal;
              Vector direction = hand.Direction;

              //バイバイ => x座標の+-が連続する場合
              xList.Add(hand.PalmPosition.x);
              if (100 < xList.Count)
              {
                  xList.RemoveAt(0);
                  checkByebye(frame);
              }

              //くるり => ロールが急激に変化する場合
              rollList.Add(normal.Roll * 180.0f / (float)Math.PI);
              if (20 < rollList.Count)
              {
                  rollList.RemoveAt(0);
                  checkKururi(frame);
              }
          }
          else
          {
              xList.Clear();
              rollList.Clear();
          }
    }
    else
    {
        xList.Clear();
        rollList.Clear();
    }
}

//バイバイの判定
private void checkByebye(Frame f)
{
    int count = 0;
    //何度の+-の山があったか?
    int waves = checkWave(count, 0);
    if (5 < waves)
    {
        localStamp = f.Id;
        //スリープ
        SilentStart("rundll32.exe", "powrprof.dll,SetSuspendState");
    }
}

//波の数を再帰的にチェックする
private int checkWave(int count, int index)
{
    int c = 0;
    Boolean pn = checkPosNev(xList[index]); //-ならfalse, それ以外ならtrue
    Boolean an = !pn;
    while (pn != an)
    {
        index++;
        if (xList.Count <= index) return ++count;
        an = checkPosNev(xList[index]);
        c++;
    }
    if (10 < c && c < 50)
    {
        count = checkWave(count + 1, index - 1);
    }
    return count;
}

//くるりの判定
private void checkKururi(Frame f)
{
    if (150 < Math.Abs(rollList[rollList.Count - 1] - rollList[0]))
    {
        localStamp = f.Id;
        //デスクトップの表示(全ウインドウの最小化スイッチ)
        System.Diagnostics.Process.Start("shell:::{3080F90D-D7AD-11D9-BD98-0000947B0257}");
    }
}

//コマンド実行(スリープ用)
private static void SilentStart(string command, string args)
{
    ProcessStartInfo ps = new ProcessStartInfo(command, args);
    ps.CreateNoWindow = true;
    ps.UseShellExecute = false;

    Process.Start(ps);
}

すごく単純だけど,でも,ほかにショートカットしたいことは,特にないんだ.残念.