当前位置:编程学习 > C#/ASP.NET >>

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

求指导…… --------------------编程问答-------------------- --------------------编程问答-------------------- 有没有人知道啊 --------------------编程问答-------------------- --------------------编程问答-------------------- 有急用……求各位大神指导…… --------------------编程问答-------------------- 应该不能,不是触摸屏,没法联系起来,触摸屏还差不多。 --------------------编程问答-------------------- 并不一定要触摸屏啊,手写识别我已经用控件做好了……只不过我想要实现把整个屏幕当作一块画布来写…… --------------------编程问答-------------------- 窗体填满屏幕,用某个颜色作为窗体背景,然后设置TransparentKey,让窗体看起来透明,在窗体上画。。。或者设置Opacity=0.01%。。。没试过,应该可行。 --------------------编程问答-------------------- 这种技术一看就知道是野比的强项 --------------------编程问答--------------------
引用 7 楼  的回复:
窗体填满屏幕,用某个颜色作为窗体背景,然后设置TransparentKey,让窗体看起来透明,在窗体上画。。。或者设置Opacity=0.01%。。。没试过,应该可行。
你那样的话手写时后面的窗体都别想用了.
这个还是要考虑挂耗子的钩子吧. --------------------编程问答--------------------
引用 9 楼  的回复:
引用 7 楼  的回复:

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

虽然我不反对用钩子。。但你那句话很有意思。。你手写时还要操作后面的窗体吗?写完了你不收起画布当然操作不了后面的。。我也没办法。。 --------------------编程问答--------------------
引用 10 楼  的回复:
引用 9 楼  的回复:

引用 7 楼  的回复:

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

虽然我不反对用钩子。。但你那句话很有意思。。你手写时还要操作后面的窗体吗?写完了你……
全屏手写一般是有拖拽动作并且没有处于Drag&Drop状态才识别为手写,否则算正常耗子操作可以操作后面的窗体.具体可以参照android系统的一些全屏手写或是windows下的一些手写板的全屏手写(比如我用的汉王).不然你弄个透明干什么呢?
--------------------编程问答-------------------- 不过按这样做光勾耗子还不行.
ole的drag and drop相关函数貌似也得挂全局勾 --------------------编程问答-------------------- 那要整的就多了。。全局勾的东西。。键盘也得勾上。。 --------------------编程问答-------------------- 请问各位大神有资料可以参考一下不,各位帮帮忙啊……各位说的小弟我都不懂啊…… --------------------编程问答-------------------- 设置TransparentKey,鼠标会穿透,获取不到手写动作。
设置Opacity,笔迹也会跟着透明,看不到笔迹。

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

如果要求不高,屏幕上没啥动的元素,又不需要操作。
“将屏幕当做画布”,如字面意思,还是截屏当背景吧。 --------------------编程问答-------------------- 本质上是图片对比图像识别吧。还需要字库吧 --------------------编程问答--------------------
引用 15 楼  的回复:
设置TransparentKey,鼠标会穿透,获取不到手写动作。
设置Opacity,笔迹也会跟着透明,看不到笔迹。

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

如果要求不高,屏幕上没啥动的元素,又不需要操作。
“将屏幕当做画布”,如字面意思,还是截屏当背景吧。

我的想法也是截屏,做背景,只不过不知道怎么截,以及截后怎么在这张图上画画,写完之后怎么去取这张图上的笔画…… --------------------编程问答--------------------
引用 15 楼  的回复:
设置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 在上面画图,每次鼠标移动都使重新绘制整个透明窗体。 --------------------编程问答--------------------
引用 21 楼  的回复:
原理是这样的:
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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,