C# winform 模拟键盘输入自动接入访问网络的实例

作者:vicky liang 时间:2022-01-01 19:20:10 

背景:

由于所在办公室网络限制,笔者每天都使用网络都要先连接无线网。如下图,输入授权用户信息登录后才能使用WIFI。

丧心病狂的是该网页Cookie 过期时间为24小时,所以每天重复以下动作:打开浏览器 -> 手动输入 工号密码、密码 -> 点击“登录”按钮。

作为一个懒出天际的程序员,逃避这种重复劳动是必须滴~~C# winform 模拟键盘输入自动接入访问网络的实例

解决方案:

创建一个C# 应用程序,使用WebBrowser控件加载该页面,模拟键盘输入账号、密码,把用户配置分别赋值给两个控件,然后调用按钮的点击事件。

具体步骤:

1. 打开登录页面,按F12查看网页源码,可以看到2个输入控件名分别为 "user", "password",登录按钮名为"Login",如下图:C# winform 模拟键盘输入自动接入访问网络的实例

2. 模拟事件

模拟过程具体又可分为以下4个步骤:

step 1. 读取配置文件中的 登录网址

step 2. 加载网页

step 3. 模拟键盘操作

step 4. 退出程序

关键部分代码


/// <summary>
/// 加载网页,模拟登录动作处理
/// </summary>
private void ProcessLogin()
{
 // 验证配置文件
 if (string.IsNullOrEmpty(url))
 {
   ShowMsg("配置文件错误");
   return;
 }

ShowMsg("正在加载登录网页...");
 // 加载网页
 webBrowser1.Navigate(url);
 //等待浏览器控件加载完成
 while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
 {
   Application.DoEvents();
 }
 ShowMsg("加载完毕!");
 //模拟登录事件
 LoginSimulation(webBrowser1);
}
//模拟登录事件
private void LoginSimulation(WebBrowser wb)
{
 try
 {
   ShowMsg(string.Format("账户名:[{0}],输入账户密码...", userName));
   ShowMsg(string.Format("请确保配置文件中的用户及登录密码准确可用"));

// 网页元素
   HtmlDocument doc = wb.Document;
   HtmlElement emuser = doc.GetElementById("user");
   SetHtmlValue(emuser, userName);//设置账户
   HtmlElement empassword = doc.GetElementById("password");
   SetHtmlValue(empassword, password);//设置密码
   HtmlElement btn = doc.GetElementById("Login");
   InvokeMethod(btn, "click");//调用 登录按钮的 Click 事件 提交配置

ShowMsg("完成!");
   TimeSpan used = DateTime.Now - begin;//用时
   ShowMsg(string.Format("用时: {0}.{1}s" , used.Seconds, used.Milliseconds));
   ShowMsg("即将自动退出...");

//启动计时器,4s 后自动退出当前程序
   Timer timer = new Timer();
   timer.Interval = 4000;
   timer.Tick += new EventHandler(timer_Tick);
   timer.Start();
 }
 catch (Exception ex)
 {
   ShowMsg(ex.Message);
 }
}

 编译应用程序,把快捷方式添加到开机启动项。这样开机时就会自动运行程序接入网络啦!!!

不足之处:

1. 接入网络成功后网页会弹出如下的对话框,因此模拟登录成功后也会启动浏览器打开页面。如果能禁用就更好了。C# winform 模拟键盘输入自动接入访问网络的实例

2. 只能简单地提示模拟操作完成,调用登录按钮事件后没有检测是否登录成功。

关于以上2点不足,如果有人找到解决办法,就请大胆大意地私信笔者或留言吧 ^_^

适用场景:

本应用演示了如何在客户端加载页面并模拟键盘鼠标操作,适用于用户访问许可配置保存于服务器的登录网站,那些配置要保存到 Session(会话)的网站访问 例如淘宝登录 就不适用了,除非继续使用应用程序中的 WebBrowser 控件操作而不用外部浏览器。

附 界面全部代码及运行截图

(代码有点乱,将就着看 -_-|||)

后台代码:


using System;
using System.IO;
using System.Text;
using System.Windows.Forms;

