Example #1
0
        public static void PressKey(Char chChar, int nDelay)
        {
            try
            {
                String[] astrSplit = SplitHangle(chChar, true);

                if (astrSplit != null)
                {
                    bool bHangle = astrSplit.Length == 3;

                    // 한글 설정
                    if (bHangle)
                    {
                        if (GetKeyState(VK_HANGUL) != 1)
                        {
                            int nHangleKey = (int)Keys.HangulMode; // (int)Keys.HangulMode;  // (int)Keys.ProcessKey
                            keybd_event(nHangleKey, 0x00, KEYEVENTF_KEYDOWN, 0);
                            Thread.Sleep(nDelay);

                            keybd_event(nHangleKey, 0x00, KEYEVENTF_KEYUP, 0);
                            Thread.Sleep(nDelay);
                        }
                    }

                    foreach (String strSplit in astrSplit)
                    {
                        if (strSplit != String.Empty)
                        {
                            foreach (Char chSplit in strSplit)
                            {
                                bool bUpper = ('A' <= chSplit) & (chSplit <= 'Z');
                                bool bLower = ('a' <= chSplit) & (chSplit <= 'z');
                                int  nValue;
                                bool bShift;

                                if (bUpper | bLower)
                                {
                                    if (bHangle)
                                    {
                                        bShift = false;
                                    }
                                    else
                                    {
                                        bool bCapsLock = Control.IsKeyLocked(Keys.CapsLock);    // true인 경우 대문자 입력 상태
                                        bShift = bCapsLock != bUpper;
                                    }

                                    if (bUpper)
                                    {
                                        nValue = (int)chSplit;
                                    }
                                    else
                                    {
                                        nValue = (int)(chSplit.ToString().ToUpper()[0]);
                                    }
                                }
                                else
                                {
                                    switch (chSplit)
                                    {
                                    case '~': bShift = true; nValue = (int)Keys.Oemtilde; break;

                                    case '_': bShift = true; nValue = (int)Keys.OemMinus; break;

                                    case '+': bShift = true; nValue = (int)Keys.Oemplus; break;

                                    case '{': bShift = true; nValue = (int)Keys.OemOpenBrackets; break;

                                    case '}': bShift = true; nValue = (int)Keys.OemCloseBrackets; break;

                                    case '|': bShift = true; nValue = (int)Keys.OemPipe; break;

                                    case ':': bShift = true; nValue = (int)Keys.OemSemicolon; break;

                                    case '"': bShift = true; nValue = (int)Keys.OemQuotes; break;

                                    case '<': bShift = true; nValue = (int)Keys.Oemcomma; break;

                                    case '>': bShift = true; nValue = (int)Keys.OemPeriod; break;

                                    case '?': bShift = true; nValue = (int)Keys.OemQuestion; break;

                                    case '!': bShift = true; nValue = (int)Keys.D1; break;

                                    case '@': bShift = true; nValue = (int)Keys.D2; break;

                                    case '#': bShift = true; nValue = (int)Keys.D3; break;

                                    case '$': bShift = true; nValue = (int)Keys.D4; break;

                                    case '%': bShift = true; nValue = (int)Keys.D5; break;

                                    case '^': bShift = true; nValue = (int)Keys.D6; break;

                                    case '&': bShift = true; nValue = (int)Keys.D7; break;

                                    case '*': bShift = true; nValue = (int)Keys.D8; break;

                                    case '(': bShift = true; nValue = (int)Keys.D9; break;

                                    case ')': bShift = true; nValue = (int)Keys.D0; break;

                                    case '`': bShift = false; nValue = (int)Keys.Oemtilde; break;

                                    case '-': bShift = false; nValue = (int)Keys.OemMinus; break;

                                    case '=': bShift = false; nValue = (int)Keys.Oemplus; break;

                                    case '[': bShift = false; nValue = (int)Keys.OemOpenBrackets; break;

                                    case ']': bShift = false; nValue = (int)Keys.OemCloseBrackets; break;

                                    case '\\': bShift = false; nValue = (int)Keys.OemPipe; break;

                                    case ';': bShift = false; nValue = (int)Keys.OemSemicolon; break;

                                    case '\'': bShift = false; nValue = (int)Keys.OemQuotes; break;

                                    case ',': bShift = false; nValue = (int)Keys.Oemcomma; break;

                                    case '.': bShift = false; nValue = (int)Keys.OemPeriod; break;

                                    case '/': bShift = false; nValue = (int)Keys.OemQuestion; break;

                                    case '1': bShift = false; nValue = (int)Keys.D1; break;

                                    case '2': bShift = false; nValue = (int)Keys.D2; break;

                                    case '3': bShift = false; nValue = (int)Keys.D3; break;

                                    case '4': bShift = false; nValue = (int)Keys.D4; break;

                                    case '5': bShift = false; nValue = (int)Keys.D5; break;

                                    case '6': bShift = false; nValue = (int)Keys.D6; break;

                                    case '7': bShift = false; nValue = (int)Keys.D7; break;

                                    case '8': bShift = false; nValue = (int)Keys.D8; break;

                                    case '9': bShift = false; nValue = (int)Keys.D9; break;

                                    case '0': bShift = false; nValue = (int)Keys.D0; break;

                                    case ' ': bShift = false; nValue = (int)Keys.Space; break;

                                    case '\x1b': bShift = false; nValue = (int)Keys.Escape; break;

                                    case '\b': bShift = false; nValue = (int)Keys.Back; break;

                                    case '\t': bShift = false; nValue = (int)Keys.Tab; break;

                                    case '\a': bShift = false; nValue = (int)Keys.LineFeed; break;

                                    case '\r': bShift = false; nValue = (int)Keys.Enter; break;

                                    default:
                                        bShift = false; nValue = 0; break;
                                    }
                                }

                                if (nValue != 0)
                                {
                                    // Caps Lock의 상태에 따른 대/소문자 처리
                                    if (bShift)
                                    {
                                        keybd_event((int)Keys.LShiftKey, 0x00, KEYEVENTF_KEYDOWN, 0);
                                        Thread.Sleep(nDelay);
                                    }

                                    // Key 눌림 처리함.
                                    //int nValue = Convert.ToInt32(chValue);
                                    //int nValue = (int)Keys.Oemtilde;
                                    keybd_event(nValue, 0x00, KEYEVENTF_KEYDOWN, 0);
                                    Thread.Sleep(nDelay);
                                    keybd_event(nValue, 0x00, KEYEVENTF_KEYUP, 0);
                                    Thread.Sleep(nDelay);

                                    // Caps Lock 상태를 회복함.
                                    if (bShift)
                                    {
                                        keybd_event((int)Keys.LShiftKey, 0x00, KEYEVENTF_KEYUP, 0);
                                        Thread.Sleep(nDelay);
                                    }
                                }
                            }
                        }
                    }

                    // 한글 해제
                    if (bHangle)
                    {
                        CommonUtil.keybd_event((int)Keys.HangulMode, 0x00, CommonUtil.KEYEVENTF_KEYDOWN, 0);
                        Thread.Sleep(nDelay);

                        CommonUtil.keybd_event((int)Keys.HangulMode, 0x00, CommonUtil.KEYEVENTF_KEYUP, 0);
                        Thread.Sleep(nDelay);
                    }
                }
            }
            catch (Exception ex)
            {
                ex.ToString();
            }
        }
        protected override void Execute(CodeActivityContext context)
        {
            // Obtain the runtime value of the Text input argument
            string text = context.GetValue(this.Text);

            Rectangle detectPosition = new Rectangle(0, 0, 0, 0);

            this.ResultBool.Set(context, false);

            // 이미지 검색
            Mat mat = CvInvoke.Imread(ImageFileName, Emgu.CV.CvEnum.ImreadModes.AnyColor);

            Image <Bgr, byte> source   = new Image <Bgr, byte>(CaptureScreen());
            Image <Bgr, byte> template = mat.ToImage <Bgr, Byte>();

            int nRetry = 0; //이미지 검색 재시도 횟수

            do
            {
                using (Image <Gray, float> result = source.MatchTemplate(template, Emgu.CV.CvEnum.TemplateMatchingType.CcoeffNormed))
                {
                    double[] minValues, maxValues;
                    Point[]  minLocations, maxLocations;

                    result.MinMax(out minValues, out maxValues, out minLocations, out maxLocations);

                    if (maxValues[0] > (double)Capacity / 100) //0.9
                    {
                        detectPosition = new Rectangle(maxLocations[0], template.Size);

                        this.OutImagePosLeft.Set(context, detectPosition.Left);
                        this.OutImagePosTop.Set(context, detectPosition.Top);
                        this.OutImagePosWidth.Set(context, detectPosition.Width);
                        this.OutImagePosHeight.Set(context, detectPosition.Height);

                        Debug.WriteLine(detectPosition.ToString());
                        //MessageBox.Show(detectPosition.ToString());

                        if (msActionType != "None" && msActionType != "")
                        {
                            //MessageBox.Show(String.Format("X : {0}, Y : {1}", detectPosition.Left + OffsetX, detectPosition.Top + OffsetY));
                            int nMousePosX = detectPosition.Left + OffsetX;
                            int nMousePosY = detectPosition.Top + OffsetY;

                            CommonUtil.MoveCursor(nMousePosX, nMousePosY);

                            if (msActionType == "LButtonClick")
                            {
                                CommonUtil.DoMouseClickEvent(CommonUtil.MouseButtonType.Left, nMousePosX, nMousePosY);
                            }

                            if (msActionType == "RButtonClick")
                            {
                                CommonUtil.DoMouseClickEvent(CommonUtil.MouseButtonType.Right, nMousePosX, nMousePosY);
                            }

                            if (msActionType == "MButtonClick")
                            {
                                CommonUtil.DoMouseClickEvent(CommonUtil.MouseButtonType.Middle, nMousePosX, nMousePosY);
                            }
                        }

                        break;
                    }
                }

                nRetry++;
                Thread.Sleep(100);
            } while (nRetry < Retry);

            //nRetry 값이 Retry 값보다 크면 Image 찾기 실패
            if (nRetry >= Retry)
            {
                return;
            }

            //Delay After 처리
            if (mnDelayAfter > 0)
            {
                Thread.Sleep(mnDelayAfter);
            }

            this.ResultBool.Set(context, true);

            /*
             * Assign<bool> assign = new Assign<bool>
             * {
             *  To = new ArgumentReference<bool>("ResultBool"),
             *  Value = new InArgument<bool>(true)
             * };
             *
             * Sequence sequence = new Sequence();
             * sequence.Activities.Add(assign);
             *
             * this.Implementation = () => sequence;
             */
        }