如何用C#实现将屏幕当做画布做手写识别
求指导…… --------------------编程问答-------------------- --------------------编程问答-------------------- 有没有人知道啊 --------------------编程问答-------------------- --------------------编程问答-------------------- 有急用……求各位大神指导…… --------------------编程问答-------------------- 应该不能,不是触摸屏,没法联系起来,触摸屏还差不多。 --------------------编程问答-------------------- 并不一定要触摸屏啊,手写识别我已经用控件做好了……只不过我想要实现把整个屏幕当作一块画布来写…… --------------------编程问答-------------------- 窗体填满屏幕,用某个颜色作为窗体背景,然后设置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,它的功能就消失了,所以还是没有解决这个问题,求哪位大神知道怎么做的告诉我一下,最好是源代码…… --------------------编程问答-------------------- 我是用WPF做的,求指导…… --------------------编程问答-------------------- 希望各位知道的大神帮帮忙……
补充:.NET技术 , C#