第一次提问,说的不清楚望见谅
最好能有个实例,获取登录时间方注册表中,时间结束判断就行,利用计时器只能让用户登录一星期不现实,最好将时间方注册表中
目前系统需要做到的是:例如发现网卡ID与数据库中网卡ID不同时,计时器启动,一星期后结束,系统退出,该用户无法登录。
用net/WPF实现了简单的,其他语言类似
//定时器 private System.Windows.Threading.DispatcherTimer _timer; //限制的日期 private DateTime _limiteDt; //当前当前时间超过限制日期时候给出的报警处理类 private void ShowWarnMessage() { //弹出提示消息 //其他的操作 } //初始化定时器 private void InitializeTimer() { this._timer = new System.Windows.Threading.DispatcherTimer(); this._timer.Interval = TimeSpan.FromMilliseconds(1000); //1s this._timer.Tick += _timer_Tick; } //每一秒后定时器处理的事件 void _timer_Tick(object sender, EventArgs e) { //关键处理,如果当前的时间超过了限制的时间,那么直接弹出警告 if(DateTime.Now >= this._limiteDt ) { ShowWarnMessage(); this.stop(); return ; } System.Diagnostics.Debug.WriteLine("---"); } private void start() { this._limiteDt = DateTime.Now.Add(TimeSpan.FromSeconds(10)); this._timer.Start(); } private void stop() { if (this._timer.IsEnabled) { this._timer.Stop(); } } //用于比较两个ID是否一样,不一样就启动定时器 private void doHandle(string user_input_phid, string local_phid) { if (user_input_phid != local_phid) { start(); } }
我是菜鸟,没怎么看懂
目前做的是用winfrom窗体做的,登录后判断
//登录
private void button1_Click(object sender, EventArgs e)
{
denglu(textBox1.Text,textBox2.Text);
//获取系统网卡id
string NetworkID1="";
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc2 = mc.GetInstances();
//ManagementBaseObject inPar = null;
foreach (ManagementObject mo in moc2)
{
if ((bool)mo["IPEnabled"] == true)
NetworkID1 = mo["MacAddress"].ToString();
mo.Dispose();
}
//获取数据网卡id
string sql = "select NetworkID from Network where id=1";
SqlConnection conn = new SqlConnection(strcon);
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
SqlParameter pm = new SqlParameter();
pm = new SqlParameter("@a",NetworkID1);
cmd.Parameters.Add(pm);
object obj = cmd.ExecuteScalar();
conn.Close();
MessageBox.Show("网卡id"+NetworkID1);
MessageBox.Show("数据库网卡id"+obj);
if (obj==NetworkID1)
{
MessageBox.Show("匹配");
}
else
{
MessageBox.Show("不匹配");
//关键点多线程定时器
}
}
线程没学好,计时器这个地方是用多线程的应该,同时执行用户操作,及计时器运行,互不影响
描述的不是很专业
最好的方法不用计时器(用户中途退出问题),将登录后时间放到注册表中,最后快到时间的时候判断一下就行了,
数据能插入到注册表中,问题是时间改如何存放
public static PageVisibility OpenAfterStart()
{
Microsoft.Win32.RegistryKey registryKey;
PageVisibility visibility = PageVisibility.Visible;
// HKCU\Software\RegeditStorage
registryKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\RegistryStorage");
if (registryKey != null)
{
visibility = (string)registryKey.GetValue("PageVisibility") == PageVisibility.Hide.ToString() ?
PageVisibility.Hide : PageVisibility.Visible;
registryKey.Close();
}
return visibility;
}
public static void SaveBeforeExit(PageVisibility visibility)
{
Microsoft.Win32.RegistryKey registryKey;
// HKCU\Software\RegeditStorage
registryKey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\RegistryStorage");
registryKey.SetValue("PageVisibility", visibility.ToString());
registryKey.Close();
}
}
public enum PageVisibility
{
Visible,
Hide
}
@Mask-male:
不清楚你是不是有特殊的需求,一般你能操作注册表了,那么直接将时间转为字符串存储到注册表就可以了,需要的时候再读取转换为dateTime或者其他类型就可以了。
关于定时器问题? 如果你当心定时器会影响到程序,可以考虑将监测这部分转移到window服务来做或者使用类似quartz这样的第三方库来做,至于只用线程来做的话,其实你还是要定时判断的。
@visonme: 差不多就是这样子吧,我再看看写入和读取注册表就差不多了