1. 简单需求

通过图文识别读取一个指定window窗口的文本。 获取窗口句柄,截图保存成bitmap ,调用图文识别库.

测试结果是对中文下的识别不是特别好。

需要注意的是,tessdata要下载指定目录页下。

2. 引用包

a. 引用 tesseract4.1  b.  Emgu.CV组件

3. 上代码

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using Emgu.CV;
using Emgu.CV.OCR;
using Emgu.CV.Structure;
using Tesseract;
using System.Windows.Forms;
using Pix = Tesseract.Pix;
using PageSegMode = Tesseract.PageSegMode; public class Program
{
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll")]
public static extern IntPtr GetWindowDC(IntPtr hWnd); [DllImport("user32.dll")]
public static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDC); [DllImport("gdi32.dll")]
public static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos); [DllImport("user32.dll", SetLastError = true)]
public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect); [DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd); [StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
} [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo); private const int KEYEVENTF_EXTENDEDKEY = 0x0001;
private const int KEYEVENTF_KEYUP = 0x0002; private const int VK_MENU = 0x12; // Alt
private const int VK_S = 0x53; // S key public static Bitmap CaptureWindow(IntPtr hWnd)
{
RECT rect;
GetWindowRect(hWnd, out rect); Bitmap bmp = new Bitmap(rect.Right - rect.Left, rect.Bottom - rect.Top, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bmp);
g.CopyFromScreen(rect.Left, rect.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy); return bmp;
} public static void Main()
{
string windowTitle = "*无标题 - 记事本"; //*无标题 - 记事本
IntPtr hWnd = FindWindow(null, windowTitle); if (hWnd == IntPtr.Zero)
{
Console.WriteLine($"Could not find window with title '{windowTitle}'");
return;
} SetForegroundWindow(hWnd);
//SendKeys.SendWait("%(s)"); //发送Alt+S事件 // Press Alt + S
//keybd_event(VK_MENU, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0);
//keybd_event(VK_S, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0); //// Release Alt + S
//keybd_event(VK_S, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
//keybd_event(VK_MENU, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); //图文识别
Bitmap bmp = CaptureWindow(hWnd); //tessdata/tessdata-4.1.0
TesseractEngine engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.TesseractAndLstm); using (Bitmap bmpImage = new Bitmap(bmp))
{
byte[] imageData = ImageToByte(bmpImage);
using (var image = Pix.LoadFromMemory(imageData))
{
using (var page = engine.Process(image))
{
var text = page.GetText();
Console.WriteLine("Text recognized from image: {0}", text);
}
}
} } private static byte[] ImageToByte(Bitmap img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
}

上述代码使用的是net6.0 开发的。控制台程序模拟windows事件,尤其是键盘快捷键时,有点问题。暂未处理。

就这样吧,兴趣所致,就是玩玩。 天太冷了,不想写的太多。 纯粹凑字数。

