Winfrom 簡單的安卓手機屏幕獲取和安卓簡單操作

来源:http://www.cnblogs.com/dotnet-org-cn/archive/2017/09/19/7553468.html
-Advertisement-
Play Games

為啥我要做這個東西了,是因為經常要用投影演示app ,現在有很多這樣的軟體可以把手機界面投到電腦上 ,但都要安裝,比如說360的手機助手,我又討厭安裝,於是就自己搗鼓了下 做了這個東西, 實現了以下簡單功能 1、屏幕獲取(因為是截圖方式獲取的,所以有點卡頓) 2、實現點擊功能,併在點擊的時候出現一個 ...


 

為啥我要做這個東西了,是因為經常要用投影演示app ,現在有很多這樣的軟體可以把手機界面投到電腦上 ,但都要安裝,比如說360的手機助手,我又討厭安裝,於是就自己搗鼓了下 做了這個東西,

  實現了以下簡單功能

     1、屏幕獲取(因為是截圖方式獲取的,所以有點卡頓)

   2、實現點擊功能,併在點擊的時候出現一個手勢圖標,方便用戶觀看

    3、實現簡單的滑動功能

         4、實現在界面上畫圖功能

         5、實現拖拽安裝apk功能

 操作說明:滑鼠左邊 模擬手機點擊,中鍵停止/開始刷新界面(畫圖的時候不能刷新),右鍵去掉畫圖內容

顯示來看下效果圖

   

 

這個就是主界面了,下麵有顯示手機型號

其次是在上面畫圖功能方便講解

原理就是通過abd來實現的

 adb shell input keyevent 26  點擊power

這是截屏顯示圖片的代碼

 1  private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
 2         {
 3             while (true)
 4             {
 5                 if (isStop)
 6                 {
 7                     return;
 8                 }
 9                 //死迴圈截屏獲取圖片
10                 var tempFileName = "1.png";
11                 cmdAdb("shell screencap -p /sdcard/" + tempFileName);
12                // pictureBox1.ImageLocation = Environment.CurrentDirectory + "\\temp\\" + tempFileName;
13                 cmdAdb("pull /sdcard/" + tempFileName);
14                 if (System.IO.File.Exists(tempFileName))
15                 {
16                     //pictureBox1.BackgroundImage = new Bitmap(tempFileName);
17                     using (var temp = Image.FromFile(tempFileName))
18                     {
19                        
20                         pictureBox1.Invoke(new Action(() => {
21                             pictureBox1.Image = new Bitmap(temp);
22                         }));
23                     }
24                     if (multiplierX == 0)
25                     {
26                         multiplierX = pictureBox1.Image.Width / (pictureBox1.Width + 0.00);
27                         multiplierY = pictureBox1.Image.Height / (pictureBox1.Height + 0.00);
28                     }
29                     GC.Collect();
30                     if (System.IO.File.Exists(tempFileName))
31                     {
32                         try
33                         {
34                            System.IO.File.Delete(tempFileName);
35                         }
36                         catch
37                         {
38 
39                         }
40                     }
41                     Thread.Sleep(1000);
42                     
43                 }
44             }
45         }
View Code

這個是畫圖點擊以及滑動的代碼

 1  private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
 2         {
 3             if (e.Button == System.Windows.Forms.MouseButtons.Right)//滑鼠右鍵 撤銷畫畫
 4             {
 5                 this.Refresh();
 6                 return;
 7             }
 8             if (e.Button == MouseButtons.Middle)//滑鼠中鍵按下 停止或開始更新圖像
 9             {
10                 isStop = !isStop;
11                 if (!isStop && HasAndroid)
12                 {
13                     backgroundWorker1.RunWorkerAsync();
14                 }
15                 return;
16             }
17             if (isDraw)
18             {
19                 isDraw = false;
20                 return;
21             }
22             if (pictureBox1.Image == null)
23             {
24                 return;
25             }
26             using (Graphics g = pictureBox1.CreateGraphics())
27             {
28                 g.DrawImage(ShowAndroidModel.Properties.Resources.shou, e.X - Convert.ToInt32(50 / multiplierX), e.Y - Convert.ToInt32(10 / multiplierY), Convert.ToInt32(150 / multiplierX), Convert.ToInt32(150 / multiplierY));
29                 g.Dispose();
30             }
31             var tapx = multiplierX * e.X;//計算實際坐標
32             var tapy = multiplierY * e.Y;
33             cmdAdb(string.Format("shell input tap {0} {1}", tapx.ToString("0"), tapy.ToString("0")));//點擊坐標
34         }
35 
36         private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
37         {
38             if (e.Button == System.Windows.Forms.MouseButtons.Left)
39             {
40                 lineStartX = e.X;
41                 lineStartY = e.Y;
42                 StartX = e.X;
43                 StartY = e.Y;
44                 _MouseState = MouseState.MouseLeftDown;
45                 return;
46             }
47         }
48 
49         private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
50         {
51             _MouseState = MouseState.None;
52             if (e.Button == System.Windows.Forms.MouseButtons.Left)
53             {
54                 if (StartX - e.X > 50 || StartX - e.X < -50 || StartY - e.Y > 50 || StartY - e.Y < -50)
55                 {
56                     isDraw = true;
57                     Debug.WriteLine("執行" + isDraw);
58                     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));
59                 }
60             }
61         }
62 
63         private void pictureBox1_SizeChanged(object sender, EventArgs e)
64         {
65             multiplierX = pictureBox1.Image.Width / (pictureBox1.Width + 0.00);
66             multiplierY = pictureBox1.Image.Height / (pictureBox1.Height + 0.00);
67         }
68 
69         private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
70         {
71             if (_MouseState == MouseState.None)
72             {
73                 return;
74             }
75             if (_MouseState == MouseState.MouseLeftDown)
76             {
77                 isDraw = true;
78                 using (Graphics g = pictureBox1.CreateGraphics())
79                 {
80                     g.DrawLine(new Pen(Color.Red, 2), new Point(lineStartX, lineStartY), new Point(e.X, e.Y));
81                     g.Dispose();
82                 }
83 
84                 lineStartX = e.X;
85                 lineStartY = e.Y;
86 
87                 return;
88             }
89         }
View Code

