分类 代码 下的文章
客户端离线鉴权
设计的一个项目需要客户端离线使用的同时控制使用时间,如果获取本地时间判断容易被欺骗,用带时钟的加密狗无法提前结束或者追加时长,就想到了以下方法
1、提前在程序中保存:ID、本机密码、验证码接口,其中本机密码是不可让用户知道的。
2、程序运行时随机生成一串数字,将ID与随机数拼接在接口后作为GET参数提交,生成二维码显示。
3、用户扫码打开网页,服务器根据ID判断用户身份,获取对应密码,然后按 md5(ID + 9位数 + 密码)来计算MD5,取前四位显示。
4、用户输入软件,软件按相同方式计算MD5取前四位比对判断是否正确。
C#监听回车键
编写了一个登录框,需要在用户按回车时进行提交,可以为输入框添加KeyUp事件函数,然后在函数内写
if (e.KeyCode == Keys.Control || e.KeyCode == Keys.Enter)
{
//要执行的代码
}
测试发现如果使用了MessageBox.Show()
,在弹出窗口上按回车确认也会再次触发这个事件,我的解决方法是弹窗前先清空输入框内容,然后在事件函数执行时判断一下输入框是否为空
if (this.InputBox.Text.Count() != 0)
{
if (e.KeyCode == Keys.Control || e.KeyCode == Keys.Enter)
{
//要执行的代码
this.InputBox.Text = String.Empty;
}
}
C#计算字符串MD5
String inputString = "要处理的字符串";
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] data = System.Text.Encoding.UTF8.GetBytes(inputString);
byte[] md5Data = md5.ComputeHash(data, 0, data.Length);
md5.Clear();
String resule= String.Empty;
for (int i = 0; i < md5Data.Length; i++)
{
resule += System.Convert.ToString(md5Data[i], 16).PadLeft(2, '0');
}
resule= resule.PadLeft(32, '0');
MessageBox.Show(resule);
C#获取执行目录
//获取执行目录
String startPath = System.Windows.Forms.Application.StartupPath;
//获取执行盘符
String startDisk = System.Windows.Forms.Application.StartupPath.Substring(0, 1);
C#创建子进程与执行cmd命令
创建一个7-Zip进程解压文件:
System.Diagnostics.Process unZipProcess = new System.Diagnostics.Process();
unZipProcess.StartInfo.FileName = @"C:\7zG.exe"; //执行文件
unZipProcess.StartInfo.Arguments = " x \"压缩文件\" -o\"输出路径\" -aoa"; //执行参数
unZipProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; //表示隐藏窗口
unZipProcess.Start(); //开始执行
unZipProcess.WaitForExit(); //等待进程结束
//unZipProcess.WaitForExit(1000); //等待进程结束,设置等待时间最多为1000毫秒
//unZipProcess.Kill(); //强制结束进程
unZipProcess.Close(); //释放资源
执行CMD命令类似,多了几项设置,释义忘了,可以用VS鼠标悬停看说明
System.Diagnostics.Process cmdProcess = new System.Diagnostics.Process();
cmdProcess.StartInfo.FileName = "cmd.exe";
cmdProcess.StartInfo.UseShellExecute = false;
cmdProcess.StartInfo.RedirectStandardInput = true;
cmdProcess.StartInfo.RedirectStandardOutput = true;
cmdProcess.StartInfo.RedirectStandardError = true;
//隐藏窗口执行
cmdProcess.StartInfo.CreateNoWindow = true;
cmdProcess.Start();
//执行命令,在命令后面带上exit可以让cmd执行完成后退出,否则执行`WaitForExit()`且不指定超时时间会假死
cmdProcess.StandardInput.WriteLine("ping 127.0.0.1&exit");
//可以多次调用此方法来执行多条命令,执行完所有命令后再执行exit
//但要注意每次提交完命令要等待一定时间再执行下一个,否则会失败
//cmdProcess.StandardInput.WriteLine("ipconfig /release");
//System.Threading.Thread.Sleep(500);
//cmdProcess.StandardInput.WriteLine("ipconfig /renew");
//System.Threading.Thread.Sleep(500);
//cmdProcess.StandardInput.WriteLine("exit");
cmdProcess.StandardInput.AutoFlush = true;
//获取返回值
String OutputData = cmdProcess.StandardOutput.ReadToEnd();
//等待进程退出,可以指定超时时间
cmdProcess.WaitForExit();
//关闭
cmdProcess.Close();
C#截取字符串
String stringObject = "Hello";
stringObject.Substring(0, 1);
// 截取字符串第一位
stringObject.Substring(StringObject.Lenght - 1, 1);
// 截取字符串最后一位
C#等待延迟函数
使用的时候发现个问题,将此写在单击事件函数中,连续点击触发双击事件函数后,原单击事件函数被打断了。
System.Threading.Thread.Sleep(2000);
//等待2000毫秒
C# WinForm在窗口中添加组件
namespace TestApplication
{
public partial class Form1 : Form
{
public Form1()
{
//默认生成的代码
InitializeComponent();
//实例化一个Panel控件
Panel panel1 = new Panel();
//添加至当前窗口下
this.Controls.Add(panel1);
//若有一个name为Window的组件,需要添加在此组件下,直接使用name作为对象即可
//Window.Controls.Add(panel1);
panel1.Size = new Size(50, 100); //设置控件大小
panel1.Location = new Point(10, 10); //设置控件位置
panel1.BackColor = Color.Blue; //设置控件背景颜色
//添加自定义组件,若将组件name设置为FilePanel
FilePanel filePanel1 = new FilePanel(); //实例化一个FilePanel组件
this.Controls.Add(filePanel1); //添加至当前窗口下
}
}
}
C#弹窗询问是否
DialogResult alert = MessageBox.Show("内容", "标题", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation);
if (alert == DialogResult.OK){
//true
}else{
//false
}