积极答复者
已经运行的线程可以重定向输入输出吗?

问题
答案
-
一旦开始了进程 一些属性就没办法修改了
否则想读取相应进程的方法会报错 StandardOut has not been redirected or the process hasn't started yet
我自己写的例子Module Module1
Dim WithEvents proc As New Process()
Sub Main()
proc.StartInfo.FileName = "c:\windows\system32\cmd.exe"
proc.StartInfo.RedirectStandardInput = True
proc.StartInfo.RedirectStandardOutput = True
proc.StartInfo.UseShellExecute = False
proc.Start()
Dim t As New Threading.Thread(AddressOf output)
t.Start()
Do
proc.StandardInput.WriteLine(Console.ReadLine())
Loop
End Sub
Sub output()
Do
Console.OpenStandardOutput().WriteByte(proc.StandardOutput.BaseStream.ReadByte)
Loop
End Sub
End Module
Guitar Hero IV -- Singing Rock & Roll.- 已标记为答案 feiyun0112Moderator 2009年2月7日 1:04
全部回复
-
一旦开始了进程 一些属性就没办法修改了
否则想读取相应进程的方法会报错 StandardOut has not been redirected or the process hasn't started yet
我自己写的例子Module Module1
Dim WithEvents proc As New Process()
Sub Main()
proc.StartInfo.FileName = "c:\windows\system32\cmd.exe"
proc.StartInfo.RedirectStandardInput = True
proc.StartInfo.RedirectStandardOutput = True
proc.StartInfo.UseShellExecute = False
proc.Start()
Dim t As New Threading.Thread(AddressOf output)
t.Start()
Do
proc.StandardInput.WriteLine(Console.ReadLine())
Loop
End Sub
Sub output()
Do
Console.OpenStandardOutput().WriteByte(proc.StandardOutput.BaseStream.ReadByte)
Loop
End Sub
End Module
Guitar Hero IV -- Singing Rock & Roll.- 已标记为答案 feiyun0112Moderator 2009年2月7日 1:04
-
-
韦恩卑鄙 说:
其实windows api 的钩子技术 是可以无论对方的软件如何 强行读写数据的
其实模拟键盘也是同样的道理
找到对方窗体的指针 建立一个钩子 然后用钩子向这个窗体发送 message
message包括 读取 写入 模拟键盘
因为windows 底层是消息机制 所以这种方法能够钩住大多数(除了javavm 和flash等现实层完全颠覆message机制的程序)gdi+的程序
但是 这种程序行为还是会被一些杀毒软件发现
Guitar Hero IV -- Singing Rock & Roll.
首先我做这个是为了能够自动填写一些常用的数据,虽然行为上有点类似后门程序,但是即便杀毒软件提示了,放行便是。
只要能实现这样的效果,节省的工作量是极其巨大的。
作为一个业务系统,单位的系统实在是不敢恭维,不够人性化,重复的作一些大量繁琐易重复出错的工作,所以便想到如果数据能事先准备好,自动录入就好了。
我知道VB6下面的消息发送可以用Message的API,不过VB2008就不太熟悉,工具箱里面似乎有个消息队列的控件,还有线程组件,这里能派上用场吗?
你说的Java虚拟机真是正中要害,那个业务系统就是Java编写的,
但是作为一个在Windows下运行的虚拟环境,Java的程序毕竟还是要和用户交互,方法应该还是有的吧?
自从用上VB2008以来,我觉得这个语言已经比VB6方便了很多,总是不甘心就这样放弃了。
现在所知的是:
目标程序是固定的,其操作界面和位置,录入的方式,可能的提示都是可知的,而且手头有平常需要大量重复录入的数据。
那么如何判断界面上的东西??如何往上面输入东西??
:)
这真是一个头痛的问题,自从学VB以来遇到的最棘手的问题
我今天试验了SendKey方法,对于Windows下的Java程序还是管用的。但是那个Java程序有不定长的延迟,用SendKey一古脑的输进去很容易错位,又不知道怎么截获界面信息?
谢谢:) -
韦恩卑鄙 说:
呵呵 这个时候 一些游戏用的外挂软件可能就比较成熟了哦
你可以搜索一个按键精灵参考下 不定长的延迟 就设置一个足够长的延迟对应 也许就好了
如果按键精灵的脚本能够在你说的程序上生效 你就可以考虑直接采用案件精灵 或者按照同样的思路实现 这也算是某种原形开发
另外 消息队列的控件是windows若干服务和程序之间用来远程过程调用的服务,还有线程组件也不是咱们目前问题需要的组建
Guitar Hero IV -- Singing Rock & Roll.
按键精灵不能检测录入是不是在特定位置,足够长的延迟,VB2008已经能实现,但是每次都足够长的延迟,效率就大打折扣了。所以,获取界面是必须的。不然的话,盲输入会出很多问题。 -
应该也不是什么高杆的事情吧。
现在金山词霸不是都能对界面翻译吗?金山词霸是获取鼠标位置的文本来实现的,实现的本质是获得真正的文本。
还有Adobe Reader对图片的即指即译,OCR软件的图像转文本。
相对而言,对于一个固定的程序界面来做识别,由于目标程序是固定的,所以它的提示界面和标签都是固定的,难度还要小很多。
如果进行模糊识别,只要图形上的点阵有95%的相似度,即可认为是同一个文字。
但是对固定的界面,相同的显示器色彩,图形上各点应该精确一致的,这也降低了识别的难度,你说是吗?
所以,我想试一试:)
不过,这里还要请教:
如何获取特定窗体的截图?
在VB2008,对其他程序窗体的操作是不是还是需要调用API?
然后是如何判断图形上各点的颜色?
我想VB2008上应该有比VB6更方便的方式。
谢谢,呵呵:)