發表文章

目前顯示的是有「Visual Basic」標籤的文章

在Win7/Win8下傳送UDP廣播封包

在撰寫UDP的應用軟體時,有時候會遇到需要發送廣播封包的需求,而這種情況下,就會選擇使用UDP的方式來傳送,而最簡單的方式就是使用UdpClient來處理了;例如說在不知道對方的IP位置的情況,而對方有做類似IpSearch的功能時,就可以利用廣播的方式讓對方將自己目前的IP位置給傳送回來。 廣播封包的發送通常來說動作就是向255.255.255.255這個廣播位置去做資料的發送,然後再去讀取回送的資料,而本篇筆記主要是在Windows XP跟之後的作業系統(Windows7/WIndows8)之間的差異性 筆者在早期有撰寫了一個簡單的小軟體,來做廣播處理的動作,在發送UDP封包的部分,程式碼大致如下          Dim  bEP  As   New   IPEndPoint ( IPAddress .Broadcast, 4550)         Client =  New   UdpClient (4550,  AddressFamily .InterNetwork)         Client.EnableBroadcast =  True         Client.Send(btySend, btySend.Length,  "255.255.255.255" , 4550)         Threading. Thread .Sleep( CInt (txtDelay.Text))          Do          ...

在Windows CE中,如何修改IP設定之後立即套用新的設定呢?

