为啥我要做这个东西了,是因为经常要用投影演示app ,现在有很多这样的软件可以把手机界面投到电脑上 ,但都要安装,比如说360的手机助手,我又讨厌安装,于是就自己捣鼓了下 做了这个东西,

  实现了以下简单功能

     1、屏幕获取(因为是截图方式获取的,所以有点卡顿)

   2、实现点击功能,并在点击的时候出现一个手势图标,方便用户观看

   3、实现简单的滑动功能

4、实现在界面上画图功能

5、实现拖拽安装apk功能

操作说明:鼠标左边 模拟手机点击,中键停止/开始刷新界面(画图的时候不能刷新),右键去掉画图内容

显示来看下效果图

这个就是主界面了,下面有显示手机型号

其次是在上面画图功能方便讲解

原理就是通过abd来实现的

adb shell input keyevent 26  点击power

这是截屏显示图片的代码

  private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
if (isStop)
{
return;
}
//死循环截屏获取图片
var tempFileName = "1.png";
cmdAdb("shell screencap -p /sdcard/" + tempFileName);
// pictureBox1.ImageLocation = Environment.CurrentDirectory + "\\temp\\" + tempFileName;
cmdAdb("pull /sdcard/" + tempFileName);
if (System.IO.File.Exists(tempFileName))
{
//pictureBox1.BackgroundImage = new Bitmap(tempFileName);
using (var temp = Image.FromFile(tempFileName))
{ pictureBox1.Invoke(new Action(() => {
pictureBox1.Image = new Bitmap(temp);
}));
}
if (multiplierX == )
{
multiplierX = pictureBox1.Image.Width / (pictureBox1.Width + 0.00);
multiplierY = pictureBox1.Image.Height / (pictureBox1.Height + 0.00);
}
GC.Collect();
if (System.IO.File.Exists(tempFileName))
{
try
{
System.IO.File.Delete(tempFileName);
}
catch
{ }
}
Thread.Sleep(); }
}
}

这个是画图点击以及滑动的代码

  private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Right)//鼠标右键 撤销画画
{
this.Refresh();
return;
}
if (e.Button == MouseButtons.Middle)//鼠标中键按下 停止或开始更新图像
{
isStop = !isStop;
if (!isStop && HasAndroid)
{
backgroundWorker1.RunWorkerAsync();
}
return;
}
if (isDraw)
{
isDraw = false;
return;
}
if (pictureBox1.Image == null)
{
return;
}
using (Graphics g = pictureBox1.CreateGraphics())
{
g.DrawImage(ShowAndroidModel.Properties.Resources.shou, e.X - Convert.ToInt32( / multiplierX), e.Y - Convert.ToInt32( / multiplierY), Convert.ToInt32( / multiplierX), Convert.ToInt32( / multiplierY));
g.Dispose();
}
var tapx = multiplierX * e.X;//计算实际坐标
var tapy = multiplierY * e.Y;
cmdAdb(string.Format("shell input tap {0} {1}", tapx.ToString(""), tapy.ToString("")));//点击坐标
} private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
lineStartX = e.X;
lineStartY = e.Y;
StartX = e.X;
StartY = e.Y;
_MouseState = MouseState.MouseLeftDown;
return;
}
} private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
_MouseState = MouseState.None;
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
if (StartX - e.X > || StartX - e.X < - || StartY - e.Y > || StartY - e.Y < -)
{
isDraw = true;
Debug.WriteLine("执行" + isDraw);
cmdAdb(string.Format("shell input swipe {0:0} {1:0} {2:0} {3:0} 100", StartX * multiplierX, StartY * multiplierY, e.X * multiplierX, e.Y * multiplierY));
}
}
} private void pictureBox1_SizeChanged(object sender, EventArgs e)
{
multiplierX = pictureBox1.Image.Width / (pictureBox1.Width + 0.00);
multiplierY = pictureBox1.Image.Height / (pictureBox1.Height + 0.00);
} private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (_MouseState == MouseState.None)
{
return;
}
if (_MouseState == MouseState.MouseLeftDown)
{
isDraw = true;
using (Graphics g = pictureBox1.CreateGraphics())
{
g.DrawLine(new Pen(Color.Red, ), new Point(lineStartX, lineStartY), new Point(e.X, e.Y));
g.Dispose();
} lineStartX = e.X;
lineStartY = e.Y; return;
}
}

检测设备是否存在

  /// <summary>
/// 检测是否存在手机
/// </summary>
private void CheckHasAndroidModel()
{
var text = cmdAdb("shell getprop ro.product.model",false);//获取手机型号
Debug.WriteLine("检查设备:" + text+" T="+DateTime.Now);
if (text.Contains("no devices")||string.IsNullOrWhiteSpace(text))
{
HasAndroid = false;
isStop = true;
toolStripStatusLabel2.Text="未检测到设备";
}
else
{
HasAndroid = true;
isStop = false;
toolStripStatusLabel2.Text = text.Trim();
if (!backgroundWorker1.IsBusy)
{
backgroundWorker1.RunWorkerAsync();
}
}
}

重写WndProc方法监听usb设备插入

  protected override void WndProc(ref Message m)
{
if (m.Msg == 0x219)
{
Debug.WriteLine("WParam:{0} ,LParam:{1},Msg:{2},Result:{3}", m.WParam, m.LParam, m.Msg, m.Result);
if (m.WParam.ToInt32() == )//设备插入或拔出
{
CheckHasAndroidModel();
myTimer.Start();
}
}
try
{
base.WndProc(ref m);
}
catch { }
}

