Winform 怎样选取窗体上绘制的文本. 在窗体上绘制了很多字符串. 请问怎样实现用鼠标选择某一段文本内容, 就像在网页内用鼠标就可以选择一段文本一样,然后实现复制功能. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你窗体上绘制的文本自己要缓存下来,记住文本内容,和绘制的位置,以及矩形区域,然后和鼠标选取的矩形区域求交,如果有交集说明被选中。矢量数据能实现的,如果绘制完后就没保存,纯的栅格数据恢复到文本,那就是文字识别的工作了,你觉得有必要么,浪费这个cpu。更改你底层设计,按我说的,记住绘制的文本和文本所在的矩形区域。 回复1楼:不好意思. 你说的方法很好. 但是不能解决我的问题.别人给你一个dll里面有一个窗体.窗体内绘制了很多文本.并且出现了滚动条. 我要做一个模块,就是对这个窗体内的文本可以选择.在这种情况下,我只可以外部访问这个窗体, 它里面的文本不是我画的.无法记录.可千万别说什么让别人提供绘制的文本内容给我.那么请问 在绘制的文本无法记录的情况下 能实现选择吗?比如有没有什么API 之类的方法. 谢谢关注. 这个思路。还要OCR了。。 试试(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; 不知道是什么样的窗口.如果是取窗体绘制的文本的话,跟屏幕取词的原理差不多.需要Hook,然后强制让窗体重绘.要实现可以选中什么的就难了.可以考虑取到文字后,在窗体上覆盖一个Label,把文字填进去.鼠标移开的时候再把Label删掉。 自己写个 TextBox 也不简单鸟 有滚动条应该是控件文本,楼上的方法值得一试。如果是GDI画上去的字再尝试3楼的思路 如果对方给的是 一个多行文本控件 可以使用这样的方法(也可以使用API激活多行文本框来让你选中文字)但是 如果文本绘制到了一个图片上 上面方法就不行了. 例如:网页内有一些文本为黑字白底,我用鼠标移动到我要选择的位置,按下再移动后选择其中一段文本,被选中的文本效果呈蓝底白字.我想实现这个功能到 winform窗体内. 窗体内无控件,通过GDI+ 绘制的字符串. 窗体内无控件,只有通过GDI+ 绘制的字符串. 那你相当于自己实现了一个TextBox, 并且是ReadOnly的。 幫你頂咯不過貌似這個在winform中做有點·······同求思路~及解答! 使用鼠标事件和键盘事件:先把鼠标移到相应位置->点击左键->光标移到结束位置->“Ctrl”按下->“C”按下->“C”放开->“Ctrl”放开。。 例: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); 为什么在winxp下可以运行的代码在win7下就报错 SQL实现,求助了!大牛们 怎么取道datalist的页脚的子控件的值? 如何修改sql数据库字段名 请问各位大大现在考点什么好? 100分求正则表达式 紧急求助,页面无法显示,在线等待 3维坐标到平面的转换 c#入门书籍 c#站点 贴就有分 求救! 那位大虾知道希望出版的书在那有下载! 急! 急! 急! linq to datagridview 同时调用一个数据库连接类的问题
别人给你一个dll里面有一个窗体.窗体内绘制了很多文本.并且出现了滚动条. 我要做一个模块,就是对这个窗体内的文本可以选择.在这种情况下,我只可以外部访问这个窗体, 它里面的文本不是我画的.无法记录.可千万别说什么让别人提供绘制的文本内容给我.那么请问 在绘制的文本无法记录的情况下 能实现选择吗?比如有没有什么API 之类的方法. 谢谢关注.
这个思路。还要OCR了。。
试试(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;
如果是取窗体绘制的文本的话,跟屏幕取词的原理差不多.
需要Hook,然后强制让窗体重绘.
要实现可以选中什么的就难了.可以考虑取到文字后,在窗体上覆盖一个Label,把文字填进去.鼠标移开的时候再把Label删掉。
如果对方给的是 一个多行文本控件 可以使用这样的方法
(也可以使用API激活多行文本框来让你选中文字)但是 如果文本绘制到了一个图片上 上面方法就不行了.
不過貌似這個在winform中做有點·······
同求思路~及解答!
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);