求指导……

解决方案 »

  1.   

    窗体填满屏幕,用某个颜色作为窗体背景,然后设置TransparentKey,让窗体看起来透明,在窗体上画或者设置Opacity=0.01%没试过,应该可行。
      

  2.   

    全屏手写一般是有拖拽动作并且没有处于Drag&Drop状态才识别为手写,否则算正常耗子操作可以操作后面的窗体.具体可以参照android系统的一些全屏手写或是windows下的一些手写板的全屏手写(比如我用的汉王).不然你弄个透明干什么呢?
      

  3.   

    不过按这样做光勾耗子还不行.
    ole的drag and drop相关函数貌似也得挂全局勾
      

  4.   

    设置TransparentKey,鼠标会穿透,获取不到手写动作。
    设置Opacity,笔迹也会跟着透明,看不到笔迹。要是同时允许其他窗体拖拽的话。除了上面所说的,
    只能自绘手写笔迹,自己生成strokes再进行识别了。如果要求不高,屏幕上没啥动的元素,又不需要操作。
    “将屏幕当做画布”,如字面意思,还是截屏当背景吧。
      

  5.   

    截屏可参考这个:    [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,俺是做过仿半透明标题栏窗体之后才体会到其中的郁闷之处。
      

  6.   

    上面所说的方法会显示一张表态的屏幕画面,要实现全屏画图而又不影响原始屏幕内容变化可以做到,当然这需要超多代码了,我有做过一个DYD.dll,这可以使你只需要编写几行代码(不包含手写识别)
      

  7.   

    原理是这样的:
    1 建立一个全屏的无边框窗体
    2 设置为层样式
    3 通过步骤2建立起来的窗体是看不见的,通过Graphics.Cear(Color.Fromargb(1,0,0,0))填充透明度只有1的纯色(因为太透明,肉眼看不见)
    4 此时虽然还是看不到窗体,但已经有一个非常非常透明的层在上面了
    5 在上面画图,每次鼠标移动都使重新绘制整个透明窗体。
      

  8.   

    上面所说的方法会显示一张表态的屏幕画面,要实现全屏画图而又不影响原始屏幕内容变化可以做到,当然这需要超多代码了,我有做过一个DYD.dll,这可以使你只需要编写几行代码(不包含手写识别)有没有源码可以学习,不要DLL…………十分感谢……
      

  9.   

    应该要2个界面层叠第一层就是上面各位提到的 alpha=1的 透明层 用来响应鼠标事件第二层是表现层(鼠标穿透)第一层响应的事件画在第二层上
      

  10.   

    我用把窗体变成透明的办法,但是如果把Inkcanvas的透明度设置为0,它的功能就消失了,所以还是没有解决这个问题,求哪位大神知道怎么做的告诉我一下,最好是源代码……