diff --git a/ScanToTextProgram/MainForm.Designer.cs b/ScanToTextProgram/MainForm.Designer.cs index d2cff50..b1c513d 100644 --- a/ScanToTextProgram/MainForm.Designer.cs +++ b/ScanToTextProgram/MainForm.Designer.cs @@ -31,6 +31,7 @@ this.simpleButton_SetScanPoin = new DevExpress.XtraEditors.SimpleButton(); this.treeList1 = new DevExpress.XtraTreeList.TreeList(); this.simpleButton_ScanToOcr = new DevExpress.XtraEditors.SimpleButton(); + this.simpleButton_KeyHookStart = new DevExpress.XtraEditors.SimpleButton(); ((System.ComponentModel.ISupportInitialize)(this.treeList1)).BeginInit(); this.SuspendLayout(); // @@ -47,6 +48,14 @@ // this.treeList1.Location = new System.Drawing.Point(140, 12); this.treeList1.Name = "treeList1"; + this.treeList1.OptionsBehavior.ReadOnly = true; + this.treeList1.OptionsClipboard.AllowCopy = DevExpress.Utils.DefaultBoolean.True; + this.treeList1.OptionsClipboard.AllowExcelFormat = DevExpress.Utils.DefaultBoolean.True; + this.treeList1.OptionsClipboard.CopyColumnHeaders = DevExpress.Utils.DefaultBoolean.False; + this.treeList1.OptionsScrollAnnotations.ShowSelectedRows = DevExpress.Utils.DefaultBoolean.True; + this.treeList1.OptionsView.ShowColumns = false; + this.treeList1.OptionsView.ShowIndicator = false; + this.treeList1.OptionsView.ShowRoot = false; this.treeList1.Size = new System.Drawing.Size(577, 375); this.treeList1.TabIndex = 1; // @@ -59,16 +68,28 @@ this.simpleButton_ScanToOcr.Text = "스캔영역설정"; this.simpleButton_ScanToOcr.Click += new System.EventHandler(this.simpleButton_SetScanPoin_Click); // + // simpleButton_KeyHookStart + // + this.simpleButton_KeyHookStart.Location = new System.Drawing.Point(12, 163); + this.simpleButton_KeyHookStart.Name = "simpleButton_KeyHookStart"; + this.simpleButton_KeyHookStart.Size = new System.Drawing.Size(104, 85); + this.simpleButton_KeyHookStart.TabIndex = 2; + this.simpleButton_KeyHookStart.Text = "Key Hook Start"; + this.simpleButton_KeyHookStart.Click += new System.EventHandler(this.simpleButton_KeyHookStart_Click); + // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(729, 399); + this.Controls.Add(this.simpleButton_KeyHookStart); this.Controls.Add(this.treeList1); this.Controls.Add(this.simpleButton_ScanToOcr); this.Controls.Add(this.simpleButton_SetScanPoin); this.Name = "MainForm"; this.Text = "Scan To Text"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing); + this.Load += new System.EventHandler(this.MainForm_Load); ((System.ComponentModel.ISupportInitialize)(this.treeList1)).EndInit(); this.ResumeLayout(false); @@ -79,6 +100,7 @@ private DevExpress.XtraEditors.SimpleButton simpleButton_SetScanPoin; private DevExpress.XtraTreeList.TreeList treeList1; private DevExpress.XtraEditors.SimpleButton simpleButton_ScanToOcr; + private DevExpress.XtraEditors.SimpleButton simpleButton_KeyHookStart; } } diff --git a/ScanToTextProgram/MainForm.cs b/ScanToTextProgram/MainForm.cs index 561323c..679b76b 100644 --- a/ScanToTextProgram/MainForm.cs +++ b/ScanToTextProgram/MainForm.cs @@ -1,25 +1,44 @@ using DevExpress.Utils.Extensions; +using DevExpress.XtraPrinting.Native; +using DevExpress.XtraWaitForm; using ScanToTextProgram.OCR; using System; -using System.Collections.Generic; -using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using System.Windows.Forms; namespace ScanToTextProgram { public partial class MainForm : Form { + DataTable dataTable = null; + + Rectangle rectangle = new Rectangle(); + + OcrProcessor ocrProcessor = new OcrProcessor(); + public MainForm() { InitializeComponent(); - } - Rectangle rectangle = new Rectangle(); + dataTable = new DataTable(); + dataTable.Columns.Add("시가"); + dataTable.Columns.Add("고가"); + dataTable.Columns.Add("저가"); + dataTable.Columns.Add("종가"); + dataTable.Columns.Add("구름(상)"); + dataTable.Columns.Add("구름(하)"); + dataTable.Columns.Add("40_1(상)"); + dataTable.Columns.Add("40_1(하)"); + dataTable.Columns.Add("40_2(상)"); + dataTable.Columns.Add("40_2(하)"); + + treeList1.DataSource = dataTable; + } // 스캔 영역 설정 private void simpleButton_SetScanPoin_Click(object sender, EventArgs e) @@ -28,18 +47,22 @@ namespace ScanToTextProgram rectangle = screenCapture.SelectArea(); } + // 스캔 버튼 클릭 private void simpleButton_SetScanPoin_Click_1(object sender, EventArgs e) + { + scanToOcr(); + } + + // 설정된 영역에 따라 스캔하고 OCR 변경하기 + public void scanToOcr() { var screenCapture = new ScreenCapture(); var selectedArea = rectangle; var screenshot = screenCapture.CaptureScreen(selectedArea); - var ocrProcessor = new OcrProcessor(); string extractedText = ocrProcessor.ExtractTextFromImage(screenshot); - MessageBox.Show(extractedText); - - var splitLine = extractedText.Split('\n'); + var splitLine = extractedText.Split('\n').ToList(); var 시가 = 0.0; var 고가 = 0.0; @@ -52,31 +75,56 @@ namespace ScanToTextProgram var _40_2_상 = 0.0; var _40_2_하 = 0.0; - for (var i=0; i < splitLine.Length; i++) + for (var i = 0; i < splitLine.Count(); i++) { - if(string.IsNullOrEmpty(splitLine[i])) continue; + var str1 = splitLine[i].Trim(); + + if (string.IsNullOrEmpty(str1)) splitLine.Remove(splitLine[i]); + } + + for (var i = 0; i < splitLine.Count(); i++) + { + if (string.IsNullOrEmpty(splitLine[i])) continue; var line = splitLine[i]; - var test = "BTCUSDT - 1h 097,743.2 H97,824.3 L97,353.0 C97,669.6 -73.6 (~0.08%)"; - // 시가, 고가, 저가, 종가 - if(i==0) + if (i == 0) { var 시고저종s = line.Split(' '); - 시가 = Convert.ToDouble(시고저종s[4].Remove(0, 1)); - 고가 = Convert.ToDouble(시고저종s[5].Remove(0, 1)); - 저가 = Convert.ToDouble(시고저종s[6].Remove(0, 1)); - 종가 = Convert.ToDouble(시고저종s[7].Remove(0, 1)); + + var cnt = 시고저종s.Count() - 1; + + var str_시가 = 시고저종s[cnt - 5].Remove(0, 1); + var str_고가 = 시고저종s[cnt - 4]; + var str_저가 = 시고저종s[cnt - 3].Remove(0, 1); + var str_종가 = 시고저종s[cnt - 2]; + + if (!str_시가.Contains('.')) str_시가 = str_시가.Insert(str_시가.Length - 1, "."); + if (!str_고가.Contains('.')) str_고가 = str_고가.Insert(str_고가.Length - 1, "."); + if (!str_저가.Contains('.')) str_저가 = str_저가.Insert(str_저가.Length - 1, "."); + if (!str_종가.Contains('.')) str_종가 = str_종가.Insert(str_종가.Length - 1, "."); + + 시가 = Convert.ToDouble(str_시가); + 고가 = Convert.ToDouble(str_고가); + 저가 = Convert.ToDouble(str_저가); + 종가 = Convert.ToDouble(str_종가); } // 구름떼 - else if(i == 1) + else if (i == 1) { var 구름떼s = line.Split(' '); - var data1 = Convert.ToDouble(구름떼s[3]); - var data2 = Convert.ToDouble(구름떼s[4]); - if(data1 > data2) + var str_data1 = 구름떼s[구름떼s.Count() - 1]; + var str_data2 = 구름떼s[구름떼s.Count() - 2]; + + if (!str_data1.Contains('.')) str_data1 = str_data1.Insert(str_data1.Length - 1, "."); + if (!str_data2.Contains('.')) str_data2 = str_data2.Insert(str_data2.Length - 1, "."); + + var data1 = Convert.ToDouble(str_data1); + var data2 = Convert.ToDouble(str_data2); + + if (data1 > data2) { 구름_상 = data1; 구름_하 = data2; @@ -87,22 +135,76 @@ namespace ScanToTextProgram 구름_하 = data1; } } - //else if(i == ) + else if (i == 2) + { + var 볼린저_40_2s = line.Split(' '); + var str_40_2_상 = 볼린저_40_2s[볼린저_40_2s.Count() - 2]; + var str_40_2_하 = 볼린저_40_2s[볼린저_40_2s.Count() - 1]; - } + if (!str_40_2_상.Contains('.')) str_40_2_상 =str_40_2_상.Insert(str_40_2_상.Length - 1, "."); + if (!str_40_2_하.Contains('.')) str_40_2_하 = str_40_2_하.Insert(str_40_2_하.Length - 1, "."); - DataTable dataTable = new DataTable(); - dataTable.Columns.Add("시가"); - dataTable.Columns.Add("고가"); - dataTable.Columns.Add("저가"); - dataTable.Columns.Add("종가"); - dataTable.Columns.Add("구름(상)"); - dataTable.Columns.Add("구름(하)"); - dataTable.Columns.Add("40_1(상)"); - dataTable.Columns.Add("40_1(하)"); - dataTable.Columns.Add("40_2(상)"); - dataTable.Columns.Add("40_2(하)"); + _40_2_상 = Convert.ToDouble(str_40_2_상); + _40_2_하 = Convert.ToDouble(str_40_2_하); + } + else if (i == 3) + { + var 볼린저_40_1s = line.Split(' '); + + var str_40_1_상 = 볼린저_40_1s[볼린저_40_1s.Count() - 2]; + var str_40_1_하 = 볼린저_40_1s[볼린저_40_1s.Count() - 1]; + + if (!str_40_1_상.Contains('.')) str_40_1_상 = str_40_1_상.Insert(str_40_1_상.Length - 1, "."); + if (!str_40_1_하.Contains('.')) str_40_1_하 = str_40_1_하.Insert(str_40_1_하.Length - 1, "."); + + _40_1_상 = Convert.ToDouble(str_40_1_상); + _40_1_하 = Convert.ToDouble(str_40_1_하); + } + else if (i == 4) + { + + } + else if (i == 5) + { + + } + else if (i == 6) + { + } + } + + + dataTable.Rows.Clear(); + var row = dataTable.Rows.Add(); + row["시가"] = Convert.ToDouble(시가); + row["고가"] = Convert.ToDouble(고가); + row["저가"] = Convert.ToDouble(저가); + row["종가"] = Convert.ToDouble(종가); + row["구름(상)"] = Convert.ToDouble(구름_상); + row["구름(하)"] = Convert.ToDouble(구름_하); + row["40_1(상)"] = Convert.ToDouble(_40_1_상); + row["40_1(하)"] = Convert.ToDouble(_40_1_하); + row["40_2(상)"] = Convert.ToDouble(_40_2_상); + row["40_2(하)"] = Convert.ToDouble(_40_2_하); + + treeList1.DataSource = dataTable; + treeList1.RefreshDataSource(); + } + + private void MainForm_FormClosing(object sender, FormClosingEventArgs e) + { + HookHandler.Unhook(); + } + + private void MainForm_Load(object sender, EventArgs e) + { + + } + + private void simpleButton_KeyHookStart_Click(object sender, EventArgs e) + { + HookHandler.SetHook(this); } } } diff --git a/ScanToTextProgram/OCR/OcrProcessor.cs b/ScanToTextProgram/OCR/OcrProcessor.cs index 492ed1b..bc9d87e 100644 --- a/ScanToTextProgram/OCR/OcrProcessor.cs +++ b/ScanToTextProgram/OCR/OcrProcessor.cs @@ -8,23 +8,29 @@ using Tesseract; namespace ScanToTextProgram.OCR { - internal class OcrProcessor + public class OcrProcessor { - public string ExtractTextFromImage(Bitmap image) + public string ocrPath = "D:\\tessdata-4.1.0"; + + TesseractEngine tesseractEngine; + + public OcrProcessor() { // Tesseract OCR 초기화 + tesseractEngine = new TesseractEngine(ocrPath, "eng", EngineMode.Default); + } - string ocrPath = "D:\\Download\\tessdata-4.1.0"; + public string ExtractTextFromImage(Bitmap image) + { + // 이미지를 텍스트로 변환 + var pix = PixConverter.ToPix(image); + tesseractEngine = new TesseractEngine(ocrPath, "eng", EngineMode.Default); + // 숫자와 점(.)만 인식하도록 설정 + tesseractEngine.SetVariable("tessedit_char_whitelist", "0123456789., \n"); - using (var engine = new TesseractEngine(ocrPath, "eng", EngineMode.Default)) - { - // 이미지를 텍스트로 변환 - using (var pix = PixConverter.ToPix(image)) - { - var result = engine.Process(pix); - return result.GetText(); - } - } + var result = tesseractEngine.Process(pix); + return result.GetText(); + } } } diff --git a/ScanToTextProgram/ScanToTextProgram.csproj b/ScanToTextProgram/ScanToTextProgram.csproj index 146f045..3a212a6 100644 --- a/ScanToTextProgram/ScanToTextProgram.csproj +++ b/ScanToTextProgram/ScanToTextProgram.csproj @@ -62,6 +62,7 @@ + Form