`C#通过ADB给手机发送命令
// ----------------------------------------- Adb.exe path, leave blank if in same directory as app or included in PATH
private string adbPath = "adb";
public string AdbPath
{
get { return adbPath; }
set
{
if (File.Exists(value)) adbPath = value;
else adbPath = "\"" + adbPath + "\"";
}
}
// ----------------------------------------- Adb command timeout - usable in push and pull to avoid hanging while executing
private int adbTimeout;//默认执行每一次操作至少5秒才会返回Output结果,也就意味着5秒之后才可以进行新的adb命令
public int AdbTimeout//初始时赋值及时5000=5秒//为0时返回5000
{
get { return adbTimeout > 0 ? adbTimeout : 5000; }
set { adbTimeout = value; }
}
//↓↓↓↓↓↓↓↓↓↓↓↓↓核心就是完成一个 带有等待过程的 SendCommand异步方法,最终返回更新的Output↓↓↓↓↓↓↓↓
// ----------------------------------------- Create our emulated shell here and assign events
// Create a background thread an assign work event to our emulated shell method
//(这句话没用,后面根本不是用它)private Process Shell;//在程序开发中,一个程序经常需要去调用其他的程序,C#中Process类正好提供了这样的功能。它提供对本地和远程进程的访问并使您能够启动和停止本地系统进程
// Needed data types for our emulated shell
string Command = "";
bool Complete = false;
//①声明一个BackgroundWorker
BackgroundWorker CMD;//❤❤何甜加= new BackgroundWorker();//也是一个可视控件,势必thread简单的多的后台线程
// Send a command to emulated shell
public void SendCommand(string command)
{
//②初始化BackgroundWorker,设置属性(并提前在构造函数里绑定事件)
CMD= new BackgroundWorker();//❤❤何甜加
CMD.WorkerSupportsCancellation = true;//该线程支持异步取消
Command = command;
//③ SendCommand()调用时触发事件,异步执行CMD_Send方法→即将方法绑定给 发生在SendCommand处的 CMD.RunWorkerAsync()事件
CMD.DoWork += new DoWorkEventHandler(CMD_Send);//❤❤何甜加
CMD.RunWorkerAsync();//开始执行后台操作(无形中触发CMD.DoWork事件)
//补课:
//DoWork 调用 RunWorkerAsync 时发生
//ProgressChanged 调用 ReportProgress 时发生(用显示进度条,这里没用)
while (!Complete) Sleep(500);//可以加自定代码//一直等到CMD_Send()里把Complete为true,才表进程完毕或者失败
Complete = false;//重置标志位
}
//④定义被绑定的方法// Create an emulated shell for executing commands
private void CMD_Send(object sender, DoWorkEventArgs e)
{
ProcessStartInfo startInfo = new ProcessStartInfo()
{
WindowStyle = ProcessWindowStyle.Normal,//(何甜想看看)//ProcessWindowStyle.Hidden,
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardOutput = true,
FileName = "cmd.exe",
Arguments = "/C \"" + Command + "\""
};
using (Process process = Process.Start(startInfo))//下方{}内运行完,此cmd外部exe自动释放清空
{ //using在这里的用处(以前网上学过,和垃圾回收机制有关)
//定义一个范围,在范围结束时处理对象。
//场景:
//当在某个代码段中使用了类的实例,而希望无论因为什么原因,只要离开了这个代码段就自动调用这个类实例的Dispose。
//要达到这样的目的,用try...catch来捕捉异常也是可以的,但用using也很方便。
if (Command.StartsWith("\"" + adbPath + "\" logcat"))//若需要执行的Command命令行 是 写日志
{
Complete = true;
process.WaitForExit();//等待关联进程退出(无限长24天直到退出:罕见)--自信不会卡死
return;
}
if (!process.WaitForExit(AdbTimeout))//如果没有顺利结束的话(罕见情况)backgroundworker线程就会在这里会一直等==阻塞5秒,然后才下一句//等待关联进程退出的时间(以毫秒为单位)如果关联进程已退出,则为 true;否则为 false
process.Kill();//(罕见)
Output = process.StandardOutput.ReadToEnd();//cmd返回的结果放在Output里保存着呢
Complete = true;//无论成功失败,改变flag标志:Complete
};
}
// Sleep until output
public void Sleep(int milliseconds)
{
DateTime delayTime = DateTime.Now.AddMilliseconds(milliseconds);
while (DateTime.Now < delayTime)
{
;//可以填待做的事情Application.DoEvents();
}
}
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