翼度科技»论坛 编程开发 .net 查看内容

识别指定window窗口的文本

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
1. 简单需求
通过图文识别读取一个指定window窗口的文本。 获取窗口句柄,截图保存成bitmap ,调用图文识别库.
测试结果是对中文下的识别不是特别好。
需要注意的是,tessdata要下载指定目录页下。
2. 引用包
a. 引用 tesseract4.1  b.  Emgu.CV组件
3. 上代码
  1. using System;
  2. using System.Drawing;
  3. using System.Drawing.Imaging;
  4. using System.Runtime.InteropServices;
  5. using Emgu.CV;
  6. using Emgu.CV.OCR;
  7. using Emgu.CV.Structure;
  8. using Tesseract;
  9. using System.Windows.Forms;
  10. using Pix = Tesseract.Pix;
  11. using PageSegMode = Tesseract.PageSegMode;
  12. public class Program
  13. {
  14.     [DllImport("user32.dll", SetLastError = true)]
  15.     public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  16.     [DllImport("user32.dll")]
  17.     public static extern IntPtr GetWindowDC(IntPtr hWnd);
  18.     [DllImport("user32.dll")]
  19.     public static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDC);
  20.     [DllImport("gdi32.dll")]
  21.     public static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos);
  22.     [DllImport("user32.dll", SetLastError = true)]
  23.     public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);
  24.     [DllImport("user32.dll")]
  25.     public static extern bool SetForegroundWindow(IntPtr hWnd);
  26.     [StructLayout(LayoutKind.Sequential)]
  27.     public struct RECT
  28.     {
  29.         public int Left;
  30.         public int Top;
  31.         public int Right;
  32.         public int Bottom;
  33.     }
  34.     [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
  35.     public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);
  36.     private const int KEYEVENTF_EXTENDEDKEY = 0x0001;
  37.     private const int KEYEVENTF_KEYUP = 0x0002;
  38.     private const int VK_MENU = 0x12; // Alt
  39.     private const int VK_S = 0x53; // S key
  40.     public static Bitmap CaptureWindow(IntPtr hWnd)
  41.     {
  42.         RECT rect;
  43.         GetWindowRect(hWnd, out rect);
  44.         Bitmap bmp = new Bitmap(rect.Right - rect.Left, rect.Bottom - rect.Top, PixelFormat.Format32bppArgb);
  45.         Graphics g = Graphics.FromImage(bmp);
  46.         g.CopyFromScreen(rect.Left, rect.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy);
  47.         return bmp;
  48.     }
  49.     public static void Main()
  50.     {
  51.         string windowTitle = "*无标题 - 记事本";
  52.         //*无标题 - 记事本
  53.         IntPtr hWnd = FindWindow(null, windowTitle);
  54.         if (hWnd == IntPtr.Zero)
  55.         {
  56.             Console.WriteLine($"Could not find window with title '{windowTitle}'");
  57.             return;
  58.         }
  59.         SetForegroundWindow(hWnd);
  60.         //SendKeys.SendWait("%(s)"); //发送Alt+S事件
  61.         // Press Alt + S
  62.         //keybd_event(VK_MENU, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0);
  63.         //keybd_event(VK_S, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0);
  64.         //// Release Alt + S
  65.         //keybd_event(VK_S, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
  66.         //keybd_event(VK_MENU, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
  67.         //图文识别
  68.         Bitmap bmp = CaptureWindow(hWnd);
  69.         //tessdata/tessdata-4.1.0
  70.         TesseractEngine engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.TesseractAndLstm);
  71.         using (Bitmap bmpImage = new Bitmap(bmp))
  72.         {
  73.             byte[] imageData = ImageToByte(bmpImage);
  74.             using (var image = Pix.LoadFromMemory(imageData))
  75.             {
  76.                 using (var page = engine.Process(image))
  77.                 {
  78.                     var text = page.GetText();
  79.                     Console.WriteLine("Text recognized from image: {0}", text);
  80.                 }
  81.             }
  82.         }
  83.     }
  84.     private static byte[] ImageToByte(Bitmap img)
  85.     {
  86.         ImageConverter converter = new ImageConverter();
  87.         return (byte[])converter.ConvertTo(img, typeof(byte[]));
  88.     }
  89. }
复制代码
 上述代码使用的是net6.0 开发的。控制台程序模拟windows事件,尤其是键盘快捷键时,有点问题。暂未处理。
就这样吧,兴趣所致,就是玩玩。 天太冷了,不想写的太多。 纯粹凑字数。

来源:https://www.cnblogs.com/voidobject/archive/2023/12/18/17912444.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具