【VB.NET】桌面應用程式開發,新人繞坑指南+遊戲外掛指令碼速成

月之領主LM發表於2017-07-25

表示SegmentFault貌似都是些前後端的人在玩,額,果斷來寫點不一樣的東西好了。
GitHub引用地址:https://github.com/MoonLord-L...
100%原創整理,求Star,求類似函式庫或程式碼分享,求BUG……

[繞坑教程,一些奇技淫巧]

  1. 在Visual Studio中顯示行號:工具,選項,文字編輯器,所有語言,顯示行號

  2. VB.NET中,陣列與ArrayList互相轉換:(New ArrayList(New String() {})).ToArray(String.Empty.GetType())

  3. VB.NET中,陣列元素個數的宣告與其它語言不同,Dim Array(2) As String : MsgBox(Array.Length),輸出3

  4. VB.NET中,雙引號使用兩個雙引號來轉義替代,如""""表示1個雙引號的字串,字串用&符號來連線

  5. VB.NET中,想要在“除錯”狀態下,程式也能正常捕獲UI異常,需要:專案,屬性,應用程式,取消“啟用應用程式框架”,將“啟動物件”設定為自定義的Main函式(參考本函式庫中的Program.vb檔案)

  6. 從 .NET Framework 2.0 版開始,將無法通過 try-catch 塊捕獲 StackOverflowException 物件,並且預設情況下將立即終止相應的程式,而 OutOfMemoryException 則可以捕獲並處理

  7. System.Drawing.Imaging.ImageFormat的圖片儲存質量及檔案大小降序排列,實測結果:

    Bmp(最大)> Tiff > Exif/ Icon /MemoryBmp > Png/ Emf /Wmf(預設) > Gif > Jpeg(最小)  
  8. VB.NET中,SendKeys函式不能模擬傳送PrintScreen鍵(全屏截圖),必須使用底層的keybd_event函式實現才可以:

    My.Computer.Keyboard.SendKeys(Keys.PrintScreen) '內建函式,無效  
    System.Windows.Forms.SendKeys.Send(Keys.PrintScreen) '內建函式,無效  
    My.Keyboard.Click(Keys.PrintScreen) '本函式庫,有效  
  9. 在Windows中,底層的keybd_event函式,也不能傳送某些(跳轉到當前使用者的介面之外的)特殊組合鍵:

    My.Keyboard.Click(Keys.LWin, Keys.D) 'Win+D 顯示桌面,有效  
    My.Keyboard.Click(Keys.LWin, Keys.L) 'Win+L 鎖定電腦,無效  
    My.Keyboard.Click(Keys.ControlKey, Keys.ShiftKey, Keys.Escape) 'Ctrl+Shift+Esc 開啟工作管理員,有效  
    My.Keyboard.Click(Keys.ControlKey, Keys.Menu, Keys.Delete) 'Ctrl+Alt+Delete 跳轉系統介面,無效  
  10. 無法模擬“Win+L”的問題,本函式庫提供了一個替代方案,呼叫“user32.dll”中的“LockWorkStation”:

    My.Power.Lock() '鎖定電腦,有效  
  11. VB.NET中,需要將函式指標作為引數傳遞時,可以用“Delegate Function”定義一個函式型別,然後用“AddressOf”獲得函式的指標

  12. VB.NET中,呼叫.dll檔案時,Alias後的函式名才是.dll中真正起作用的函式的名稱,Alias不存在時,才會尋找同名函式

  13. VB.NET中,頻繁修改窗體內容(如修改背景圖片),會導致記憶體洩露和卡頓閃爍的問題,解決方案:

    If Not BackgroundImage Is Nothing Then BackgroundImage.Dispose() '在修改背景圖片之前,銷燬舊的背景圖片  
    System.GC.Collect() '在適當的時機和程式碼位置,強制進行即時垃圾回收(會增加 CPU 負荷)  
    SetStyle(ControlStyles.OptimizedDoubleBuffer, True) '先在緩衝區中繪製,然後再繪製到螢幕上,以減少閃爍  
    SetStyle(ControlStyles.AllPaintingInWmPaint, True) '忽略擦除背景的視窗訊息,不擦除之前的背景,以減少閃爍  
  14. VB.NET中,使用“SyncLock Me”和“End SyncLock”程式碼塊,來實現類似其它語言中的“synchronized(this)”同步鎖

  15. VB.NET中,使用“Nothing”、“New IntPtr(0)”,來實現類似其它語言中的“null”空指標

  16. VB.NET中,使用“&HFFFFFFFFUI”的形式,尾綴UI,來表示16進位制的無符號整數,即UInt32.MaxValue

  17. VB.NET中,使用“AndAlso”、“OrElse”,來實現類似其它語言中的“&&”、“||”邏輯判斷短路

[指令碼速成,直接上程式碼]

'建立快捷方式

My.IO.WriteLinkFile("MyVisualBasic.exe", "快捷方式名稱.lnk", "引數", "描述")  

'將字串轉換為類似01010101的二進位制形式的字串,並寫入到txt檔案中

My.IO.WriteString(My.Security.Binary_Encode("字串"), "binary.txt")  

'獲取當前目錄下所有的檔案列表,並儲存到txt檔案中

My.IO.WriteStringArray(My.IO.ListFile(), "list.txt")  

'獲取網頁原始碼,並分離出其中所有的href屬性值,返回字串陣列

My.StringProcessing.FindAll(My.Http.GetString("http://www.baidu.com"), "href=""", """")  

'開啟和關閉記事本程式,在cmd視窗同步阻塞

My.Task.RunAsync("notepad") : My.Task.Run("cmd") : My.Task.KillAsync("notepad")  

'將完整的螢幕截圖儲存為png檔案,並將60%比例的螢幕縮圖儲存為jpg檔案

My.Screen.Image().Save("10.png") : My.Screen.ImageThumbnail(0.6).Save("6.jpg", Imaging.ImageFormat.Jpeg)  

'模擬鍵盤敲擊,傳送組合鍵:切換輸入法Ctrl+Shift,關閉當前視窗Alt+F4,QQ螢幕截圖Ctrl+Alt+A

My.Keyboard.Click(Keys.ControlKey, Keys.ShiftKey)  
My.Keyboard.Click(Keys.Menu, Keys.F4)  
My.Keyboard.Click(Keys.ControlKey, Keys.Menu, Keys.A)  

'模擬鍵盤敲擊,輸入一段字串,輸入每個字元的時間間隔為50毫秒

My.Keyboard.Input("1!2@3#4$5%6^7&8*9(0)-_=+Aa", 50)  

'模擬連續複製貼上字元,輸入一段字串,輸入每個字元的時間間隔為100毫秒

My.Keyboard.PasteDelay("這是一段中文字元。", 100)  

'模擬使用者操作,開啟“畫圖”程式,貼上螢幕截圖,並將檔案儲存到桌面,關閉“畫圖”程式

Dim Screenshot As Bitmap = My.Screen.Image()  
Dim SavePath As String = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)  
My.Task.RunAsync("mspaint.exe")  
My.Time.Wait(500)  
My.Keyboard.Paste(Screenshot)  
My.Keyboard.Click(Keys.ControlKey, Keys.S)  
My.Time.Wait(500)  
My.Keyboard.Paste(SavePath & "\截圖" & My.Time.Stamp() & ".png")  
My.Keyboard.Click(Keys.Enter)  
My.Time.Wait(500)  
My.Task.KillAsync("mspaint.exe")  

'模擬使用者操作,移動滑鼠到桌面右下角(顯示桌面),單擊2下,並將滑鼠移回初始位置

Dim Position As Point = My.Mouse.Position()  
My.Mouse.MoveToPercent(1, 1)  
My.Mouse.LeftClick()  
My.Time.Wait(1000)  
My.Mouse.LeftClick()  
My.Mouse.MoveToPosition(Position)  

'模擬使用者操作,開啟“計算器”程式,在窗體無焦點的情況下,輸入“1+2/3-4*5=”,儲存結果截圖

Dim SavePath As String = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)  
My.Task.RunAsync("calc.exe")  
My.Time.Wait(1000)  
My.Window.SetFocus(Me.Handle)  
Dim Calc As IntPtr = My.Window.FindByTitle("計算器")  
My.Window.SendKey(Calc, Keys.D1)  
My.Time.Wait(100)  
My.Window.SendKey(Calc, Keys.Add)  
My.Time.Wait(100)  
My.Window.SendKey(Calc, Keys.D2)  
My.Time.Wait(100)  
My.Window.SendKey(Calc, Keys.Divide)  
My.Time.Wait(100)  
My.Window.SendKey(Calc, Keys.D3)  
My.Time.Wait(100)  
My.Window.SendKey(Calc, Keys.Subtract)  
My.Time.Wait(100)  
My.Window.SendKey(Calc, Keys.D4)  
My.Time.Wait(100)  
My.Window.SendKey(Calc, Keys.Multiply)  
My.Time.Wait(100)  
My.Window.SendKey(Calc, Keys.D5)  
My.Time.Wait(100)  
My.Window.SendKey(Calc, Keys.Oemplus)  
My.Time.Wait(100)  
My.Window.Image(Calc).Save(SavePath & "\計算結果" & My.Time.Stamp() & ".png")  
My.Task.KillAsync("calc.exe")  

[求波關注]

GitHub地址:https://github.com/MoonLord-L...
採用標準的文件註釋,持續更新,歡迎拿去隨便用。

函式庫程式碼結構:
函式庫程式碼結構

滑鼠控制原始碼示例:
滑鼠控制程式碼示例

視窗控制註釋效果:
視窗控制程式碼示例

鍵盤控制註釋效果:
鍵盤控制程式碼示例

相關文章