在窗体上绘制了很多字符串. 请问怎样实现用鼠标选择某一段文本内容, 就像在网页内用鼠标就可以选择一段文本一样,然后实现复制功能.

解决方案 »

  1.   

    你窗体上绘制的文本自己要缓存下来,记住文本内容,和绘制的位置,以及矩形区域,然后和鼠标选取的矩形区域求交,如果有交集说明被选中。矢量数据能实现的,如果绘制完后就没保存,纯的栅格数据恢复到文本,那就是文字识别的工作了,你觉得有必要么,浪费这个cpu。更改你底层设计,按我说的,记住绘制的文本和文本所在的矩形区域。
      

  2.   

    回复1楼:不好意思. 你说的方法很好.  但是不能解决我的问题.
    别人给你一个dll里面有一个窗体.窗体内绘制了很多文本.并且出现了滚动条. 我要做一个模块,就是对这个窗体内的文本可以选择.在这种情况下,我只可以外部访问这个窗体, 它里面的文本不是我画的.无法记录.可千万别说什么让别人提供绘制的文本内容给我.那么请问 在绘制的文本无法记录的情况下 能实现选择吗?比如有没有什么API 之类的方法. 谢谢关注. 
      

  3.   


    这个思路。还要OCR了。。
      

  4.   


    试试(1)窗体上绘制一般是label TextBox之类的控件 , 用spy++ 找到在窗口内的层次位置和类名
    (2)用WinAPI FindWindow 和 FindWindowEx 取得handle
    (3)用WinAPI SendMessage 取得文本内容
    [DllImport("user32.dll", EntryPoint = "FindWindow")]
    private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);[DllImport("user32.dll")]
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);[DllImport("User32.dll", EntryPoint = "SendMessage")]
    private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);const int WM_GETTEXT = 0x000D;   //用这个参数 取得文本
    const int WM_SETTEXT = 0x000C;
      

  5.   

    不知道是什么样的窗口.
    如果是取窗体绘制的文本的话,跟屏幕取词的原理差不多.
    需要Hook,然后强制让窗体重绘.
    要实现可以选中什么的就难了.可以考虑取到文字后,在窗体上覆盖一个Label,把文字填进去.鼠标移开的时候再把Label删掉。
      

  6.   

     自己写个 TextBox 也不简单鸟
      

  7.   

    有滚动条应该是控件文本,楼上的方法值得一试。如果是GDI画上去的字再尝试3楼的思路
      

  8.   


    如果对方给的是 一个多行文本控件 可以使用这样的方法
    (也可以使用API激活多行文本框来让你选中文字)但是 如果文本绘制到了一个图片上 上面方法就不行了.
      

  9.   

    例如:网页内有一些文本为黑字白底,我用鼠标移动到我要选择的位置,按下再移动后选择其中一段文本,被选中的文本效果呈蓝底白字.我想实现这个功能到 winform窗体内. 窗体内无控件,通过GDI+ 绘制的字符串.
      

  10.   

    窗体内无控件,只有通过GDI+ 绘制的字符串.
      

  11.   

    那你相当于自己实现了一个TextBox, 并且是ReadOnly的。
      

  12.   

    幫你頂咯
    不過貌似這個在winform中做有點·······
    同求思路~及解答!
      

  13.   

    使用鼠标事件和键盘事件:先把鼠标移到相应位置->点击左键->光标移到结束位置->“Ctrl”按下->“C”按下->“C”放开->“Ctrl”放开。。
      

  14.   

    例:
    SetCursorPos(88,74);
            Sleep(500);
            mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
            mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
            Sleep(500);
            
            EmptyClipboard();
            Clipboard()->SetTextBuf(p);
            Sleep(500);
            keybd_event(VK_CONTROL,0,0,0);
            keybd_event(KEY_V,0,0,0);
            keybd_event(KEY_V,0,KEYEVENTF_KEYUP,0);
            keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);