最后附代码  https://files.cnblogs.com/files/dotnet-org-cn/ShowAndroidModel.rar

Winfrom 简单的安卓手机屏幕获取和安卓简单操作的更多相关文章

  1. 安卓手机屏幕录像之scr

    打开SCR Screen Recorder,屏幕会显示录像控制面板,点击“开始”按钮就可以开始录像: - 停止录像的方法有两种.一种是锁屏,锁屏后等待2秒,录像文件会自动保存到SD卡,另外一种是重新打 ...

  2. 如何录制手机屏幕并转成gif

    因为上一篇博客需要展示一些软件操作过程,如果直接截图的话一来可能需要多张图,二来表达也不方便,所以特意去查了下如何录制手机屏幕操作,然后转成gif,嵌入进博客中,这样表达起来就方便多了.话不多说,总结 ...

  3. ZT 安卓手机的安全性 prepare for Q

    如何增强安卓手机的安全性?安卓的安全性太低了!!! 众所周知,安卓手机是非常容易破解的,刷过机的人都知道,不管你之前在手机怎么设置密码,只要进入recovery清空使用记录,手机就会恢复出厂设置,到时 ...

  4. MSF入侵安卓手机

    MSF是Metasploit的简称,Metasploit是一款开源的安全漏洞检测工具,非常强大,分别有Windows版和Linux版,工具里集成了许多微软公布的漏洞(0day). 我这里做测试的系统是 ...

  5. 在电脑上操作手机屏幕scrcpy工具就搞定了

    手机安卓版本:10 电脑:win64 使用步骤 电脑步骤 下载scrcpy scrcpy 是免费开源的投屏软件,支持将安卓手机屏幕投放在 Windows.macOS.GNU/Linux 上,并可直接借 ...

  6. Android安卓手机游戏开发

    成都传智播客Java培训,免费学Android安卓手机游戏开发,安卓android开发课程包括Android安卓应用开发和Android安卓游戏开发两个方向,可是偏向游戏开发. 依据"199 ...

  7. 通过 PC 远程控制 Android 的应用 -- 可以将手机屏幕投射显示到电脑上

    测试结果中的部分测试图:Mobizen手机界面: 电脑界面: 主界面 视频 全屏视频 WebKey手机界面: 电脑界面: AirMore手机界面: 电脑界面:主界面 镜像 全屏镜像 Airdroid手 ...

  8. Unity获取安卓手机运营商,电量,wifi信号强度,本地Toast,获取已安装apk,调用第三方应用,强制自动重启本应用

    一个完整的游戏项目上线需要不断的完善优化,但是到了后期的开发不再仅仅是游戏了,它的复杂度远远大于纯粹的应用开发.首先必须要考虑的就是集成第三方SDK,支付这块渠道商已经帮你我们做好了,只需要按照文档对 ...

  9. 获取手机屏幕DisplayMetrics属性方法

    转自:http://blog.csdn.net/zhangqijie001/article/details/5894872 其他参考:http://blog.sina.com.cn/s/blog_7d ...

随机推荐

  1. Relationship between frequency domain and spatial domain in digital images

    今天又复习了一遍<<Digital Image Processing>>的第四章,为了加深对频域的理解,我自己用PS画了一张图.如下: 然后做FFT,得到频谱图如下: 从左到右 ...

  2. css动画过渡

    css动画过渡css代码: .div03{ width:100px;height:100px;background: rebeccapurple;color: #fff; -webkit-transi ...

  3. Linux学习总结(十)—— Java开发环境搭建:JDK+Maven

    Java开发环境最基础的两个开源软件是JDK和Maven. JDK 到Oracle官网下载相对应的源码包,这里我选择的是:Linux x64系统的jdk-8u131-linux-x64.tar.gz. ...

  4. 浅谈.NET,C#三层架构

     三层架构 常见架构: 三层(经典) MVC MVVM MVP   开发中常见的23种设计模式: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种: ...

  5. HTML5+js页面传值给Java后台的小技巧

    页面传值小技巧 平常我们在做的web项目,一般一个HTML页面上会有好几个步骤,step_num①,step_num②,step_num③,一般先显示step_num①,根据跳转条件显示step_nu ...

  6. SQLite在C#中的安装与操作

    SQLite 介绍 SQLite,是一款轻型的数据库,用于本地的数据储存. 先说说优点,它占用资源非常的低,在嵌入式设备中需要几百K的内存就够了:作为轻量级数据库,他的处理速度也足够快:支持的的容量级 ...

  7. BotVS开发基础—2.1 账户、行情、K线、深度

    代码 import json def main(): Log("账号信息:", exchange.GetAccount()); # Log("K 线数据:", ...

  8. spring mvc:Error scanning entry module-info.class from jar错误

    项目从jdk1.6升级到jdk1.8,启动的时候出现如下错误: java.lang.RuntimeException: Error scanning entry module-info.class f ...

  9. javascript学习笔记-2:jQuery中$("xx")返回值探究

    最近在写一个jQuery插件的时候,需要用到一个条件: 一组img标签,每一个元素都需要被它前面的元素值src替换,如果是第一个(序列为0)则其值为最后一个元素值,如果是最后一个,那么其值为第一个元素 ...

  10. 转载 java基础题(面试必知)

    1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包 ...