檢測設備是否存在

 1  /// <summary>
 2         /// 檢測是否存在手機
 3         /// </summary>
 4         private void CheckHasAndroidModel()
 5         {
 6             var text = cmdAdb("shell getprop ro.product.model",false);//獲取手機型號
 7             Debug.WriteLine("檢查設備:" + text+"  T="+DateTime.Now);
 8             if (text.Contains("no devices")||string.IsNullOrWhiteSpace(text))
 9             {
10                 HasAndroid = false;
11                 isStop = true;
12                 toolStripStatusLabel2.Text="未檢測到設備";
13             }
14             else
15             {
16                 HasAndroid = true;
17                 isStop = false;
18                 toolStripStatusLabel2.Text = text.Trim();
19                 if (!backgroundWorker1.IsBusy)
20                 {
21                     backgroundWorker1.RunWorkerAsync();
22                 }
23             }
24         }

 

重寫WndProc方法監聽usb設備插入

 1  protected override void WndProc(ref Message m)
 2         {
 3             if (m.Msg == 0x219)
 4             {
 5                 Debug.WriteLine("WParam:{0} ,LParam:{1},Msg:{2},Result:{3}", m.WParam, m.LParam, m.Msg, m.Result);
 6                 if (m.WParam.ToInt32() == 7)//設備插入或拔出
 7                 {
 8                     CheckHasAndroidModel();
 9                     myTimer.Start();
10                 }
11             }
12             try
13             {
14                 base.WndProc(ref m);
15             }
16             catch { }
17         }
View Code

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、簡介 crontab用於設置周期性被執行的命令 Linux系統中Linux調動工作分為兩大類: 1、系統執行的工作:系統周期性所要執行的工作,如備份系統數據、清理緩存 2、個人執行的工作:某個用戶定期要做的工作,例如每隔10分鐘檢查郵件伺服器是否有新信,這些工作可由每個用戶自行設置 /etc/c ...
  • 第1章 linux啟動過程 1、開機自檢bios 2、mbr引導 3、GRUB 菜單:選擇不同的內核 4、載入內核 5、運行init進程 6、讀取/etc/inittab運行級別配置文件 7、執行 /etc/rc.d/rc.sysinit 腳本 (系統的初始化腳本)配置主機名,IP地址 8、執行 / ...
  • 本次博客介紹了linux操作系統中常用的網路管理工具和相關配置文件。 ...
  • shell腳本中的迴圈選擇語句用法詳解及實例。包括if、case、for、while、until、select、continue、break、shift、trap等。 ...
  • 什麼是動態鏈接庫?Windows下重要的幾個動態鏈接庫;DLL的使用優點; ...
  • 關於Linux Centos6.5的SSH預設埠修改的博客有一大堆,我在這裡就不啰嗦了,但是面對Centos 6.9,就會發現有一個巨坑; 修改iptables之後執行下麵的命令後; 會發現dport 修改失敗,埠號仍為22, 此時,你會很鬱悶的發現無論怎麼修改都不生效, 重點來了,我嘗試了無數 ...
  • 一、FastSocket課程介紹 .NET框架雖然微軟提供了socket通信的類庫,但是還有很多事情要自己處理,比如TCP協議需要處理分包、組包、粘包、維護連接列表等,UDP協議需要處理丟包、亂序,而且對於多連接併發,還要自己處理多線程等等。本期分享課程阿笨給大家帶來的是來源於github開源Soc ...
  • 介紹 一款優雅的博客園Android客戶端,Xamarin App,Material Design風格。如有意見反饋或bug提交,請加QQ群(181050206)交流. 項目地址 Github: "Cnblogs" 歡迎Fork,歡迎Star。 支持功能 登錄博客園 查看已發佈的博客 查看博文,新聞 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...