如何使用C#实际执行此ISP拨号程序?

时间:2013-06-09 21:33:35

标签: c# networking network-programming

要连接到互联网,我必须运行我的ISP提供的拨号器。现在的问题是,每当我将电脑放在一夜之间(为了下载目的),拨号器断开连接(网络故障或随机断开连接),下载停止。这对我来说非常令人沮丧。

所以我尝试编写一个C#程序,它将:

1. When you run it, it will start 30 minutes timer.
2. After 30 minutes, it will ping google to check if the net is connected or not.
3. If it is connected, no action will be performed and timer will again check after 30 minutes.
4. If it is not connected then it will execute my ISP's dailer. After connecting, it will again check after 30 minutes.

现在问题是我对C#很新,并且不能很好地编写代码。但我已成功ping谷歌并显示相关的消息框。

这是我到目前为止编写的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.NetworkInformation;
using System.Net;
using System.Diagnostics;

namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
    Timer timer = new Timer();

    public Form1()
    {
        InitializeComponent();
        timer.Tick += new EventHandler(timer1_Tick); 
        timer.Interval = (1000) * (10);           
        timer.Enabled = true;                       
        timer.Start();                              
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {

        Ping ping = new Ping();

        PingReply pingStatus = ping.Send(IPAddress.Parse("208.69.34.231"));

        if (pingStatus.Status == IPStatus.Success)
        {
            MessageBox.Show("Pinged Google Successfully");
        }
        else
        {
            MessageBox.Show("Can't Ping to Google.");
        }


    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        Process.Start("C:\\WINDOWS\\system32\\rasphone.exe","-d DELTA1");
    }

}
}

现在我知道这段代码有点乱,但最终确实打开了我的ISP拨号程序(图片:http://s12.postimg.org/xscgsdcxp/untitled.jpg),但我仍然必须手动按下拨号器中的连接按钮。如何自动执行此按钮?

如果有人可以帮我重新排列代码,我真的很感激。

谢谢。

此致 Shajee A。

1 个答案:

答案 0 :(得分:0)

我对此并不完全熟悉,但我认为你想使用rasdial DELTA1代替rasphone -d DELTA1。 Rasdial专为无人值守使用而设计,而rasphone旨在与用户进行交互。请参阅此question

如果支持,您可以使用UI Automation API在UI中以编程方式单击按钮。这是一个非常基本的概述:

using System.Windows.Automation;

Process p = Process.Start("C:\\WINDOWS\\system32\\rasphone.exe","-d DELTA1");
Thread.Sleep(5000); // give the program some time to start.
var windowElement = AutomationElement.FromHandle(p.MainWindowHandle);
var connectButton = windowElement.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.NameProperty, "Connect"));
var invokePattern = (InvokePattern)connectButton.GetCurrentPattern(InvokePattern.Pattern);
invokePattern.Invoke();

当然,如果程序在初始化时禁用“连接”并且稍后启用它,则可能需要一些重试逻辑或错误处理。

至于你的代码,你想在定时器回调中执行ping操作。我猜你有一个测试按钮。我认为这会更有意义:

private void timer1_Tick(object sender, EventArgs e)
{
    Ping ping = new Ping();
    PingReply pingStatus = ping.Send("www.google.com");

    if (pingStatus.Status != IPStatus.Success)
    {
        Process.Start("C:\\WINDOWS\\system32\\rasphone.exe","-d DELTA1");
        // automation logic here.
    }       
}