如何用C#读取Windows窗口中可选中的内容?

simonw 2004-07-14 04:52:02
如何用C#读取任意一个Windows应用程序窗口中可选中的内容(可以选蓝然后可以复制的).
指定应用程序名就可以让C#自动读出窗口内容,不需要手动选中.

能给一段代码么,不胜感激!
...全文
329 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
ncucf 2004-07-28
  • 打赏
  • 举报
回复
c#不能用全局钩子,因为全局钩子是放在自己做的dll中才行的。而只有c#能调用windows api所需要的dll,却不能让c#的dll变得容易被非.net语言调用。所以没办法实现全局钩子!

而且 局部钩子也不好使,我试验了几次,经常会捕捉不到的现象,有时候,只是捕捉了一下,就停了,还有的键,按下去根本没反应。

所以我也没办法,给楼主更多的东西啊!
simonw 2004-07-28
  • 打赏
  • 举报
回复
楼上的说了等于白说,你可以告诉我用电脑
werdcd 2004-07-27
  • 打赏
  • 举报
回复
用钩子
simonw 2004-07-27
  • 打赏
  • 举报
回复
看糊涂了,没有api基础,看不懂啊,还是请楼主赐教,你说的隐藏窗口是什么意思?
ncucf 2004-07-26
  • 打赏
  • 举报
回复
恩,到我论坛上找吧,可是不是c#写的啊!是用vc写的!
simonw 2004-07-23
  • 打赏
  • 举报
回复
你写的QQ的那个代码能给我一份么,谢谢!
ncucf 2004-07-20
  • 打赏
  • 举报
回复
我不知道这是否能满足你的要求,我是采用先获取窗口名,然后获取窗口句柄,再用spy++获得你所想截取文本的控件的id号,然后按 读取按钮,就可以得到远程窗口的文本了——为了满足你的要求,你可以用个定时器之类的不停的读取……

我想你原来说的,通过文件映象名来获取,就更麻烦些,因为没有直接从文件名到窗口句柄的函数,必须通过枚举的方法一个一个测试,所以我只做了简单一点的,因为一半来说,你是可以获得窗口名的——如果窗口名会变的话,还可以通过class名来辅助获取,不过我这个程序省略掉了!

其次,通过直接用spy++(就是vc自带的工具里面的那个东西)获得子控件的id,比起靠某些特征来枚举获得子控件来说,还是方便不少,因为一般来说,那子控件的id是不会变的!

然后就可以获得你想要的文本了,当然不仅限于编辑框,其他具有text属性的窗口,应该都可以捕获!

希望能满足你的要求!

代码下载:
http://www.cfxybbs.com/bbs/viewFile.asp?Boardid=46&ID=349

ncucf 2004-07-17
  • 打赏
  • 举报
回复
如果那个聊天窗口,是普通的编辑框之类的话,甚至不需要挂钩api函数,直接用sendmessage,发送一个获得编辑框的内容的消息就可以吧!

先通过映象文件名,获得远程窗口的窗口句柄,然后通过窗口句柄,获得那个编辑框的id,或者其他特征,再向它发送一个获取文本的消息,就可以得到它的内容了!

这用vc应该是很容易实现的!
移植到c#中,也不过是多次调用api而已了!
[DllImport("user32.dll", EntryPoint="SendMessage")]
public static extern int SendMessage( int hWnd, int Msg, int wParam, int lParam);

ncucf 2004-07-16
  • 打赏
  • 举报
回复
呵呵,知道你说的可选中的内容是指 可以选中并复制的内容!

可是这也有好多种啊,我的意思是,可能有多个函数可以输出这样的内容,这就不太容易捕捉了!

首先截获远程窗口的句柄,然后把远程线程插入,再拦截某个输出函数,把那些输出内容返回到你的程序!

不过如果你是笼统的要获取可选中的内容的话,可能不好处理啊!因为你不知道那些可选中的,到底是什么函数输出来的!
simonw 2004-07-16
  • 打赏
  • 举报
回复
是输入进程的映象名.

窗口内可选中的内容解释:
在窗口内某处按住鼠标左键不放,拉一段区域,然后这个区域会变成蓝色,放开,在蓝色区域上单击鼠标右键就会出来弹出菜单上面有复制选项.

我想也是要调用api功能,但是有没有个可以参考的代码呢,或者详细一些的步骤,比如获取窗口的句柄然后...
ncucf 2004-07-16
  • 打赏
  • 举报
回复
不清楚你的意思!
你是想在你的程序里面,只要输入一个其他程序的程序名(应该是其他进程的映象名吧),就可以截取它的输出?
你说什么叫“可选中的内容”呢,这个范围太广了点啊!

我想你可以利用api的挂钩函数,挂钩一些其他程序用来输出的函数!
好像没有什么快捷方便的方式,能实现到这么复杂的功能!
liyoukebit 2004-07-16
  • 打赏
  • 举报
回复
我来也
Private Sub TextBox1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Enter
TextBox1.SelectionStart = 0
TextBox1.SelectionLength = TextBox1.Text.Length
End Sub
simonw 2004-07-16
  • 打赏
  • 举报
回复
一直顶到有人来...
simonw 2004-07-16
  • 打赏
  • 举报
回复
怎么每人理我啊...
simonw 2004-07-16
  • 打赏
  • 举报
回复
to ncucf(ncu晨风)

一个本地客户端聊天窗口,可选中复制的数据就是聊天的内容,不通过截取网络数据包实现实时捕获窗口中出现的每一句话.
曲滨_銘龘鶽 2004-07-16
  • 打赏
  • 举报
回复
还要是其他计算机上的窗口?好难
如果在本机用托拽多好啊,
你到底要做什么?木马?
ncucf 2004-07-16
  • 打赏
  • 举报
回复
这跟vc关系不大,也就是几个api函数的调用而已!

你说说看,那个子窗口的可选中复制的数据,到底是怎么出来的?

simonw 2004-07-16
  • 打赏
  • 举报
回复
to ncucf(ncu晨风)

目前只是针对一个应用程序,也就是说应用程序是固定的哪个子窗口也是固定的,有例子能给一个么,我不会vc.
你说的步骤:首先截获远程窗口的句柄,然后把远程线程插入,再拦截某个输出函数,把那些输出内容返回到你的程序!应该如何实现呢,怎么嵌到c#中?

谢谢
johnzhuking 2004-07-16
  • 打赏
  • 举报
回复
没看明白
指定应用程序名?
这个应用程序指的是谁?
simonw 2004-07-15
  • 打赏
  • 举报
回复
自己顶自己
加载更多回复(2)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