namespace LoginAssistant
{
 public partial class MainForm : Form
 {
   public MainForm()
   {
     InitializeComponent();
     readConfigFile();
     ProcessLogin();
   }

/// <summary>
   /// 加载网页,模拟登录动作处理
   /// </summary>
   private void ProcessLogin()
   {
     // 验证配置文件
     if (string.IsNullOrEmpty(url))
     {
       ShowMsg("配置文件错误");
       return;
     }

ShowMsg("正在加载登录网页...");
     // 加载网页
     webBrowser1.Navigate(url);
     //等待浏览器控件加载完成
     while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
     {
       Application.DoEvents();
     }
     ShowMsg("加载完毕!");
     //模拟登录事件
     LoginSimulation(webBrowser1);
   }

//模拟登录事件
   private void LoginSimulation(WebBrowser wb)
   {
     try
     {
       ShowMsg(string.Format("账户名:[{0}],输入账户密码...", userName));
       ShowMsg(string.Format("请确保配置文件中的用户及登录密码准确可用"));

// 网页元素
       HtmlDocument doc = wb.Document;
       HtmlElement emuser = doc.GetElementById("user");
       SetHtmlValue(emuser, userName);//设置账户
       HtmlElement empassword = doc.GetElementById("password");
       SetHtmlValue(empassword, password);//设置密码
       HtmlElement btn = doc.GetElementById("Login");
       InvokeMethod(btn, "click");//调用 登录按钮的 Click 事件 提交配置

ShowMsg("完成!");
       TimeSpan used = DateTime.Now - begin;//用时
       ShowMsg(string.Format("用时: {0}.{1}s" , used.Seconds, used.Milliseconds));
       ShowMsg("即将自动退出...");

//启动计时器,4s 后自动退出当前程序
       Timer timer = new Timer();
       timer.Interval = 4000;
       timer.Tick += new EventHandler(timer_Tick);
       timer.Start();
     }
     catch (Exception ex)
     {
       ShowMsg(ex.Message);
     }
   }
   //自动退出
   void timer_Tick(object sender, EventArgs e)
   {
     this.Close();
   }
   /// <summary>
   /// 调用 Html 元素的方法
   /// </summary>
   /// <param name="em"></param>
   /// <param name="methodname"></param>
   private void InvokeMethod(HtmlElement em, string methodname)
   {
     if (em == null) return;
     object response = em.InvokeMember(methodname); //触发submit事件
   }

//赋值于 Html 元素
   private void SetHtmlValue(HtmlElement em, string valueStr)
   {
     if (em == null) return;
     em.SetAttribute("value", valueStr);
   }

//读取配置文件
   private void readConfigFile()
   {
     try
     {
       if(!File.Exists(fileName))return;
       using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
       {
         StreamReader m_streamReader = new StreamReader(fs);
         m_streamReader.BaseStream.Seek(0, SeekOrigin.Begin);
         string strLine = m_streamReader.ReadLine();
         while (strLine != null)
         {
           string[] data = strLine.Split('=');
           switch (data[0])
           {
             case "user":
               userName = getValue(data);
               break;
             case "password":
               password = getValue(data);
               break;
             case "url":
               url = getValue(data);
               break;
             default:
               break;
           }
           strLine = m_streamReader.ReadLine();
         }
         m_streamReader.Close();
         fs.Close();
       }
     }
     catch (Exception ex)
     {
       ShowMsg(ex.Message);
     }
   }

/// <summary>
   /// 获取取配置文件节点值
   /// </summary>
   /// <param name="arrays"></param>
   /// <returns></returns>
   private string getValue(string[] arrays)
   {
     StringBuilder sb = new StringBuilder();
     sb.Append(arrays[1]);
     for (int i = 2; i < arrays.Length; i++)
     {
       sb.Append("=" + arrays[i]);
     }
     return sb.ToString();
   }

/// <summary>
   /// 显示信息
   /// </summary>
   /// <param name="p"></param>
   private void ShowMsg(string p)
   {
     rtbStatus.AppendText(string.Format("[{0}] {1}\r\n",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), p));
   }

#region variables

//账号、密码
   private string userName = "allliangkaiyu"; // default
   private string password = "vicky";

private string url = string.Empty; //登录页面

string fileName = "WirelessAssistantConfig.ini"; //配置文件名
   WebBrowser webBrowser1 = new WebBrowser();//浏览器控件
   private DateTime begin = DateTime.Now;//当前时刻

#endregion

#region 按钮事件

//登录
   private void btnRegister_Click(object sender, EventArgs e)
   {
     ProcessLogin();
   }

//退出
   private void btnExit_Click(object sender, EventArgs e)
   {
     this.Close();
   }
   #endregion

}
}

designer.cs 代码:


