问题描述
我想控制电脑上网时间,比如到晚上12点时,用程序把所有的电脑上网断开?
解决方案
解决方案二:
C#连接SQLite做了一个每天定时关闭网络连接的服务最近老婆怀孕为了控制她上网看电影的时间做了一个每天在规定的时间短开网络连接的windows服务。首先用SQLite做了两个表一个是netconnection填写网络连接的信息(我是单独拉的联通2M带宽,adsl上网)。一个netweek存放平时和周末两种情况下断网的时间。首先写了一个封装SQLite操作的简单类(参考网络上的内容):usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Data;usingSystem.Data.SQLite;namespaceautonet{classDb{SQLiteConnectionconn;SQLiteCommandcom;publicDb(stringstrConn){conn=newSQLiteConnection("DataSource="+strConn);com=conn.CreateCommand();conn.Open();}publicvoidOpen(){if(conn.State!=ConnectionState.Open)conn.Open();}publicvoidClose(){if(conn.State!=ConnectionState.Closed)conn.Close();}publicvoidDoNoneSQL(stringstrnonesql){com.CommandText=strnonesql;com.ExecuteNonQuery();}publicintDoIntSQL(stringstrdointsql){intt;com.CommandText=strdointsql;t=com.ExecuteNonQuery();returnt;}publicvoidDoNoneSQL(stringstrnonesql,SQLiteParameter[]pars){ParamentsCommand(strnonesql,pars);DoNoneSQL(strnonesql);}publicSQLiteDataReaderDoDataReader(stringstrdatareadersql){com.CommandText=strdatareadersql;returncom.ExecuteReader();}publicSQLiteDataReaderDoDataReader(stringstrdatareadersql,SQLiteParameter[]pars){ParamentsCommand(strdatareadersql,pars);returnDoDataReader(strdatareadersql);}publicDataTableDoDataTable(stringstrdatatablesql){com.CommandText=strdatatablesql;SQLiteDataAdaptersda=newSQLiteDataAdapter(com);DataTabledb=newDataTable();sda.Fill(db);returndb;}publicDataTableDoDataTable(stringstrdatatablesql,SQLiteParameter[]pars){ParamentsCommand(strdatatablesql,pars);returnDoDataTable(strdatatablesql);}publicvoidBeginTrans(){conn.BeginTransaction();}publicvoidCommit(){conn.BeginTransaction().Commit();}publicvoidParamentsCommand(stringstrcontext,SQLiteParameter[]compars){com.CommandText=strcontext;if(compars!=null){foreach(SQLiteParameterparincompars){if(par.Value==null)par.Value=DBNull.Value;com.Parameters.Add(par);}}}publicSQLiteParameterMakeSQLiteParameter(stringname,DbTypetype,objectvalue){SQLiteParameterpar=newSQLiteParameter(name,type);par.Value=value;returnpar;}}}然后封装简单的连接拨号和断开拨号程序:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.ComponentModel;usingSystem.Threading;usingSystem.Diagnostics;usingSystem.Runtime.InteropServices;namespaceautonet{classmodemnet{privatestaticMutexmutex=newMutex();privateProcesspro=newProcess();privateintDesc;privateintconnectcount;//连接次数0表示断开1表示连接privateintdisconnectcount;//断开次数0表示连接1表示断开privateboolstatus;//true:connectedfalse:notconnectedprivatestringconnname;//连接名字privatestringconnusername;//连接帐号用户privatestringconnpwd;//连接密码[DllImport("wininet.dll")]privateexternstaticboolInternetGetConnectedState(outintDescription,intReservedValue);publicstringNetName{set{this.connname=value;}}publicstringUserName{set{this.connusername=value;}}publicstringPwd{set{this.connpwd=value;}}publicintConnectNum{get{returnconnectcount;}}publicintDisConnectNum{get{returndisconnectcount;}}privateboolisconnecting(){status=InternetGetConnectedState(outDesc,0);returnstatus;}privateboolisactive(stringstrProName){Process[]ps=Process.GetProcessesByName(strProName);{if(ps.Length>0)returntrue;elsereturnfalse;}}publicvoidStopConn(){if(isconnecting()){lock(pro){if(!isactive("rasdial")){mutex.WaitOne();//pro.StartInfo.FileName="rundll32.exe";//pro.StartInfo.Arguments="iedkcs32.dllCloseRASConnections";pro.StartInfo.FileName="rasdial.exe";pro.StartInfo.Arguments=this.connname+@"/DISCONNECT";pro.Start();mutex.ReleaseMutex();disconnectcount++;connectcount--;}}pro.Close();}}publicvoidstartconn(){if(!isconnecting()){lock(pro){if(!isactive("rasdial")){mutex.WaitOne();pro.StartInfo.FileName="rasdial.exe";pro.StartInfo.Arguments=this.connname+""+this.connusername+""+this.connpwd;pro.Start();mutex.ReleaseMutex();connectcount++;disconnectcount--;}}pro.Close();}}}}后面就是简单的调用了,就是0.开始先连接网络,然后1.检查是否需要执行该功能(在netconnection中有字段表示)2.是否到达配置的断网时间3.1和2都true,执行断网,否则连接网络在过程中对SQLite里面执行update语句让我检查了好久,首先是DB文件找错了,执行后检查都结果总是不对,后来发现这个问题后执行update还是不对。愁。原来是在一个连接下事务不能嵌套。拨号程式的名字如果带空格就要用双引号引起来执行命令windows服务中若用timer控件是System.Timers下的timer.