VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > C#教程 >
  • c#中的模拟键盘

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

  前一段时间疯狂的迷上了魔兽世界,为之疯狂,但是9c的5区,让多少玩家郁闷啊,守护之剑每天排队800+,还不停地卡机,掉线,本人上班族,每天晚上6点下班回家排队,上线也都8点多了,MC啊,黑E啊,AQL啊等活动早开始了,十分的郁闷!

  为了按时玩游戏,本着将魔兽进行到底的原则,决定开发一个魔兽的自动登陆器,以解决燃眉之急,哈哈!

  首先定义一个类ViaStruct,用来存储游戏的路径,等待时间,以及用户名,密码!

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;
namespace KeyBoardInput
{
  [Serializable]
  public class ViaStruct
  {
    private string timer = "";
    private string filepath = "";
    private string username = "";
    private string pwd = "";
    private string timer2 = "";
    public bool SuccessFlag = false;
    public ViaStruct()
    {
      SuccessFlag=ReadFormKBI();
    }
    #region 属性
    public string Timer
    {
      get { return timer; }
      set { timer = value; }
    }
    public string FilePath
    {
      get { return filepath; }
      set { filepath = value; }
    }
    public string UserName
    {
      get { return username; }
      set { username = value; }
    }
    public string Pwd
    {
      get { return pwd; }
      set { pwd = value; }
    }
    public string Timer2
    {
      get { return timer2; }
      set { timer2 = value; }
    }
    #endregion
    private bool ReadFormKBI()
    {
      StreamReader sr = new StreamReader("info.txt");
      if ((this.filepath = sr.ReadLine()) == null || this.filepath == "")
      {
        return false;
      }
      this.timer = sr.ReadLine();
      this.timer2 = sr.ReadLine();
      this.username = sr.ReadLine();
      this.pwd = sr.ReadLine();
      sr.Close();
      sr.Dispose();
      GC.Collect();
      return true;
    }
    public void WriteToKBI()
    {
      Thread th = new Thread(new ThreadStart(NewMethod));
      th.Start();
    }
    private void NewMethod()
    {
      try
      {
        StreamWriter sw = new StreamWriter("info.txt");
        sw.WriteLine(this.filepath);
        sw.Flush();
        sw.WriteLine(this.timer);
        sw.Flush();
        sw.WriteLine(this.timer2);
        sw.Flush();
        sw.WriteLine(this.username);
        sw.Flush();
        sw.WriteLine(this.pwd);
        sw.Flush();
        sw.Close();
        MessageBox.Show("写入成功!");
      }
      catch (Exception ex)
      {
        MessageBox.Show(ex.Message);
      }
    }
  }
}
  