namespace LoginAssistant
{
 partial class MainForm
 {
   /// <summary>
   /// Required designer variable.
   /// </summary>
   private System.ComponentModel.IContainer components = null;

/// <summary>
   /// Clean up any resources being used.
   /// </summary>
   /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
   protected override void Dispose(bool disposing)
   {
     if (disposing && (components != null))
     {
       components.Dispose();
     }
     base.Dispose(disposing);
   }

#region Windows Form Designer generated code

/// <summary>
   /// Required method for Designer support - do not modify
   /// the contents of this method with the code editor.
   /// </summary>
   private void InitializeComponent()
   {
     System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
     this.btnInput = new System.Windows.Forms.Button();
     this.rtbStatus = new System.Windows.Forms.RichTextBox();
     this.btnExit = new System.Windows.Forms.Button();
     this.SuspendLayout();
     //
     // btnInput
     //
     this.btnInput.Font = new System.Drawing.Font("Consolas", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
     this.btnInput.Location = new System.Drawing.Point(46, 235);
     this.btnInput.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
     this.btnInput.Name = "btnInput";
     this.btnInput.Size = new System.Drawing.Size(86, 36);
     this.btnInput.TabIndex = 0;
     this.btnInput.Text = "重新登录";
     this.btnInput.UseVisualStyleBackColor = true;
     this.btnInput.Click += new System.EventHandler(this.btnRegister_Click);
     //
     // rtbStatus
     //
     this.rtbStatus.BackColor = System.Drawing.SystemColors.Control;
     this.rtbStatus.Dock = System.Windows.Forms.DockStyle.Top;
     this.rtbStatus.Location = new System.Drawing.Point(0, 0);
     this.rtbStatus.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
     this.rtbStatus.Name = "rtbStatus";
     this.rtbStatus.Size = new System.Drawing.Size(322, 229);
     this.rtbStatus.TabIndex = 1;
     this.rtbStatus.Text = "";
     //
     // btnExit
     //
     this.btnExit.Font = new System.Drawing.Font("Consolas", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
     this.btnExit.ForeColor = System.Drawing.Color.Red;
     this.btnExit.Location = new System.Drawing.Point(150, 235);
     this.btnExit.Name = "btnExit";
     this.btnExit.Size = new System.Drawing.Size(75, 36);
     this.btnExit.TabIndex = 2;
     this.btnExit.Text = "退出";
     this.btnExit.UseVisualStyleBackColor = true;
     this.btnExit.Click += new System.EventHandler(this.btnExit_Click);
     //
     // MainForm
     //
     this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 13F);
     this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
     this.ClientSize = new System.Drawing.Size(322, 274);
     this.Controls.Add(this.btnExit);
     this.Controls.Add(this.rtbStatus);
     this.Controls.Add(this.btnInput);
     this.Font = new System.Drawing.Font("Consolas", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
     this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
     this.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
     this.Name = "MainForm";
     this.Text = "无线网络助手 V20160908&copy; vicky";
     this.ResumeLayout(false);

}

#endregion

private System.Windows.Forms.Button btnInput;
   private System.Windows.Forms.RichTextBox rtbStatus;
   private System.Windows.Forms.Button btnExit;
 }
}

运行截图:
C# winform 模拟键盘输入自动接入访问网络的实例

原文链接:http://www.cnblogs.com/EasyInvoice/p/6070563.html

标签:winform,键盘输入,c#
0
投稿

猜你喜欢

  • Java Spring框架的注解式开发你了解吗

    2022-12-14 23:43:18
  • java求余的技巧汇总

    2023-08-06 06:33:16
  • Android实现登陆页logo随键盘收放动态伸缩(完美解决键盘弹出遮挡控件的问题)

    2022-05-25 04:13:26
  • Java基础语法之二维数组详解

    2023-05-09 16:49:20
  • java泛型详解

    2023-06-07 23:54:47
  • IDEA类存在但找不到的解决办法

    2021-10-22 07:24:43
  • idea在用Mybatis时xml文件sql不提示解决办法(提示后背景颜色去除)

    2023-11-09 01:45:51
  • 浅析Disruptor高性能线程消息传递并发框架

    2023-02-26 14:09:01
  • C#定时关闭窗体实例

    2023-07-09 22:53:25
  • 使用Java程序模拟实现新冠病毒传染效果

    2022-09-12 20:26:14
  • Java+TestNG接口自动化入门详解

    2023-11-05 04:37:58
  • 深入理解Android中的建造者模式

    2023-06-27 05:55:17
  • Java8函数式接口的基础学习教程

    2023-12-16 12:57:59
  • Android EditText实现关键词批量搜索示例

    2022-12-09 06:20:21
  • Java中线程休眠编程实例

    2021-09-06 11:42:55
  • 25个最好的免费Eclipse插件

    2021-09-21 10:56:24
  • Java注解Annotation原理及自定义注解代码实例

    2023-04-30 10:18:09
  • maven环境变量配置讲解

    2023-11-29 12:35:51
  • 详解Android中AsyncTask的使用方法

    2023-10-08 04:24:51
  • C#表达式和运算符详细解析

    2021-09-30 23:39:09
  • asp之家 软件编程 m.aspxhome.com