小弟是名网管,负责监控网络运行情况。我们系统内部有一套软件叫《文电系统》,大致功能就是传个文件什么的,但是是加密传输。每天都要用一封电子邮件(不加密)测试网络情况,收到后必须马上回执,否则定为事故。今天早晨因为多次回执不及时的原因被领导暴骂一顿,遂生出开发一个小软件,实现来报自动回执功能的想法,广泛征求设计思路。具体设想如下:
1:监视windows应用程序窗口,弹出特定名称窗口时,捕获之
2:对窗口文本域内容进行检索,符合一定条件时执行自动回执。如:线路测试、测试报等字样
3:控制鼠标键盘,点击“回执”单选框,自动输入“来电收到!”,点击“发送”。
4:弹出消息,通知网管回执处理日志。
第一条功能我以前做过,应该问题不大,第四条问题也不大。主要问题在于第二条第三条,vb对其他窗体的控制我以前研究过一点,但没有什么发现;对鼠标键盘的控制我没有做过,不知道怎样实现。如果有哪位高人碰巧看到这个帖子,觉得有点意思,请不吝赐教!小弟先谢le!

解决方案 »

  1.   

    就是一堆API的组合,没什么难的吧我通过这几天在CSDN学到的东西,感觉就可以解决这个问题啦。。给我1个小时,我一会给你代码。
      

  2.   

    不知道你们邮件传输是不是采用标准的协议,如果是的话,网上找一个pop3邮件客户端改一下,实现对邮件的监控就可以了。
      

  3.   

    思路:通过api函数,监视windows应用程序窗口,如果满足条件了,则Shell (outlook),然后用sendkeys操作键盘。发送邮件。代码都是这3天在csdn的VB区泡著,凑起来的。新建一个工程,有2个text,分别是text1,text2。还有一个timer
    -------------------------------------------------
    Private Declare Function GetForegroundWindow Lib "user32" () As LongPrivate Declare Function GetWindowText Lib "user32" _
            Alias "GetWindowTextA" (ByVal hwnd As Long, _
            ByVal lpString As String, ByVal cch As Long) As Long
    '上面的2个api是获得windows活动窗口的函数
    Private Declare Sub Sleep Lib "kernel32" ( _
            ByVal dwMilliseconds As Long)
    '上面这个是sleep函数
    '-----------------------------------------------
    Private Sub Form_Load()
    Text1.Text = ""
    Text2.Text = ""
    Timer1.Interval = 100
    End Sub
    '-----------------------------------------------
    Private Sub Text1_Change()
        If Text1.Text = "MSN Messenger (BETA)" Then'我这个地方使用的活动窗口为MSN
        Text2.Text = ""
        Text2.SetFocus
        SendKeys "recall {ENTER}"
        End If
    End Sub
    '------------------------------------------------
    Private Sub Text2_KeyPress(KeyAscii As Integer)
    Dim Recall, AnyString
        If KeyAscii = 13 Then
    '    Stop
        Recall = Shell("C:\Program Files\Microsoft Office\Office\OUTLOOK.EXE", vbNormalNoFocus)                               '调用outlook
    '    Stop
        SendKeys "^n"                              '就是ctrl+n
           
        SendKeys "huangh1"                         '收信人的mail id
        SendKeys "{TAB 3}"                         '按3下tab键
        
        SendKeys "send a letter"                   '信的内容
        Sleep (3000)                               'xia xie de
        SendKeys "^{ENTER}"                        'ctrl+Enter
        Sleep (1000)                               'xia xie de
        Text2.SetFocus
        Text2.Text = "xiabanhuijiachifanle"    End If
    End Sub
    --------------------------------------API原封COPY--------------------------
    Private Sub Timer1_Timer()
        Static CurrentHwnd As Long
        Dim ForegroundWindowHwnd As Long
        Dim sText As String * 255
        ForegroundWindowHwnd = GetForegroundWindow
        If ForegroundWindowHwnd = CurrentHwnd Then Exit Sub
        CurrentHwnd = ForegroundWindowHwnd
        If CurrentHwnd <> hwnd Then
        Text1.Text = Left(sText, GetWindowText(CurrentHwnd, sText, 255))
        Else
        Text1.Text = "Form1 "
        End If
    End Sub
    ------------------------------------------------------------------
    没了
      

  4.   

    我刚才试验了一下,挺好玩的,哈哈,就是下面的outlook越开越多。用Sendkeys "%{F4}"不好用
      

  5.   

    首先感谢几位高手不吝赐教!尤其wxytvmnn这位兄台还热心的给出了代码,万分感激!wxytvmnn兄的代码我看过了,应该说思路非常好,如果在internet上是万全可行的。但是我在提问的帖子里忽略了说明一个情况:我们这套文电系统是运行在专用的x.25广域网,协议是x.400和x.500,outlook好像不能用。但是您的代码给了我一个很清晰的思路把你的outlook换成我们的文电主程序,然后用sendkeys执行鼠标键盘操作,应该可以实现。另外,还有人建议我监听来报端口或用api测试来完成这个任务,但是我不大明白,几位兄台能解释一下吗?再一次感谢
      

  6.   

    cobrastudio(老汉我) 兄提的建议也很好,但是要是那样我就要熟悉x.400协议,写一个邮件客户端,难度挺大,我觉得最好还是用我们自己的程序发送比较好,因为这样不容易出问题,要是一出问题,被人查出来,小弟可要下岗了~~~~~~~
     TechnoFantasy(冰儿马甲www.applevb.com)兄说的和cobrastudio(老汉我) 兄说的是一个途径,因为我们的邮件协议是与众不同的,所以不能实现。
    再次感谢大家的支持!
      

  7.   

    可以通过TCP通信的方式来实现,将你要测试的机子做为服务器,你自己的机子作为客户端。这样可以不断的监听你所发过去的数据。当服务器有数据接收到的时候判断接收到的是什么数据,比如:接收到是你的测试数据的时候,发送应答。这样就不用用邮件来测试了。可以用Winsock控件实现。也可以通过串口通信的方式实现。其原理是一样的。
      

  8.   

    晕。。名字写错了。。wxylvmnn.....bushi wxytnmnn.....给分给分
      

  9.   

    这种办法是个好办法,但是在我们这里是不允许的,必须人工回执,兼查人在位。如果光是看网络通不通,我ping就行了,呵呵。我们的系统是不是比较变态?那天因为回执的事被领导骂得要哭了呢!
      

  10.   

    这几天比较忙,没顾得上来看。wxylvmnn兄,怎么给分啊?另外一个问题:如果我能捕获活动窗口,如何控制窗口内的控件吗?如按钮、文本框、列表的list等等,不要用sendkeys(如果用tab键,起始位置变了就不行了),有其他的方法吗?
      

  11.   

    dyang1027(随缘)兄的建议我仔细考虑了一下,我的理解是这样的:要用tcp,必然是c/s模式,我的服务端必然要有一端运行在我们上级的服务器或终端,这个难度可大了,如果我要有那个力度,我还怕他们查岗么? ^_^  至于串口通信我不太了解,准备看看。谢谢啊~~~缘分呐~~~~~~