然后编写Form1窗口
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;
namespace KeyBoardInput
{
  public partial class Form1 : Form
  {
    ViaStruct via;
    Thread th;
    Thread ti;
    public Form1()
    {
      InitializeComponent();
      via = new ViaStruct();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
      this.textBox1.Text = via.UserName;
      this.textBox2.Text = via.Pwd;
      this.textBox3.Text = via.FilePath;
      this.textBox4.Text = via.Timer2;
      this.comboBox1.Text = via.Timer;
      th = new Thread(new ThreadStart(NewMethod));
      th.Start();
    }
    private void NewMethod()
    {
      if (via.SuccessFlag)
      {
        try
        {
          Thread.Sleep(Convert.ToInt32((Convert.ToDecimal(via.Timer) * 60 * 1000)));//开起程序后等待
                                                                             //via.Timer时间内启动程序
          Process.Start(via.FilePath);
          Thread.Sleep(Convert.ToInt32((Convert.ToDecimal(via.Timer2) * 60 * 1000)));//启动程序后等待                                                                   //via.Timer2时间输入用户名密码
        }
        catch (Exception ex)
        {
         if(ex.GetType().ToString()!="System.Threading.ThreadAbortException")
          MessageBox.Show(ex.Message+"1");
        }        
      }
      if (via.SuccessFlag)
      {
        MySendKeys();
      }
    }
    private void button1_Click(object sender, EventArgs e)
    {
      this.openFileDialog1.RestoreDirectory = true;
      if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
      {
        this.textBox3.Text = this.openFileDialog1.FileName;
      }
      // MessageBox.Show(Environment.CurrentDirectory);
    }
    private void notifyIcon1_DoubleClick(object sender, EventArgs e)
    {
      this.Show();
    }
    private void Form1_MinimumSizeChanged(object sender, EventArgs e)
    {
      this.Visible = false;
    }
    private void MySendKeys()//输入用户名密码
    {
      foreach (char ArrayValue in via.UserName.ToCharArray())
      {
        SendKeys.SendWait(ArrayValue.ToString());
        Thread.Sleep(10);
      }
      SendKeys.SendWait("{Tab}");
      foreach (char ArrayValue in via.Pwd.ToCharArray())
      {
        SendKeys.SendWait(ArrayValue.ToString());
        Thread.Sleep(10);
      }
      SendKeys.SendWait("{Enter}");
    }
    private void button2_Click(object sender, EventArgs e)//给Via对象赋值
    {
      via.Timer = this.comboBox1.Text;
      via.Timer2 = this.textBox4.Text;
      via.FilePath = this.textBox3.Text;    
      via.UserName = this.textBox1.Text;
      via.Pwd = this.textBox2.Text;
      via.WriteToKBI();     
    }
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)//关闭窗口后推出线程
    {
      if (th.ThreadState != System.Threading.ThreadState.Aborted)
        th.Abort();
      if (ti!=null&&ti.ThreadState !=System.Threading.ThreadState.Aborted)
        ti.Abort();
    }
    private void button3_Click(object sender, EventArgs e)
    {
      th.Abort();
      ti = new Thread(new ThreadStart(PrograssImmediately));
      ti.Start();
    }
    private void PrograssImmediately()
    {
      if (via.SuccessFlag)
      {
        try
        {
          Process.Start(via.FilePath);
          Thread.Sleep(Convert.ToInt32((Convert.ToDecimal(via.Timer2) * 60 * 1000)));
        }
        catch (Exception ex)
        {
          //MessageBox.Show(ex.GetType().ToString());
          if (ex.GetType().ToString() != "System.Threading.ThreadAbortException")
            MessageBox.Show(ex.Message + "1");
        }
      }
      if (via.SuccessFlag)
      {
        MySendKeys();
      }
    } 
  }
}

  把改程序的快捷方式拷入启动里,让其成为开机自启动程序

  程序在VS2005 WinXp系统下测试成功!

  局限性:

  1.需要主板BIOS支持自动开机;

  2.开机以后电脑就连在互连网上;

  3.需要.net framework2.0的支持

  来源:http://blog.csdn.net/firestone2003/archive/2006/06/24/829316.aspx#464431

  用这个  System.Windows.Forms.SendKeys.Send(); 就是模拟键盘

  下面是一些特殊符号的键盘值

System.Windows.Forms.SendKeys.Send("+="); //值+
System.Windows.Forms.SendKeys.Send("+9"); //值(
System.Windows.Forms.SendKeys.Send("+8"); //值*
System.Windows.Forms.SendKeys.Send("+7"); //值&
System.Windows.Forms.SendKeys.Send("+6"); //值^
System.Windows.Forms.SendKeys.Send("+5"); //值%
System.Windows.Forms.SendKeys.Send("+4"); //值$
System.Windows.Forms.SendKeys.Send("+3"); //值#
System.Windows.Forms.SendKeys.Send("+2"); //值@
System.Windows.Forms.SendKeys.Send("+1"); //值!
System.Windows.Forms.SendKeys.Send("+0"); //值)
System.Windows.Forms.SendKeys.Send("+`"); //值~

  下面是常用的值

 

代表的键 指定值 KeyLabelName
LEFTARROW
RIGHTARROW
UPARROW
DNARROW
HOME HOME
END END
PAGE UP PGUP
PAGE DOWN PGDN
DEL DEL
BACKSPACE BACKSPACE
SPACEBAR SPACEBAR
INS INS
TAB TAB
SHIFT+TAB BACKTAB
Left Brace LBRACE
Right Brace RBRACE
ENTER ENTER
F1 to F12 F1, F2, F3 ...
CTRL+F1 to CTRL+F12 CTRL+F1, CTRL+F2 ...
SHIFT+F1 to SHIFT+F12 SHIFT+F1, SHIFT+F2 ...
ALT+F1 to ALT+F12 ALT+F1, ALT+F2, ALT+F3 ...
ALT+0 to ALT+9 ALT+0, ALT+1, ALT+2 ...
ALT+A to ALT+Z ALT+A, ALT+B, ALT+C ...
CTRL+LEFT ARROW CTRL+LEFTARROW
CTRL+RIGHT ARROW CTRL+RIGHTARROW
CTRL+HOME CTRL+HOME
CTRL+END CTRL+END
CTRL+PAGE UP CTRL+PGUP
CTRL+PAGE DOWN CTRL+PGDN
CTRL+A TO CTRL+Z CTRL+A, CTRL+B, CTRL+C ...
CTRL+0 CTRL+0
RIGHT MOUSE BUTTON RIGHTMOUSE
LEFT MOUSE BUTTON LEFTMOUSE
MOUSE BUTTON MOUSE
ESC ESC

 

  来源:http://bbs.bc-cn.net/dispbbs.asp?boardid=117&id=140452 



相关教程