public string Recognize()
        {
            bool InSameThread;
            int  res;

            InSameThread = false; //perform OCR in non-blocking mode
            //InSameThread = true; //uncomment to perform OCR from this thread (GUI will be freezed)

            //perform OCR itself
            if (InSameThread)
            {
                res = NsOCR.Img_OCR(ImgObj, TNSOCR.OCRSTEP_ZONING, TNSOCR.OCRSTEP_LAST, TNSOCR.OCRFLAG_NONE);
            }
            else
            {
                //do it in non-blocking mode and then wait for result
                res = NsOCR.Img_OCR(ImgObj, TNSOCR.OCRSTEP_ZONING, TNSOCR.OCRSTEP_LAST, TNSOCR.OCRFLAG_THREAD);
                if (res > TNSOCR.ERROR_FIRST)
                {
                    ShowError("Ocr_OcrImg(1)", res);
                    return(string.Empty);
                }


                res = TNSOCR.ERROR_PENDING;
                while (res == TNSOCR.ERROR_PENDING)
                {
                    Application.DoEvents();
                    res = NsOCR.Img_OCR(ImgObj, 0, 0, TNSOCR.OCRFLAG_GETRESULT);
                }
            }


            if (res > TNSOCR.ERROR_FIRST)
            {
                if (res == TNSOCR.ERROR_OPERATIONCANCELLED)
                {
                    System.Windows.Forms.MessageBox.Show("Operation was cancelled.");
                }
                else
                {
                    ShowError("Img_OCR", res);
                    return(string.Empty);
                }
            }

            int    flags = false ? TNSOCR.FMT_EXACTCOPY : TNSOCR.FMT_EDITCOPY;
            string txt;

            NsOCR.Img_GetImgText(ImgObj, out txt, flags);
            return(txt);
        }