识别指定window窗口的文本的更多相关文章

  1. (转载)JavaScript中的Window窗口对象

    (转载)http://www.ijavascript.cn/jiaocheng/javascript-window-65.html 例子: <html> <head> < ...

  2. Window 窗口类

    窗口类 WNDCLASS 总结 总结为下面的几个问题: . 什么是窗口类 . 窗口类的三种类型 . 窗口类各字段含义 . 窗口类的注册和注销 . 如何使用窗口类,子类化.超类化是什么 下面分别描述: ...

  3. EasyUI笔记(三)Window窗口

    本系列只列出一些常用的属性.事件或方法,具体完整知识请查看API文档 Window(窗口) 窗口控件是一个浮动和可拖拽的面板可以用作应用程序窗口.默认情况下,窗口可以移动,调整大小和关闭.它的内容也可 ...

  4. [转载]ExtJs4 笔记(9) Ext.Panel 面板控件、 Ext.window.Window 窗口控件、 Ext.container.Viewport 布局控件

    作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)版权声明:本文的版权归作者与博客园共有.转载时须注明本文的详细链接,否则作者将保留追究其法律 ...

  5. JavaScript:window窗口对象

    在JavaScript中,window表示的就是一个窗口对象.所以在整个处理过程之中,所有的操作都是以弹框为主 的.范例1:使用警告框 <script type="text/javas ...

  6. [转] C#中发送消息给指定的窗口,以及接收消息

    原文C#中发送消息给指定的窗口,以及接收消息 public class Note { //声明 API 函数 [DllImport("User32.dll", EntryPoint ...

  7. Directshow 通过 put_Owner 指定显示窗口后,自动刷新问题

    在Directshow中,我们可以对render指定显示窗口,在写程序的过程中, 发现通过put_Owner设置的显示窗口存在自动刷新问题,譬如窗口被遮挡然后再次露出时,被遮挡部分不能自动刷新,需要拖 ...

  8. ExtJs4 笔记(9) Ext.Panel 面板控件、 Ext.window.Window 窗口控件、 Ext.container.Viewport 布局控件

    本篇讲解三个容器类控件. 一.面板控件 Ext.Panel 一个面板控件包括几个部分,有标题栏.工具栏.正文.按钮区.标题栏位于最上面,工具栏可以在四个位置放置,围绕中间部分正文,按钮区位于最小方.下 ...

  9. 玩转Web之JavaScript(三)-----javaScript语法总结(三) 窗口/滚动条/文本的相关语法

    JS语法集锦(三) 窗口/滚动条/文本 alert("文本")    警告框:警告框经常用于确保用户可以得到某些信息,当警告框出现后,用户需要点击确定按钮才能继续进行操作. con ...

  10. easyUi弹出window窗口传值与调用父页面的方法,子页面给父页面赋值

    <!-- 父页面 --> <!DOCTYPE html PUBLIC "-/W3C/DTD HTML 4.01 Transitional/EN" "ht ...

随机推荐

  1. [SDOI2012] 走迷宫 题解

    前言 题目链接:洛谷:Hydro & bzoj. 题意简述 有向图中,求起点到终点的期望步数.若期望不存在,输出 INF. 保证强连通分量的大小不超过 \(100\). 题目分析 首先来想想什 ...

  2. 8月5日CSP-S模拟赛赛后总结

    8月5日CSP-S模拟赛赛后总结 \[8月5日 \ \ CSP-S模拟赛 \ \ 赛后总结 \\ 2024年8月5日 \\ by \ \ \ uhw177po \] 一.做题情况 第一题比赛 \(10 ...

  3. WhaleStudio 2.6正式发布,WhaleTunnel同步性能与连接器数量再创新高!

    在这个数据驱动的大模型时代,数据集成的作用和意义愈发重要.数据不仅仅是信息的载体,更是推动企业决策和创新的关键因素.作为全球最流行的批流一体数据集成工具,WhaleTunnel随着WhaleStudi ...

  4. bmp位图文件信息结构体

    /************************************************* * * file name:BmpInfoStruct.c * author :momolyl@1 ...

  5. 掌握 Nuxt 3 的页面元数据:使用 definePageMeta 进行自定义配置

    title: 掌握 Nuxt 3 的页面元数据:使用 definePageMeta 进行自定义配置 date: 2024/8/11 updated: 2024/8/11 author: cmdrago ...

  6. 秒懂全文:盘点13个各具特色的AI智能阅读助手工具

    在当今信息爆炸的时代,AI阅读工具正在革新我们的阅读方式,成为了提高效率.优化阅读体验的关键. 这类AI阅读辅助工具,只需要上传文件或者输入链接,便可以直接以聊天对话的形式进行一键总结和智能问答,满足 ...

  7. SMU Summer 2024 Contest Round 1

    SMU Summer 2024 Contest Round 1 Dice and Coin 题意 给个 n 面骰子和一枚硬币,初始投骰子,若骰子的值在 1 到 \(K-1\) 之间则反复投硬币,硬币为 ...

  8. SMU Spring 2023 Contest Round 5(2023 (ICPC) Jiangxi Provincial Contest -- Official Contest)

    题目链接 Problem A. Drill Wood to Make Fire S * V >= n即可 #include<bits/stdc++.h> #define int lo ...

  9. Docker不同宿主机网络打通

    本方式使用docker Swarm集群的方式创建overlay 网络进行打通 背景 因java微服务使用nacos做配置中心,为了解决Nacos服务注册使用Docker容器内网ip问题,使用此方案 前 ...

  10. armbian挂载sd卡记录

    mkdir -p /mnt/mmctouch  /etc/init.d/mount.shvim /etc/init.d/mount.sh内容见图mount /dev/mmcblk1p1 /mnt/mm ...