none
已经运行的线程可以重定向输入输出吗? RRS feed

  • 问题

  • 按照MSDN和一些文章的说明,进程的StandardInput属性可以向程序输入文本,但是要在线程启动的时候设置RedirectStandardInput为True。
    那么,如果该线程已经在运行,该用什么办法修改StandardInput呢?

    同样还有StandardOutput该如何实现?

    另外,我想问,StandardInput的输入效果,可以实现像从键盘向Windows程序的文本框输入那样的效果吗?我的意思是不需要考虑这个Windows程序的内部构造,而根据界面的输入焦点来输入吗?

    谢谢:)
    2009年2月5日 5:00

答案

  • 一旦开始了进程   一些属性就没办法修改了
    否则想读取相应进程的方法会报错 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.
    2009年2月5日 5:52

全部回复

  • 一旦开始了进程   一些属性就没办法修改了
    否则想读取相应进程的方法会报错 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.
    2009年2月5日 5:52
  • 另外,我想问,StandardInput的输入效果,可以实现像从键盘向Windows程序的文本框输入那样的效果吗?我的意思是不需要考虑这个Windows程序的内部构造,而根据界面的输入焦点来输入吗?


    关于这个问题    StandardInput/output  只能针对  console 对象的  input/outstream 进行读写

    如果你调用的windows应用程序对这两个流有所监听   对方是可以收到相应信息的  但是如果目标程序不支持类似的命令监听   你就没办法处理了


    Guitar Hero IV -- Singing Rock & Roll.
    2009年2月5日 5:56
  • 原来是这样,在MSDN看到这个StandardInput的时候我还白高兴了一场呢,此路不通。

    那么如果要往另一个程序里面输入东西,不考虑目标程序的内部结构,是不是就没有办法了?
    能不能只考虑目标程序界面,依次录入?

    或者编写一个模拟硬件的键盘来录入?

    不知道哪个比较可行呢?
    2009年2月5日 8:39
  • 其实windows api 的钩子技术 是可以无论对方的软件如何  强行读写数据的

    其实模拟键盘也是同样的道理  

    找到对方窗体的指针  建立一个钩子  然后用钩子向这个窗体发送 message 
    message包括 读取 写入  模拟键盘



    因为windows 底层是消息机制  所以这种方法能够钩住大多数(除了javavm 和flash等现实层完全颠覆message机制的程序)gdi+的程序

    但是 这种程序行为还是会被一些杀毒软件发现 


    Guitar Hero IV -- Singing Rock & Roll.
    2009年2月5日 9:03
  •  
    韦恩卑鄙 说:

    其实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一古脑的输进去很容易错位,又不知道怎么截获界面信息?

    谢谢:)
    2009年2月5日 13:22
  •   呵呵 这个时候 一些游戏用的外挂软件可能就比较成熟了哦

    你可以搜索一个按键精灵参考下  不定长的延迟  就设置一个足够长的延迟对应  也许就好了

    如果按键精灵的脚本能够在你说的程序上生效   你就可以考虑直接采用案件精灵  或者按照同样的思路实现 这也算是某种原形开发

    另外 消息队列的控件是windows若干服务和程序之间用来远程过程调用的服务,还有线程组件也不是咱们目前问题需要的组建
    Guitar Hero IV -- Singing Rock & Roll.
    2009年2月5日 15:27
  • 韦恩卑鄙 说:

      呵呵 这个时候 一些游戏用的外挂软件可能就比较成熟了哦

    你可以搜索一个按键精灵参考下  不定长的延迟  就设置一个足够长的延迟对应  也许就好了

    如果按键精灵的脚本能够在你说的程序上生效   你就可以考虑直接采用案件精灵  或者按照同样的思路实现 这也算是某种原形开发

    另外 消息队列的控件是windows若干服务和程序之间用来远程过程调用的服务,还有线程组件也不是咱们目前问题需要的组建


    Guitar Hero IV -- Singing Rock & Roll.



    按键精灵不能检测录入是不是在特定位置,足够长的延迟,VB2008已经能实现,但是每次都足够长的延迟,效率就大打折扣了。所以,获取界面是必须的。不然的话,盲输入会出很多问题。
    2009年2月6日 8:11
  • 这可就非常高杆了  就算是案件精灵也是非常高杆的用法  比如判断指定位置的像素  判断鼠标位置等。。。

    但是 程序毕竟不是人啊。。。  说智能  哪有那么智能 T_T
    Guitar Hero IV -- Singing Rock & Roll.
    2009年2月6日 8:47
  • 应该也不是什么高杆的事情吧。
    现在金山词霸不是都能对界面翻译吗?金山词霸是获取鼠标位置的文本来实现的,实现的本质是获得真正的文本。
    还有Adobe Reader对图片的即指即译,OCR软件的图像转文本。

    相对而言,对于一个固定的程序界面来做识别,由于目标程序是固定的,所以它的提示界面和标签都是固定的,难度还要小很多。

    如果进行模糊识别,只要图形上的点阵有95%的相似度,即可认为是同一个文字。
    但是对固定的界面,相同的显示器色彩,图形上各点应该精确一致的,这也降低了识别的难度,你说是吗?

    所以,我想试一试:)

    不过,这里还要请教:
    如何获取特定窗体的截图?
    在VB2008,对其他程序窗体的操作是不是还是需要调用API?
    然后是如何判断图形上各点的颜色?

    我想VB2008上应该有比VB6更方便的方式。

    谢谢,呵呵:)
    2009年2月6日 13:27
  • 再说了,我觉得程序还是有很大的潜力,说不够智能,只是我们现在实现的功能模块还太少,要构建复杂的机制非常困难,所以智能才十分有限。这也需要一个优秀的编程软件,以便编程人员节省时间,集中编写高级处理模块。

    这个扯远了,与这个帖子无关了:)
    2009年2月6日 13:31