none
发现一个.NET控件很奇怪的东西。。。类似于BUG。。。 RRS feed

  • 常规讨论

  • 我用Vb.net 2008做的win32 窗体应用程序,窗体上放置一个label,我发现,即使没有对label做任何事件处理,运行时只要对着label双击,就会把label的text内容复制到剪贴板。一直百思不得其解,搞不懂,MS的开发人员到底是冷幽默还是无意为之……o(╯□╰)o
    努力学习C++
    2010年2月2日 16:23

全部回复

  • 你好!
         我按你说的步骤测试了一下,没有发现这个问题啊!
    周雪峰
    2010年2月3日 2:09
    版主
  • 是么?我的系统是win7 pro,用.NET 2.0做的程序。莫非这东西和平台有关?
    努力学习C++
    2010年2月3日 2:28
  • 是么?我的系统是win7 pro,用.NET 2.0做的程序。莫非这东西和平台有关?
    努力学习C++

    本来是想说没有这个问题的,但是测试了一下之后,发现真得是这样。
    呵呵!
    win7 + vs2008 + .net 2.0 winform app
    HAL
    2010年3月8日 2:36
  • 后续测试:

    1. 为doubleclick增加事件函数,发现此功能还是存在,即执行了doubleclick中的功能之后,还是将text放进了clippad.

    2. 重载了lable类为MyLable, 然后再重载其onDoubleClick,并且什么也不做,结果发现发现此功能还是存在!

    3. 测试VC程序,static text没有此功能。

    4. 其他同样从ITEXT重载的控件,也没有此功能。

    结论:这个功能不是在DoubleClick的委托、或是OnDoubleClick中实现的。重载不能关闭这个功能。




    没有进一步去反编译.net的源代码。

    关注此事。


    HAL
    2010年3月8日 2:55
  • 继续放上测试的结果:

    对每一个与mouse动作有关的事件委托,以及label类的虚拟函数进行了trace,结果发现双击过程中,所有的事件都没有实现这个功能。这个功能是在第二次单标事件传出之前完成的,如下日志1:

    然后又对windproc进行了消息监视,发现在第二次WM_LBUTTONDBLCLK消息出现之后,连续出现了WM_GETTEXTLENGTH, WM_GETTEXT两个消息,明显是在取label的文本,然后下一次消息就是.net的事件调用了。

    因此,可以推测这个功能是在label的winproc中完成的,在得到WM_LBUTTONDBLCLK之后,先进行了剪贴板的更新,然后才调用委托。因此,重写label的虚拟函数无法关闭此功能。

    另外,有此功能的控件还有linklabel, 但这个控件也是从label派生出来的。

    下一步准备反编译一下.net代码看看。


    ----------------------

    日志1:
    OnMouseDown start
      label1_MouseClick
    OnMouseDown end

    OnClick start
      label1_Click
    OnClick end

    OnMouseClick start
      label1_MouseClick
    OnMouseClick end

    OnMouseUp start
      label1_MouseClick
    OnMouseUp end

    // 上一个方法调用时,剪贴板还是旧内容,下一个方法里,剪贴板已经变了。这个功能就是实现在这个缝里。

    OnMouseDown start
      label1_MouseClick
    OnMouseDown end

    OnDoubleClick start
      label1_DoubleClick
    OnDoubleClick end

    OnMouseDoubleClick start
      label1_MouseDoubleClick
    OnMouseDoubleClick end

    OnMouseUp start
      label1_MouseClick
    OnMouseUp end

    日志2:
    windproc start: 0203 LBUTTONDBLCLK               
    type: System.String  data:g
    type: UnicodeText  data:g
    type: Text  data:g
    type: Rich Text Format  data:{\rtf\ansi{\fonttbl{\f0 Consolas;}}{\colortbl;}\f0 \fs18 g\par }

    windproc start: 000E  GETTEXTLENGTH               
    type: System.String  data:g
    type: UnicodeText  data:g
    type: Text  data:g
    type: Rich Text Format  data:{\rtf\ansi{\fonttbl{\f0 Consolas;}}{\colortbl;}\f0 \fs18 g\par }

    windproc end: 000E  GETTEXTLENGTH
    type: System.String  data:g
    type: UnicodeText  data:g
    type: Text  data:g
    type: Rich Text Format  data:{\rtf\ansi{\fonttbl{\f0 Consolas;}}{\colortbl;}\f0 \fs18 g\par }

    windproc start: 000D GETTEXT                     
    type: System.String  data:g
    type: UnicodeText  data:g
    type: Text  data:g
    type: Rich Text Format  data:{\rtf\ansi{\fonttbl{\f0 Consolas;}}{\colortbl;}\f0 \fs18 g\par }

    windproc end: 000D GETTEXT                     
    type: System.String  data:g
    type: UnicodeText  data:g
    type: Text  data:g
    type: Rich Text Format  data:{\rtf\ansi{\fonttbl{\f0 Consolas;}}{\colortbl;}\f0 \fs18 g\par }


    HAL
    2010年3月11日 3:45