2015年6月2日 星期二

[Microsoft Visual Basic 2013 Express]執行Cmd指令

開發環境:Microsoft Visual Basic 2013 Express
原理  :用Cmd來做到從外部執行指令並取得傳回值


Public Function Cmd(ByVal Command As String) As String
      Dim process As New System.Diagnostics.Process()
      process.StartInfo.FileName = "cmd.exe"
      process.StartInfo.UseShellExecute = False
      process.StartInfo.RedirectStandardInput = True
      process.StartInfo.RedirectStandardOutput = True
      process.StartInfo.RedirectStandardError = True
      process.StartInfo.CreateNoWindow = True
      process.Start()
      process.StandardInput.WriteLine(Command)
      process.StandardInput.WriteLine("exit")
      Dim Result As String = process.StandardOutput.ReadToEnd()
      process.Close()
      Return Result
End Function
 
現在,我要用程式找IP:
Dim result As String
result = Cmd(“ipconfig")
Debug.Print(result)
這樣會印出所有Cmd上面的內容。

[Microsoft Visual Basic 2010 Express]背景音樂

開發環境:Microsoft Visual Basic 2010 Express
原理  :利用Windows Media Player的dll檔(wmp.dll),讓在VB2010可以使Windows
                    Media Player的功能。


Imports WMPLib

Public Class Form1

    Public wmp As New WindowsMediaPlayer

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        wmp.URL = System.Windows.Forms.Application.StartupPath & "\Angel Beats!PV6使用曲 ロック風アレンジ Reloaded.mp3"

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        wmp.close()

    End Sub

End Class



windows media player 控件的常用屬性及方法
屬性/方法 說明
URL:String; 
指定媒體位置,本機或網絡地址
uiMode:String; 
播放器界面模式,可為Full, Mini, None, Invisible
playState:integer; 
播放狀態,1=停止,2=暫停,3=播放,6=正在緩衝,9=正在連接,10= 準備就緒
enableContextMenu:Boolean; 
啟用/禁用右鍵菜單
fullScreen:boolean; 
是否全屏顯示
[Ctlcontrols] wmp.controls 
播放器基本控製
Ctlcontrols.play; 
播放
Ctlcontrols.pause; 
暫停
Ctlcontrols.stop; 
停止
Ctlcontrols.currentPosition:double; 
當前進度
Ctlcontrols.currentPositionString:string; 
當前進度,字符串格式。如“00:23”
Ctlcontrols.fastForward; 
快進
Ctlcontrols.fastReverse; 
快退
Ctlcontrols.next; 
下一曲
Ctlcontrols.previous; 
上一曲
[settings] wmp.settings 
播放器基本設置
settings.volume:integer; 
音量,0-100
settings.autoStart:Boolean; 
是否自動播放
settings.mute:Boolean; 
是否靜音
settings.playCount:integer; 
播放次數
[currentMedia] wmp.currentMedia 
當前媒體屬性
currentMedia.duration:double; 
媒體總長度
currentMedia.durationString:string; 
媒體總長度,字符串格式。如“03:24”
currentMedia.getItemInfo(const string);
取當前媒體信息"Title"=媒體標題,"Author"=藝術家,"Copyright"=版權信息,"Description"= 媒體內容描述,"Duration"=持續時間(秒),"FileSize"=文件大小,"FileType"=文件類型,"sourceURL"=原始 地址
currentMedia.setItemInfo(const string); 
通過屬性名設置媒體信息
currentMedia.name:string; 
同 currentMedia.getItemInfo("Title")
[currentPlaylist] wmp.currentPlaylist //
當前播放列表屬性
currentPlaylist.count:integer; 
當前播放列表所包含媒體數
currentPlaylist.Item[integer]; 
獲取或設置指定項目媒體信息,其子屬性同wmp.currentMedia再使用currentMedia.duration

特別要注意 Player 需要Ctlcontrols.play()
才能取值
特別注意的是player可能檔案載入或是串流載入
可能未準備好而造成取得的值是0
我的解決方式是透過timer在一定時間(interval=3000)後再取值

[Microsoft Visual Basic 2010 Express]發送郵件

開發環境:Microsoft Visual Basic 2010 Express
原        理:利用Google,達到發送郵件的目的


Imports System.Net.Mail

Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        Dim messase As String

        messase = TextBox1.Text

        messase = messase.Replace(vbCrLf, "<br>")

        Dim mailmsg As New System.Net.Mail.MailMessage()

        mailmsg.From = New MailAddress("") '寄件人的信箱@gmail.com

        mailmsg.To.Add("") '收件人的信箱@gmail.com

        mailmsg.Subject = "" '信主旨

        mailmsg.IsBodyHtml = True

        mailmsg.Body = messase '信件內容

        mailmsg.Priority = MailPriority.Normal

        Dim client As New System.Net.Mail.SmtpClient()



        client.UseDefaultCredentials = False

        client.Credentials = New System.Net.NetworkCredential("", "") '寄件人的信箱@gmail.com '寄件人的信箱密碼

        client.Port = "587" '587,25(smtp port)

        client.Host = "smtp.gmail.com" '需知道smtp位置

        client.EnableSsl = True '是否SSL加密

        Dim userstate As Object = mailmsg

        client.Send(mailmsg)

    End Sub

End Class

[Microsoft Visual Basic 2010 Express]登入網頁

開發環境:Microsoft Visual Basic 2010 Express
原        理:利用查詢HTML處理元件,達到登入網頁的目的


Public Class Form1

    Public Sub loading() '等待網頁讀取完成
        Do Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete
            Application.DoEvents()
        Loop
    End Sub

    Public Sub insertText(ByRef element As String, ByRef str As String, ByRef result As String) '輸入欄位
        Try
            WebBrowser1.Document.Body.All(element).InnerText = str
        Catch
            MsgBox(result)
        End Try
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        WebBrowser1.Navigate("http://tw.yahoo.com/")
        loading()

        '輸入帳號
        insertText(TextBox1.Text, TextBox3.Text, "")
        '輸入密碼
        insertText(TextBox2.Text, TextBox5.Text, "")
        Try
            WebBrowser1.Document.GetElementById(TextBox4.Text).DomElement.click()
        Catch
            MsgBox("Error:找不到登入按鈕")
            MsgBox("您已經登入")
            Exit Sub
        End Try

    End Sub
End Class

[Microsoft Visual Basic 2010 Express]關閉程式

開發環境:Microsoft Visual Basic 2010 Express
原        理:利用查詢處理程序名稱,只要是同名稱的都關閉,達到關閉程式的目的


 Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        Dim myArray() As String = {"chrome", "firefox"} '列舉要刪除的程式名稱
        Dim pProcess() As Process = Process.GetProcesses() '取得目前所有程式
        Dim i As Integer, j As Integer

        For i = 0 To pProcess.Length - 1
            For j = 0 To myArray.Length - 1
                If InStr(pProcess(i).ProcessName.ToUpper, myArray(j).ToString.ToUpper) Then
                    pProcess(i).Kill() '刪除相關程式
                End If
            Next
        Next

    End Sub
End Class

[Microsoft Visual Basic 2010 Express]物件縮放

開發環境:Microsoft Visual Basic 2010 Express
原        理:利用比例關係進行物件的大小縮放,以免放大到全螢幕時物件會有比例不合
     問題


Public Class Form1

    Private Sub Form1_Activated(sender As Object, e As System.EventArgs) Handles Me.Activated

        Dim oldH As Double = Me.Height
        Dim oldW As Double = Me.Width

        Me.WindowState = FormWindowState.Maximized

        Dim divH As Double
        Dim divW As Double
        Dim divF As Double

        Dim fs As FontStyle
        Dim fm As FontFamily
        Dim f As Font
        Dim fsize As Single

        divH = Me.Height / oldH
        divW = Me.Width / oldW

        If divH > divW Then
            divF = divW
        Else
            divF = divH
        End If

        For Each myObj In Me.Controls

            ' *=意思 myObj.Height = myObj.Height * divH

            myObj.Height *= divH
            myObj.Width *= divW
            myObj.Top *= divH
            myObj.Left *= divW

            fs = myObj.Font.Style
            fm = myObj.Font.FontFamily
            fsize = myObj.Font.Size * divF
            f = New Font(fm, fsize, fs)
            myObj.font = f

        Next

    End Sub

End Class

[Microsoft Visual Basic 2010 Express]全域熱鍵

開發環境:Microsoft Visual Basic 2010 Express
原        理:利用API ( user32.dll ) 來HOOK住按鍵再經由按鍵取代來執行程式碼


Public Class Form1

    Public Declare Auto Function RegisterHotKey Lib "user32.dll" Alias "RegisterHotKey" (ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Boolean
    Public Declare Auto Function UnRegisterHotKey Lib "user32.dll" Alias "UnregisterHotKey" (ByVal hwnd As IntPtr, ByVal id As Integer) As Boolean

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        RegisterHotKey(Handle, 1, 3, Keys.A)
        RegisterHotKey(Handle, 0, 3, Keys.B)

        ' 0 = nothing
        ' 1 = alt
        ' 2 = ctrl
        ' 3 = ctrl + alt
        ' 4 = shift
        ' 5 = alt + shift
        ' 6 = ctrl + shift
        ' 7 = ctrl + shift + alt

    End Sub

    Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed

        UnRegisterHotKey(Handle, 1)
        UnRegisterHotKey(Handle, 0)

    End Sub

    Protected Overrides Sub WndProc(ByRef m As Message)

        If m.Msg = 786 Then

            If m.WParam.ToInt32 = 1 Then
                MsgBox("Ctrl + Alt + A")
            ElseIf m.WParam.ToInt32 = 0 Then
                MsgBox("Ctrl + Alt + B")
            End If

        End If

        MyBase.WndProc(m)

    End Sub

End Class