如何用C#实现将屏幕当做画布做手写识别 求指导…… 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 窗体填满屏幕,用某个颜色作为窗体背景,然后设置TransparentKey,让窗体看起来透明,在窗体上画或者设置Opacity=0.01%没试过,应该可行。 全屏手写一般是有拖拽动作并且没有处于Drag&Drop状态才识别为手写,否则算正常耗子操作可以操作后面的窗体.具体可以参照android系统的一些全屏手写或是windows下的一些手写板的全屏手写(比如我用的汉王).不然你弄个透明干什么呢? 不过按这样做光勾耗子还不行.ole的drag and drop相关函数貌似也得挂全局勾 设置TransparentKey,鼠标会穿透,获取不到手写动作。设置Opacity,笔迹也会跟着透明,看不到笔迹。要是同时允许其他窗体拖拽的话。除了上面所说的,只能自绘手写笔迹,自己生成strokes再进行识别了。如果要求不高,屏幕上没啥动的元素,又不需要操作。“将屏幕当做画布”,如字面意思,还是截屏当背景吧。 截屏可参考这个: [System.Runtime.InteropServices.DllImport("gdi32.dll")] private static extern IntPtr CreateDC( string lpszDriver, // 驱动名称 string lpszDevice, // 设备名称 string lpszOutput, // 无用,可以设定位"NULL" IntPtr lpInitData // 任意的打印机数据 ); [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")] private static extern bool BitBlt( IntPtr hdcDest, //目标设备的句柄 int nXDest, // 目标对象的左上角的X坐标 int nYDest, // 目标对象的左上角的X坐标 int nWidth, // 目标对象的矩形的宽度 int nHeight, // 目标对象的矩形的长度 IntPtr hdcSrc, // 源设备的句柄 int nXSrc, // 源对象的左上角的X坐标 int nYSrc, // 源对象的左上角的X坐标 System.Int32 dwRop // 光栅的操作值 ); public void capture() { //this.Visible = false; IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null); //创建显示器的DC Graphics g1 = Graphics.FromHdc(dc1); //由一个指定设备的句柄创建一个新的Graphics对象 System.Drawing.Image MyImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, g1); //根据屏幕大小创建一个与之相同大小的Bitmap对象 Graphics g2 = Graphics.FromImage(MyImage); //获得屏幕的句柄 IntPtr dc3 = g1.GetHdc(); //获得位图的句柄 IntPtr dc2 = g2.GetHdc(); //把当前屏幕捕获到位图对象中 BitBlt(dc2, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc3, 0, 0, 13369376); //把当前屏幕拷贝到位图中 g1.ReleaseHdc(dc3); //释放屏幕句柄 g2.ReleaseHdc(dc2); //释放位图句柄 ms = new MemoryStream(); MyImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); byte[] b = ms.GetBuffer(); //ns.Write(b, 0, b.Length); this.pictureBox1.Image = Image.FromStream(ms); ms.Flush(); }可以先截图,再作为你手写窗体的背景,显示全屏的手写窗体。缺点是: 背景看似是桌面,但全是静止的,如果截屏之前有gif图啥的就穿帮了。==================================窗体的TransparentKey和Opacity,俺是做过仿半透明标题栏窗体之后才体会到其中的郁闷之处。 上面所说的方法会显示一张表态的屏幕画面,要实现全屏画图而又不影响原始屏幕内容变化可以做到,当然这需要超多代码了,我有做过一个DYD.dll,这可以使你只需要编写几行代码(不包含手写识别) 原理是这样的:1 建立一个全屏的无边框窗体2 设置为层样式3 通过步骤2建立起来的窗体是看不见的,通过Graphics.Cear(Color.Fromargb(1,0,0,0))填充透明度只有1的纯色(因为太透明,肉眼看不见)4 此时虽然还是看不到窗体,但已经有一个非常非常透明的层在上面了5 在上面画图,每次鼠标移动都使重新绘制整个透明窗体。 上面所说的方法会显示一张表态的屏幕画面,要实现全屏画图而又不影响原始屏幕内容变化可以做到,当然这需要超多代码了,我有做过一个DYD.dll,这可以使你只需要编写几行代码(不包含手写识别)有没有源码可以学习,不要DLL…………十分感谢…… 应该要2个界面层叠第一层就是上面各位提到的 alpha=1的 透明层 用来响应鼠标事件第二层是表现层(鼠标穿透)第一层响应的事件画在第二层上 我用把窗体变成透明的办法,但是如果把Inkcanvas的透明度设置为0,它的功能就消失了,所以还是没有解决这个问题,求哪位大神知道怎么做的告诉我一下,最好是源代码…… 新手问一dgv小问题! 操作word中的换行符问题,同时部分已研究代码供大家欣赏 有用c#写的论坛登陸發帖程序源代码吗? C#套接字 一个调用CHM帮助文件的问题!在线等…… !!一个excel的问题 如何给多个dev的textedit的属性赋值 C# png带透明图片与jpg图片叠加处理 C# WinForm 如何点击一按钮,则自动地将outlook中的通讯录名单及邮箱地址全部列在ListBox框中?望指教,谢谢! 如何使程序运行过程中适当的停顿? 怎样使InkCanvas的透明度为1%时笔迹不透明…… 求救:数据读不出来
ole的drag and drop相关函数貌似也得挂全局勾
设置Opacity,笔迹也会跟着透明,看不到笔迹。要是同时允许其他窗体拖拽的话。除了上面所说的,
只能自绘手写笔迹,自己生成strokes再进行识别了。如果要求不高,屏幕上没啥动的元素,又不需要操作。
“将屏幕当做画布”,如字面意思,还是截屏当背景吧。
private static extern IntPtr CreateDC(
string lpszDriver, // 驱动名称
string lpszDevice, // 设备名称
string lpszOutput, // 无用,可以设定位"NULL"
IntPtr lpInitData // 任意的打印机数据
);
[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern bool BitBlt(
IntPtr hdcDest, //目标设备的句柄
int nXDest, // 目标对象的左上角的X坐标
int nYDest, // 目标对象的左上角的X坐标
int nWidth, // 目标对象的矩形的宽度
int nHeight, // 目标对象的矩形的长度
IntPtr hdcSrc, // 源设备的句柄
int nXSrc, // 源对象的左上角的X坐标
int nYSrc, // 源对象的左上角的X坐标
System.Int32 dwRop // 光栅的操作值
);
public void capture()
{
//this.Visible = false;
IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);
//创建显示器的DC
Graphics g1 = Graphics.FromHdc(dc1);
//由一个指定设备的句柄创建一个新的Graphics对象
System.Drawing.Image MyImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, g1);
//根据屏幕大小创建一个与之相同大小的Bitmap对象
Graphics g2 = Graphics.FromImage(MyImage);
//获得屏幕的句柄
IntPtr dc3 = g1.GetHdc();
//获得位图的句柄
IntPtr dc2 = g2.GetHdc();
//把当前屏幕捕获到位图对象中
BitBlt(dc2, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc3, 0, 0, 13369376);
//把当前屏幕拷贝到位图中
g1.ReleaseHdc(dc3);
//释放屏幕句柄
g2.ReleaseHdc(dc2);
//释放位图句柄
ms = new MemoryStream();
MyImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] b = ms.GetBuffer();
//ns.Write(b, 0, b.Length);
this.pictureBox1.Image = Image.FromStream(ms);
ms.Flush();
}
可以先截图,再作为你手写窗体的背景,显示全屏的手写窗体。
缺点是: 背景看似是桌面,但全是静止的,如果截屏之前有gif图啥的就穿帮了。==================================窗体的TransparentKey和Opacity,俺是做过仿半透明标题栏窗体之后才体会到其中的郁闷之处。
1 建立一个全屏的无边框窗体
2 设置为层样式
3 通过步骤2建立起来的窗体是看不见的,通过Graphics.Cear(Color.Fromargb(1,0,0,0))填充透明度只有1的纯色(因为太透明,肉眼看不见)
4 此时虽然还是看不到窗体,但已经有一个非常非常透明的层在上面了
5 在上面画图,每次鼠标移动都使重新绘制整个透明窗体。