在Windows CE中,通常我們會將網路卡設定一個固定IP,用來與其他的設備做溝通、通訊,那麼設定了IP之後,跟著就會有IP變更的需求了,那麼怎麼去變更IP呢? 從登錄檔中,可以看到IP的相關設定會在這個位置當中 HKEY_LOCAL_MACHINE\Comm\PCI\網卡名稱\Parms\TCPIP 其中會看到Ipaddress、defaultGetway、SubnetMask這三個就是對應到IP的設定了,要變更的地方也就是這三個了,而在compact framework 2.0對登錄檔的操作也有提供了類別可以使用,可以參考MSDN上的 相關類別使用說明 ,下面這邊是利用p/Invoke的方式來做 p/Inove的宣告 < DllImport ( "CoreDll.dll" , EntryPoint : = "RegDeleteKeyW" ) > _ Public Function RegDeleteKey ( ByVal hKey As Integer , ByVal lpSubKey As String ) As Integer End Function < DllImport ( "CoreDll.dll" , EntryPoint : = "RegCreateKeyExW" ) > _ Public Function RegCreateKeyEx ( ByVal hkey As Integer , ByVal lpSubKey As String , _ ByVal Reserved As Integer , ByVal lpClass As String , _ ByVal dwOptions As Integer , ByVal samDesired As Integer , _ ByVal lpSec...

關閉接收中的UdpClient

在撰寫Udp相關的應用時,呼叫Receive方法時會等候到接收了資料為止;因為這個特性,通常會使用另外一個Thread來處理Udp的動作,例如說一個接聽廣播封包的thread,專門對特定的port number等候廣播訊息,而接聽到指令之後進行特定動作,程式碼可能長的像是下面這樣 Private Sub WaitForCommand ( ) Do If _bolStop Then Exit Do Try btyRecv = _client . Receive ( _anyEndpoint ) If btyRecv . Length > 0 Then If ByteToStr ( btyRecv ) = "command" Then ''do something End If End If Catch ex As Exception ''錯誤處理 End Try Threading . Thread . Sleep ( 100 ) Loop End Sub 當執行到_client.Receive之後,就會在這一行指令等候資料接收,那麼在這個狀況之下,如果應用程式必須要關閉的話,要怎麼處理呢?Thread.Abort() ? 這個時候如果呼叫Thread的Abort方法還是無法停止Thread的運作 Orz 那麼應該怎麼做呢?搜尋了一下之後發現方法也是出乎意料的簡單,直接呼叫UdpClient的Close方法就可以了,那麼就可以用類似下面的方式來停止等候接收 Public Sub [ Stop ] ( ) _bolStop = True Try ...

VS2003呼叫VS2005的COM DLL

圖片
在.net的環境寫作程式預設就提供了相當多的類別可供使用,寫作程式上也變的相當的方便,但有時候會遇到舊系統的需求新增,或是必須要撰寫DLL(組件)來讓其他使用者做使用的情形;而在這樣的情況,通常會撰寫類別庫,也就是產生出DLL的檔案來供其他人方便使用。而在使用.Net DLL時,在相同版本的.net framework也很方便,只要用加入參考的方式將該DLL加入參考後,就可以開始使用相關的功能;但是在VS2003與VS2005之間互通時卻無法使用加入參考的方式去做,又或者當我們必須要將DLL提供給網頁、VB6這樣的開發環境時,該怎麼辦呢?這篇主要說明一下在VS2003的環境(.net framework 1.1)要怎麼樣去使用VS2005(.net framework 2.0)的COM DLL。 在進入主題之前,這邊先說明一下當要將DLL提供給網頁(ASP)或是VB6使用時應該要怎麼做;在後續同樣的也必須要經過這些步驟才能順利的讓VS2003使用相關的DLL。 首先,要開放給像是VB6這樣的程式使用時,必須要將DLL開放COM介面,讓其他的程式透過COM介面來呼叫,而要怎麼實作呢?請參考Will保哥的文章,相當的清楚,位置再下面這邊 http://blog.miniasp.com/post/2008/07/How-to-write-COM-component-using-NET.aspx 這邊補充一個部分,要將.net組件加入到GAC中時,必須要簽署組件,也就是設定強式名稱(Strong Name),不然會加不進去,簽署的位置會像下圖這樣 好,那麼參考完保哥的文章後,相信大家都可以實作出COM DLL了,接下來就是如何在VS2003中去使用了。 在將相關的DLL安裝到系統上之後,開啟VS2003,選擇加入參考之後,在選單中可以看到我們註冊到系統中的DLL,但是選取後卻會得到一個無情的錯誤 沒關係,沒辦法從IDE加入,還有CreateObject可以使用,所以用了像下面這樣的方式 Dim A As Object = CreateObject("RFTagSDKs.RD1623") 結果卻得到了一個無法產生ActiveX的錯誤訊息,怎麼會這樣呢,主要就是因為.net framework版本的關係;那要怎麼去解決呢?可以參考下面這篇的方式 http:/...

利用SmtpClient來發送email

無法查看此摘要。請 按這裡查看文章。

How-to 利用資源檔來做多國語言的介面

圖片
在以往VB6的時候我們會立用資源檔來做多國語言的介面,那麼到了.net的環境,我們應該怎麼去做呢?是的,還是那道光,利用資源檔就可以達到我們的需求,不過用法有不同的方式,你也可以參考在MSDN forums上面的這篇文章 "VB.Net多國語言介面問題" 。 好,下面說明一下我的做法,其實主要是參考 .net Manazine電子報 的做法,有興趣的話可以到該網站找n020800701這篇文章;先看看介面的部分,我在form上面放了一個combobox以及兩個label來展示效果,選擇簡體時會像下圖這樣 繁體中文會像下面這樣 接下來是一些注意的地方以及程式碼 首先要加入資源檔,在"方案總管"的地方,點滑鼠右鍵,之後選擇"加入"→"新增項目",之後加入資源檔;而資源檔的命名方式是"自訂名稱.語系簡稱.resx",這邊我是做了三個, Resource.en-US.resx Resource.zh-TW.resx Resource.zh-CN.resx ,而在資源檔上面連續點兩下,就會進入到編輯畫面,這邊我簡單的加了兩個項目 在名稱的地方就是我們等一下在程式中會用到的"key"了,所以可不能亂打一通,不然可是很難處理,而值的地方就是會顯示UI上面的文字了;好,編輯完三個檔之後,我們來看看程式碼吧 Imports System.Globalization Imports System.Reflection Public Class Form1 Dim RM As Resources.ResourceManager Dim CI As CultureInfo Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load RM = New Resources.ResourceManager("ResourceTest.Resource", Assembly.GetExecutingAssembly) End Sub Private Sub Co...

Capturing sound by using DirectSound

最近要用到一些抓microphone的聲音以及播放的功能,找了一些資料,可以呼叫winmm.dll或是使用DirectX的功能;最後我是選擇了DirectX,為什麼呢?因為後面還有影像的部分要處理,DirectX在影像方面也是有解決方案,而且想要玩DirectX也一段時間了..orz Mansged DirectX的資料還真的是不多,現在也還在實作中..XD 以目前新版的DirectX SDK來說,裡面都沒有包含MDX需要的DLL,也沒有相關的Sample;我是安裝march2008的版本,還有包含MDX需要的DLL;MDX到現在是變成XNA,但是還是搞不太清楚XNA、MDX之間的關係..XD,就先從MDX下手吧。 下面這邊先把相關的資料列出來,有興趣的可以下載sample一起研究看看 DirectX 9.0 for Managed Code(MSDN) A Voice Chat Application in C#(Code project) Capturing and streaming sound by using DirectSound with C# Streaming directly from mic to speakers using DirectSound

How-to 做一個自己的"進度列(ProgressBar)"

圖片
今天剛好同事問我有關ProgressBar的問題,需求是因為他是利用ProgressBar在需要長時間動作時讓使用者知道程式是沒有當掉的,但是遇到同步動作的時候連ProgressBar也會有停頓的情形,所以想要用多執行緒來實做看看;下面這邊是一個簡單的實做範例,可以參考看看 下面這張圖是實際拉到Form上面時的效果 再來是元件的程式碼,名稱我是亂取,叫做MyLabel,還沒有經過詳細的測試,有問題的話請讓我知道吧~ orz Imports System.Threading Public Class myLabel Inherits Control Private _thdDraw As Thread Private _gr As Graphics Private _myBrush As New SolidBrush(MyBase.ForeColor) 'Private _myB As New System.Drawing.Drawing2D.LinearGradientBrush( Private _Progess As Integer = 0 Private _Max As Integer = 100 Private _Min As Integer = 0 Private _AutoDrawInterval As Integer = 1000 Private _bolStop As Boolean = False Private _bolEnable As Boolean = False Private _stringFormat As New StringFormat Private _bsText As New SolidBrush(Color.Black) ''' ''' 複寫掉設定ForeColor時的動作 ''' ''' ''' ''' Public Overrides Property ForeColor() As System.Drawing....

使用user setting來存放資料

圖片
Note:本篇使用工具為VS2008,.Net framework 2.0 在 前面這篇 有提過設定檔的使用方式,在Visual Basic中有更簡單的方式可以去使用,下面我們來看看使用的方式 首先,開啟專案的屬性頁籤,加入兩個設定,像是下面這張圖 要特別注意,這邊要將範圍設定為"user",在程式碼中你會發現,如果你將範圍設定為"application"的話那麼,它會是 ReadOnly 的;設定完成之後,我做了像下圖簡單的Form 很簡單的介面,取得或是儲存的程式碼也相當的簡單 Private Sub btnReadSetting_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnReadSetting.Click txtSetting1.Text = My.Settings.Setting1 txtSetting2.Text = My.Settings.Setting2 End Sub Private Sub btnSaveSetting_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSaveSetting.Click My.Settings.Setting1 = txtSetting1.Text My.Settings.Setting2 = txtSetting2.Text End Sub 就這樣,我們就可以利用config檔來儲存程式要用的相關設定了。點開設定檔(app.config)你會看到像下面這樣的xml設定 有另外一點要特別注意,一般的設定檔會放在跟exe檔同樣的目錄中,而使用像上面的方式去儲存之後,你會發現"奇怪,檔案內容怎麼沒有變化呢?",原因是當經過儲存動作之後,會將設定檔放到使用者資料存放區去了,也就是 C:\Documents and Settings\使用者登入名稱\Local Settings\Application Data\公司名稱\應用程式名稱_XX\版本資料夾 ,所以去直...

利用"字串"來叫出專案中的Form

今天碰巧看到網友問相關問題,搜尋了一下,在美國的MSDN論壇有這樣的做法(針對Form),在這邊列出給大家參考 Dim myF As Form = _ CType(Activator.CreateInstance(System.Reflection.Assembly.GetExecutingAssembly.GetType("YourAssemblyName." & "YourFormName")), Form) myF.Show() 這樣就可以叫出對應的form了,今天又學了一招..嘿嘿... 美國論壇搜尋的結果可以參考這邊

簡單的XML R/W 範例

Note:.net compact framework 2.0,Windows mibile 5.0 這篇主要是回復網友問題時做的測試程式,原文在 這邊 ,下面來看看測試的程式碼 XML內容是像下面這樣 程式碼部分 Imports System.Xml Public Class Form1 Dim xmlDoc As XmlDocument Dim strTmp As String = "" Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load xmlDoc = New Xml.XmlDocument() ''載入XML文件 xmlDoc.Load(GetAppPath() & "\test.xml") End Sub Private Sub btnDisplay_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDisplay.Click Dim xnodelist As Xml.XmlNodeList = xmlDoc.SelectNodes(txtXPath.Text) If xnodelist.Count > 0 Then DisplayXmlNode(xnodelist) Else TextBox1.Text = "Not found" End If End Sub Private Sub DisplayXmlNode(ByRef xNodeList As XmlNodeList) For Each x As Xml.XmlNode In xNodeList If x.HasChildNodes Then ...

WPF - RotateTransform

圖片
這篇來測試一下旋轉的效果,旋轉的效果是將RotateTransForm設定給控制項的RenderTransForm屬性,執行的結果像下面這樣 下面我們就來看看測試的程式碼吧 Imports System.Windows Imports System.IO Imports System.Reflection Class Window1 Dim cv As Canvas Dim myT As Threading.DispatcherTimer Dim btnOther As New Button Dim rotatePoint As Double = 0 Private Sub Window1_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded cv = New Canvas Me.Content = cv For z As Integer = 0 To 9 Dim btn As New Button btn.Name = "btn_" & z ''設定旋轉的原點 btn.RenderTransformOrigin = New Point(0, 0) ''設定旋轉的角度 btn.RenderTransform = New RotateTransform(z * 36) btn.Content = "Button" & z & " Rotate=" & Format(z * 36, "000") btn.Background = Brushes.LightPink Canvas.SetLeft(btn, 150) Canvas.SetTop(btn, 150...

WPF - Expander

圖片
Expander也算是一種容器,下面我們簡單的用程式碼來測試一下Expander的功能,執行結果畫面大概是像下面這樣 Imports System.Windows Imports System.IO Imports System.Reflection Class Window1 Dim sp As StackPanel Dim exp As Expander Dim chsp As StackPanel Private Sub Window1_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded sp = New StackPanel Me.Content = sp chsp = New StackPanel For z As Integer = 0 To 4 Dim rdo As New RadioButton rdo.Name = "rdo" & z rdo.Content = "RadioButton" & z chsp.Children.Add(rdo) Next exp = New Expander exp.Content = chsp exp.Background = Brushes.AliceBlue sp.Children.Add(exp) ''設定展開的方向 ''exp.ExpandDirection = ExpandDirection.Right exp.Header = "Header" End Sub End Class

WPF學習日誌 ~ RadioButton ~

RadioButton與之前在Windows Form的時候使用上沒有太大的差異,下面這邊我們特別說明一個GroupName這個屬性;在以往,同一個群組的項目我們會把它放到容器中,用容器來作分割;而在WPF裡面則是用GroupName來作分割,下面我們來看看測試的程式碼 Imports System.Windows Imports System.IO Imports System.Reflection Class Window1 Dim spMain As StackPanel Dim wpChild_1 As WrapPanel Dim wpChild_2 As WrapPanel Dim rdoA(2) As RadioButton Dim rdoB(2) As RadioButton Dim tbMsg As TextBlock Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded spMain = New StackPanel Me.Content = spMain For z As Integer = 0 To 2 rdoA(z) = New RadioButton rdoA(z).Content = "RadioButton-A-" & z ''不指定GroupName的話預設是"" 'rdoA(z).GroupName = "A" rdoA(z).Margin = New Thickness(3) AddHandler rdoA(z).Checked, AddressOf RadioButton_Checked rdoB(z) = New RadioButton rdoB(z).Content = ...

WPF學習日誌 ~ RepeatButton ~

RepeatButton也是Buton其中的一種,主要的差別是在於當你按住RepeatButton不放的時候,Click事件會被重複的觸發;下面是測試的程式碼,可以測試壓著Button不放的時候TextBox的變化 Imports System.Windows Imports System.IO Imports System.Reflection Class Window1 Dim wp As WrapPanel Dim txtInput As TextBox Dim btnAdd As Windows.Controls.Primitives.RepeatButton Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded wp = New WrapPanel Me.Content = wp txtInput = New TextBox txtInput.Width = 200 txtInput.Text = "0" wp.Children.Add(txtInput) btnAdd = New Windows.Controls.Primitives.RepeatButton btnAdd.Content = "Press Me" wp.Children.Add(btnAdd) AddHandler btnAdd.Click, AddressOf Button_OnClick End Sub Protected Sub Button_OnClick(ByVal sender As Object, ByVal e As RoutedEventArgs) txtInput.Text = CInt(txtInput.Text) + 1 End Sub End Class

WPF學習日誌 ~ 只能輸入數字的TextBox ~

在Windows Form常常有一些驗證輸入的需求,限制只能輸入某些字的TextBox在WPF中跟之前沒有太大的不同,下面簡單的列出處理部分的程式碼 AddHandler txt.PreviewKeyDown, AddressOf TextBox_PreviewKeyDown 這裡我們在PreviewKeyDowm的事件中處理,處理的程式碼像下面這樣 Protected Sub TextBox_PreviewKeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) If (e.Key Key.D9) Then e.Handled = True End If End Sub 要特別注意的是在PreviewKeyDown事件中不要直接抓TextBox.Text來作處理喔,因為這個事件中抓到的Text是"還沒有把輸入文字附加到Text屬性上"的

WPF學習日誌 ~ 事件傳遞 ~

這篇簡單的說明一下在WPF中事件傳遞的部分,下面是測試的程式碼 Class Window1 Dim sp As StackPanel Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded sp = New StackPanel Me.Content = sp Dim tb As New TextBlock tb.Text = "I am a TextBlock" sp.Children.Add(tb) Dim btn As New Button btn.Content = "Button" sp.Children.Add(btn) Dim txt As New TextBox txt.Text = "Test words" sp.Children.Add(txt) AddHandler Me.MouseDown, AddressOf El_OnMouseDown End Sub Protected Sub El_OnMouseDown(ByVal sender As Object, ByVal e As MouseButtonEventArgs) If e.ChangedButton = MouseButton.Right Then Me.Title = "Source:" & e.Source.ToString & " OriginalSource:" & e.OriginalSource.ToString If CType(e.Source, FrameworkElement).Margin = New Thickness(5) Then CType(e.So...

利用IP位置取得對方的Mac

要取得本機的MAC位置我們可以利用WMI或是.Net framework提供的相關功能來作,例如下面這兩篇 請問在 VB2005 中, 如何得知對方 MAC Address vb.net 2005如何獲取本機以下信息 那如果要得知遠端的MAC位址應該怎麼做,雖然可以利用arp的指令並將結果輸出到文字檔,但這樣有點麻煩,找了些參考資料後,我們可以用下面的程式碼來取得 首先是一些參考資料 RtlMoveMemory SendARP Function How to get mac address with input ip address 下面是測試的程式碼 Private Const No_ERROR = 0 _ Private Shared Function inet_addr(ByVal s As String) As Integer End Function _ Private Shared Function SendARP(ByVal DestIp As Integer, _ ByVal ScrIP As Integer, _ ByRef pMacAddr As Long, _ ByRef PhyAddrLen As Long) As Integer End Function _ Private Shared Sub CopyMemory(ByVal dst As Byte(), ByRef src As Long, ByVal bcount As Integer) End Sub Private Function GetRemoteMACAddress(ByVal sRemoteIP As String, ByRef sRemoteMacAddress As String) As Boolean Dim dwRemoteIp As Integer Dim pMacAddr As Long = 0 Dim bpMacA...

掃描裝置上的GPS是哪一個COM

在" 在PDA上開發GPS的程式問題 這篇文章中,有提到要如何去看GPS是在哪一個COM Port上面;一般來說有兩個方式,一個是自己去掃描,另一種方式就是借助別人的軟體去看了;下面這邊我做了一個簡單的掃描程式,有興趣的朋友可以參考看看 Imports System.IO.Ports Imports System.Text Public Class Form1 Dim strPortName As String = "" Dim strTmp As String = "" Dim B(199) As Byte Dim intReturn As Integer = 0 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load SerialPort1.BaudRate = 4800 SerialPort1.DataBits = 8 SerialPort1.Handshake = Handshake.None SerialPort1.StopBits = StopBits.One SerialPort1.Parity = Parity.None SerialPort1.ReadTimeout = 2500 For Each s As String In SerialPort.GetPortNames SerialPort1.PortName = s Try SerialPort1.Open() Threading.Thread.Sleep(200) intReturn = SerialPort1.Read(B, 0, B.Length) If intReturn > 0 Then strTmp = Encodi...

Form.Show ? Form.ShowDialog ?

在討論區 請問close, dispose與form的關係 這篇文章中,提到有關Form的一些關閉事件的問題,其中有關ShowDialog的部分在Windows Form上面也是相同的,大家可以參考一下 你可以用下面程式碼來觀察事件發生的順序(我使用的是VB) Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed Debug.WriteLine(Now.Ticks & ": Form Closed..") End Sub Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing Debug.WriteLine(Now.Ticks & ": Form Closing..") End Sub Private Sub Form1_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Disposed Debug.WriteLine(Now.Ticks & ": Form Disposed..") End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.MinimizeBox = False End Sub 另外預設Form的右上角會是"X"(也就是允許最小化),在"X"的時候點下去,這時候是不會把Form關閉的,而是讓Form躲起來;而設定Me.MinimizeBox = False(不允許最小化),這時候右上角會變成"OK",這時候點選的時候會把Form關閉。 要特別注意的一點,當用ShowDialog的方式去呼叫表單出來的時候,要自行在關閉Form...