//ポップアップに表示するテキスト設定
 public void SetKeyText(FrickData TargetButton, StringCollection key_str)
 {
     TargetButton.PopText = new string[5];
     for (int i = 0; i < 5; i++)
     {
         TargetButton.PopText[i] = key_str[i];
     }
 }
        //各フリックに送信するキーコード設定
        public void SetKeyCD(FrickData TargetButton, StringCollection key_str)
        {
            TargetButton.KeyAsign = new int[5][];

            for (int i = 0; i < 5; i++)
            {
                string[] Split;
                int[]    KeyArray;
                int      j = 0;

                //入力を空白文字で分割
                Split    = key_str[i].Split();
                KeyArray = new int[Split.Length];
                foreach (string str in Split)
                {
                    if (str.Length == 0)
                    {
                        continue;
                    }
                    else if (str.Length == 1)
                    {
                        if (str == "+")
                        {
                            //単一の+は無視
                            continue;
                        }
                        else
                        {
                            try
                            {
                                //キー設定
                                KeyArray[j] = Convert.ToByte(str[0]);
                            }
                            catch
                            {
                                //2byteとか特殊文字対策
                                //キー定義から検索して設定
                                KeyArray[j] = Convert.ToByte(NekoKeyDef.Get(str), 16);
                            }
                        }
                    }
                    else
                    {
                        //キー定義から検索して設定
                        KeyArray[j] = Convert.ToByte(NekoKeyDef.Get(str), 16);
                    }
                    j++;
                }
                TargetButton.KeyAsign[i] = new int[j * 2];
                for (int k = 0; k < j; k++)
                {
                    TargetButton.KeyAsign[i][k] = KeyArray[k];
                    //キーアップは逆順にマイナス値を設定
                    TargetButton.KeyAsign[i][k + j] = -KeyArray[j - k - 1];
                }
            }
        }
        private void ButtonFake_StylusDown(Image TargetButton, FrickData fd, StylusDownEventArgs e)
        {
            Stylus.Capture(TargetButton);
            Point pos = e.GetPosition(TargetButton);

            dStartPointX             = pos.X;
            dStartPointY             = pos.Y;
            FrickPopImage.Source     = PopImageC;
            PopTextC.Text            = fd.PopText[0];
            PopTextU.Text            = fd.PopText[1];
            PopTextD.Text            = fd.PopText[2];
            PopTextL.Text            = fd.PopText[3];
            PopTextR.Text            = fd.PopText[4];
            FrickPop.PlacementTarget = TargetButton;
            FrickPop.IsOpen          = true;
        }
        /// <summary>
        ///アクティブなソフトによってはスタイラスイベントが発生しない場合があるので
        ///ウィンドウメッセージを拾ってこっちを呼び出す
        /// </summary>
        /// <param name="TargetButton">処理対象偽ボタンコントロール</param>
        private void FirstTouch(Image TargetButton, FrickData fd)
        {
            MouseDevice myStylusDevice = Mouse.PrimaryDevice;

            Stylus.Capture(TargetButton);
            Point pos = myStylusDevice.GetPosition(TargetButton);

            dStartPointX             = pos.X;
            dStartPointY             = pos.Y;
            FrickPopImage.Source     = PopImageC;
            PopTextC.Text            = fd.PopText[0];
            PopTextU.Text            = fd.PopText[1];
            PopTextD.Text            = fd.PopText[2];
            PopTextL.Text            = fd.PopText[3];
            PopTextR.Text            = fd.PopText[4];
            FrickPop.PlacementTarget = TargetButton;
            FrickPop.IsOpen          = true;
        }
        //初期化
        protected override void OnSourceInitialized(EventArgs e)
        {
            base.OnSourceInitialized(e);
            KeyConfig SetKey = new KeyConfig();

            //アクティブにしないおまじない
            WindowInteropHelper helper = new WindowInteropHelper(this);

            SetWindowLong(helper.Handle, GWL_EXSTYLE, GetWindowLong(helper.Handle, GWL_EXSTYLE) | WS_EX_NOACTIVATE);

            //ウィンドウメッセージ取得用
            HwndSource source = HwndSource.FromHwnd(helper.Handle);

            source.AddHook(new HwndSourceHook(WndProc));

            #region //各ボタンの表示テキスト・キー割り当て設定
            for (int i = 0; i < 5; i++)
            {
                fd[i] = new FrickData();
            }
            SetKey.SetKeyText(fd[0], Properties.Settings.Default.key0_Str);
            SetKey.SetKeyCD(fd[0], Properties.Settings.Default.key0_CD);

            SetKey.SetKeyText(fd[1], Properties.Settings.Default.key1_Str);
            SetKey.SetKeyCD(fd[1], Properties.Settings.Default.key1_CD);

            SetKey.SetKeyText(fd[2], Properties.Settings.Default.key2_Str);
            SetKey.SetKeyCD(fd[2], Properties.Settings.Default.key2_CD);

            SetKey.SetKeyText(fd[3], Properties.Settings.Default.key3_Str);
            SetKey.SetKeyCD(fd[3], Properties.Settings.Default.key3_CD);

            SetKey.SetKeyText(fd[4], Properties.Settings.Default.key4_Str);
            SetKey.SetKeyCD(fd[4], Properties.Settings.Default.key4_CD);

//            SetKey.SetKeyText(fdPad, Properties.Settings.Default.key4_Str);
//            SetKey.SetKeyCD(fdPad, Properties.Settings.Default.key4_CD);
            #endregion
        }
        private void ButtonFake_MouseUp(Image TargetButton, FrickData fd, MouseButtonEventArgs e)
        {
            double      difX, difY;
            SendKeyCode send = new SendKeyCode();
            Point       pos  = e.GetPosition(TargetButton);

            difX = dStartPointX - pos.X;
            difY = dStartPointY - pos.Y;

            // アクティブなウィンドウハンドルの取得
            IntPtr hWnd = GetForegroundWindow();
            //IMEハンドルの取得
            IntPtr hIMC = ImmGetDefaultIMEWnd(hWnd);

            //IMEをOFF
            SendMessage(hIMC, WM_IME_CONTROL, IMC_SETOPENSTATUS, 0);

            if (System.Math.Abs(difX) < System.Math.Abs(difY))
            {
                if (System.Math.Abs(difY) < iFrickRange)
                {
                    //フリックなし
                    send.Sendkey(fd.KeyAsign[0]);
                }
                else if (System.Math.Abs(difY) > iFrickCancel)
                {
                    //処理なし
                }
                else if (difY > 0)
                {
                    //上フリック
                    send.Sendkey(fd.KeyAsign[1]);
                }
                else
                {
                    //下フリック
                    send.Sendkey(fd.KeyAsign[2]);
                }
            }
            else
            {
                if (System.Math.Abs(difX) < iFrickRange)
                {
                    //フリックなし
                    send.Sendkey(fd.KeyAsign[0]);
                }
                else if (System.Math.Abs(difX) > iFrickCancel)
                {
                    //処理なし
                }
                else if (difX > 0)
                {
                    //左フリック
                    send.Sendkey(fd.KeyAsign[3]);
                }
                else
                {
                    //右フリック
                    send.Sendkey(fd.KeyAsign[4]);
                }
            }
            Mouse.Capture(null);
            System.Threading.Thread.Sleep(100);
            FrickPop.IsOpen = false;
        }