如何用C#实现将屏幕当做画布做手写识别

scutsoftware 2012-07-24 01:07:54
求指导……
...全文
647 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
guangzhouchenjian 2012-07-29
  • 打赏
  • 举报
回复
希望各位知道的大神帮帮忙……
scutsoftware 2012-07-29
  • 打赏
  • 举报
回复
我是用WPF做的,求指导……
scutsoftware 2012-07-29
  • 打赏
  • 举报
回复
我用把窗体变成透明的办法,但是如果把Inkcanvas的透明度设置为0,它的功能就消失了,所以还是没有解决这个问题,求哪位大神知道怎么做的告诉我一下,最好是源代码……
scutsoftware 2012-07-27
  • 打赏
  • 举报
回复
不懂啊,有没有源码或资料啊……
rayyu1989 2012-07-26
  • 打赏
  • 举报
回复
应该要2个界面层叠

第一层就是上面各位提到的 alpha=1的 透明层 用来响应鼠标事件

第二层是表现层(鼠标穿透)

第一层响应的事件画在第二层上
scutsoftware 2012-07-26
  • 打赏
  • 举报
回复
有木有哪位大神知道啊
scutsoftware 2012-07-26
  • 打赏
  • 举报
回复
大家帮忙想想办法……
scutsoftware 2012-07-25
  • 打赏
  • 举报
回复
请问各位大神有资料可以参考一下不,各位帮帮忙啊……各位说的小弟我都不懂啊……
Conmajia 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

设置TransparentKey,鼠标会穿透,获取不到手写动作。
设置Opacity,笔迹也会跟着透明,看不到笔迹。

要是同时允许其他窗体拖拽的话。除了上面所说的,
只能自绘手写笔迹,自己生成strokes再进行识别了。

如果要求不高,屏幕上没啥动的元素,又不需要操作。
“将屏幕当做画布”,如字面意思,还是截屏当背景吧。
[/Quote]
恩。。我疏忽了。。
scutsoftware 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]
设置TransparentKey,鼠标会穿透,获取不到手写动作。
设置Opacity,笔迹也会跟着透明,看不到笔迹。

要是同时允许其他窗体拖拽的话。除了上面所说的,
只能自绘手写笔迹,自己生成strokes再进行识别了。

如果要求不高,屏幕上没啥动的元素,又不需要操作。
“将屏幕当做画布”,如字面意思,还是截屏当背景吧。
[/Quote]
我的想法也是截屏,做背景,只不过不知道怎么截,以及截后怎么在这张图上画画,写完之后怎么去取这张图上的笔画……
ShangAG 2012-07-25
  • 打赏
  • 举报
回复
本质上是图片对比图像识别吧。还需要字库吧
APM60- 2012-07-25
  • 打赏
  • 举报
回复
设置TransparentKey,鼠标会穿透,获取不到手写动作。
设置Opacity,笔迹也会跟着透明,看不到笔迹。

要是同时允许其他窗体拖拽的话。除了上面所说的,
只能自绘手写笔迹,自己生成strokes再进行识别了。

如果要求不高,屏幕上没啥动的元素,又不需要操作。
“将屏幕当做画布”,如字面意思,还是截屏当背景吧。
scutsoftware 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]
原理是这样的:
1 建立一个全屏的无边框窗体
2 设置为层样式
3 通过步骤2建立起来的窗体是看不见的,通过Graphics.Cear(Color.Fromargb(1,0,0,0))填充透明度只有1的纯色(因为太透明,肉眼看不见)
4 此时虽然还是看不到窗体,但已经有一个非常非常透明的层在上面了
5 在上面画图,每次鼠标移动都使重新绘制整个透明窗体。
[/Quote]
上面所说的方法会显示一张表态的屏幕画面,要实现全屏画图而又不影响原始屏幕内容变化可以做到,当然这需要超多代码了,我有做过一个DYD.dll,这可以使你只需要编写几行代码(不包含手写识别)

有没有源码可以学习,不要DLL…………十分感谢……
dylike 2012-07-25
  • 打赏
  • 举报
回复
原理是这样的:
1 建立一个全屏的无边框窗体
2 设置为层样式
3 通过步骤2建立起来的窗体是看不见的,通过Graphics.Cear(Color.Fromargb(1,0,0,0))填充透明度只有1的纯色(因为太透明,肉眼看不见)
4 此时虽然还是看不到窗体,但已经有一个非常非常透明的层在上面了
5 在上面画图,每次鼠标移动都使重新绘制整个透明窗体。
dylike 2012-07-25
  • 打赏
  • 举报
回复
上面所说的方法会显示一张表态的屏幕画面,要实现全屏画图而又不影响原始屏幕内容变化可以做到,当然这需要超多代码了,我有做过一个DYD.dll,这可以使你只需要编写几行代码(不包含手写识别)
APM60- 2012-07-25
  • 打赏
  • 举报
回复
截屏可参考这个:

[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,俺是做过仿半透明标题栏窗体之后才体会到其中的郁闷之处。
Conmajia 2012-07-24
  • 打赏
  • 举报
回复
那要整的就多了。。全局勾的东西。。键盘也得勾上。。
ChrisAK 2012-07-24
  • 打赏
  • 举报
回复
不过按这样做光勾耗子还不行.
ole的drag and drop相关函数貌似也得挂全局勾
ChrisAK 2012-07-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 9 楼 的回复:

引用 7 楼 的回复:

窗体填满屏幕,用某个颜色作为窗体背景,然后设置TransparentKey,让窗体看起来透明,在窗体上画。。。或者设置Opacity=0.01%。。。没试过,应该可行。
你那样的话手写时后面的窗体都别想用了.
这个还是要考虑挂耗子的钩子吧.

虽然我不反对用钩子。。但你那句话很有意思。。你手写时还要操作后面的窗体吗?写完了你……
[/Quote]全屏手写一般是有拖拽动作并且没有处于Drag&Drop状态才识别为手写,否则算正常耗子操作可以操作后面的窗体.具体可以参照android系统的一些全屏手写或是windows下的一些手写板的全屏手写(比如我用的汉王).不然你弄个透明干什么呢?
Conmajia 2012-07-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 7 楼 的回复:

窗体填满屏幕,用某个颜色作为窗体背景,然后设置TransparentKey,让窗体看起来透明,在窗体上画。。。或者设置Opacity=0.01%。。。没试过,应该可行。
你那样的话手写时后面的窗体都别想用了.
这个还是要考虑挂耗子的钩子吧.
[/Quote]
虽然我不反对用钩子。。但你那句话很有意思。。你手写时还要操作后面的窗体吗?写完了你不收起画布当然操作不了后面的。。我也没办法。。
加载更多回复(7)

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