Imports System.Runtime.InteropServices
Public Class Form1
'API 선언...
<DllImport("user32")> _
Public Shared Function GetCursorPos(ByRef pt As Point) As Int32
End Function
Dim pi As Point = New Point()
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
MyBase.OnLoad(e)
timer1.Start()
End Sub
Protected Overrides Sub OnClosed(ByVal e As System.EventArgs)
MyBase.OnClosed(e)
timer1.Stop()
End Sub
Private Sub timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timer1.Tick
'마우스 커서 좌표 읽어 오기...
GetCursorPos(pi)
'현재 마우스 커서 좌표 표시...
lblX.Text = pi.X.ToString()
lblY.Text = pi.Y.ToString()
End Sub
End Class
Imports System.Runtime.InteropServices
Public Class Form1
'API 선언...
Private Declare Function ImmGetContext Lib "imm32.dll" (ByVal hwnd As Integer) As Integer
Private Declare Function ImmGetConversionStatus Lib "imm32.dll" (ByVal himc As Integer, ByRef lpdw As Integer, ByRef lpdw2 As Integer) As Integer
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
MyBase.OnLoad(e)
Timer1.Start()
End Sub
Protected Overrides Sub OnClosed(ByVal e As System.EventArgs)
MyBase.OnClosed(e)
Timer1.Stop()
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Try
Dim hIMC As Integer
Dim dwConversion As Integer, dwSentence As Integer
Dim rc As Integer
hIMC = ImmGetContext(textBox1.Handle.ToInt32)
'TextBox 한영키 상태값 얻기...
rc = ImmGetConversionStatus(hIMC, dwConversion, dwSentence)
If dwConversion = 0 Then
label1.Text = "한영키 상태 : 영문"
Else
label1.Text = "한영키 상태 : 한글"
End If
Catch ex As Exception
Debug.WriteLine(ex.Message.ToString())
End Try
End Sub
End Class
* VBNET 윈도우 폼(Window Form) 화면 그대로 프린트(Print) 하기 예제...
- 화면 구성 : Panel , Listview, Label, Line, GroupBox, printForm
위 그림처럼 화면 구성에printform 을 사용 하기 위해서는 Visual Basic PowerPack dll 이 필요합니다.
전체 소스 코드
Form1.vb
Public Class Form1
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
ListView1.Items.Clear()
For iCount As Integer = 1 To 20
Dim lvi As ListViewItem = New ListViewItem()
lvi.Text = iCount.ToString()
lvi.SubItems.Add("TEST " + iCount.ToString())
ListView1.Items.Add(lvi)
Next
MyBase.OnLoad(e)
End Sub
Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
'Enter Key Input...
If e.KeyCode = Keys.Enter Then
'Form Print
PrintForm1.PrinterSettings.DefaultPageSettings.Landscape = True
PrintForm1.PrinterSettings.DefaultPageSettings.Margins = New System.Drawing.Printing.Margins(50, 50, 50, 50)
PrintForm1.Print()
End If
End Sub
End Class
* VBNET WMI 를 이용한 네트워크 IP 및 Subnet, Gateway 설정 하기 예제...
-WMI 를 사용하기 위해 참조 -> System.Management dll 을 추가 -> 소스 코드 imports System.Management
전체 소스 코드
Form1.vb
Imports System.Management
Public Class Form1
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
Dim objMC As ManagementClass = New ManagementClass("Win32_NetworkAdapterConfiguration")
Dim objMOC As ManagementObjectCollection = objMC.GetInstances()
For Each MO As ManagementObject In objMOC
If Not CType(MO("IPEnabled"), Boolean) Then
Continue For
End If
Try
Dim objNewIP As ManagementBaseObject = Nothing
Dim objSetIP As ManagementBaseObject = Nothing
Dim objNewGate As ManagementBaseObject = Nothing
objNewIP = MO.GetMethodParameters("EnableStatic")
objNewGate = MO.GetMethodParameters("SetGateways")
'Set Gateway
objNewGate("DefaultIPGateway") = New String() {txtGateway.Text}
objNewGate("GatewayCostMetric") = New Integer() {1}
'Set IP
objNewIP("IPAddress") = New String() {txtIP.Text}
'Set Subnet
objNewIP("SubnetMask") = New String() {txtSubnet.Text}
objSetIP = MO.InvokeMethod("EnableStatic", objNewIP, Nothing)
objSetIP = MO.InvokeMethod("SetGateways", objNewGate, Nothing)
objSetIP = MO.InvokeMethod("EnableStatic", objNewIP, Nothing)
objSetIP = MO.InvokeMethod("SetGateways", objNewGate, Nothing)
MessageBox.Show("Updated IPAddress, SubnetMask and Default Gateway!")
Catch ex As Exception
MessageBox.Show("Unable to Set IP : " + ex.Message)
End Try
Next
End Sub
End Class
*VBNET WMI 를 이용한 네트워크 IP 및 Subnet, Gateway 얻어 오기 예제...
-WMI 를 사용하기 위해 참조 -> System.Management dll 을 추가 -> 소스 코드 imports System.Management
전체 소스 코드
Form1.vb
Imports System.Management
Public Class Form1
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
Dim MC As ManagementClass = New ManagementClass("Win32_NetworkAdapterConfiguration")
Dim MOC As ManagementObjectCollection = MC.GetInstances()
For Each MO As ManagementObject In MOC
'nothing 아니면...
If Not MO("IPAddress") Is Nothing Then
If TypeOf MO("IPAddress") Is Array Then
'IP 및 Subnet, Gateway String 배열로 변환...
Dim address() As String = CType(MO("IPAddress"), String())
Dim subnets() As String = CType(MO("IPSubnet"), String())
Dim gateways() As String = CType(MO("DefaultIPGateway"), String())
'모두 nothing 이 아니면...
If (Not address Is Nothing) And (Not subnets Is Nothing) And (Not gateways Is Nothing) Then
'화면에 표시...
lblIP.Text = address(0)
lblSubnet.Text = subnets(0)
lblGateway.Text = gateways(0)
End If
End If
End If
Next
End Sub
End Class
*예제 결과
윈도우 시작 -> 실행 -> cmd -> ipconfig 를 입력 하시면 위 그림과 같이 네트워크 IP 를 확인 하실 수 있습니다.
* VBNET WMI 를 이용한 하드 디스크 온도 체크 예제 (HDD Temperature)
-WMI 를 사용하기 위해 참조 -> System.Management dll 을 추가 -> 소스 코드 imports System.Management
전체 소스 코드
Form1.vb
Imports System.Management
Imports Microsoft.Win32
Imports System.Collections
Public Class Form1
Dim tmr As System.Windows.Forms.Timer = New System.Windows.Forms.Timer()
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
'타이머가 도는 시간 설정
tmr.Interval = 1000 '1초
'타이머 이벤트 등록
AddHandler tmr.Tick, AddressOf Timer_Tick
MyBase.OnLoad(e)
End Sub
Protected Overrides Sub OnClosed(ByVal e As System.EventArgs)
tmr.Stop()
'메모리 해제
tmr = Nothing
'메모리 정리
GC.Collect()
MyBase.OnClosed(e)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'타이머 시작
tmr.Start()
End Sub
Sub Timer_Tick()
HDDTemperatrue()
End Sub
Public Sub HDDTemperatrue()
Dim diskTemperature As String = "MSStorageDriver_ATAPISmartData"
Try
Dim mos As ManagementObjectSearcher = New ManagementObjectSearcher("root\WMI", "Select * From " + diskTemperature)
Dim mo As System.Management.ManagementObject
For Each mo In mos.Get()
Dim data() As Byte = CType(mo.GetPropertyValue("VendorSpecific"), Byte())
diskTemperature = data(3).ToString()
Label1.Text = diskTemperature.ToString()
Next
Catch
diskTemperature = ""
End Try
End Sub
End Class
Imports System.Data.OleDb
Public Class Form1
Dim str As String = ""
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
listView1.Items.Clear()
'OLEDB 공급자 가져오기
Dim oe As OleDbEnumerator = New OleDbEnumerator()
'DataTable 에 가져온 공급자 담기
Dim dt As DataTable = oe.GetElements()
'로컬 네트워크 상에 있는 OLEDB 공급자 리스트
For iCount As Integer = 0 To dt.Rows.Count - 1
Dim lvi As ListViewItem = New ListViewItem
lvi.Text = (iCount + 1).ToString()
lvi.SubItems.Add(dt.Rows(iCount)(0).ToString())
'나중에 Excel OLEDB 시 사용
'If dt.Rows(iCount)(0).ToString().Contains("ACE") Then
' str = dt.Rows(iCount)(0).ToString()
'End If
listView1.Items.Add(lvi)
Next
End Sub
End Class
ReDim문을 사용하여 이미 선언된 배열의 차원 중 하나 이상의 크기를 변경할 수 있습니다.큰 배열이 있고 요소가 더 이상 필요하지 않은 경우ReDim은 배열 크기를 줄여서 메모리를 확보할 수 있습니다.반면에 배열에 요소가 더 필요한 경우ReDim은 요소를 추가할 수 있습니다.
ReDim문은 배열에만 사용할 수 있으며스칼라(단일 값만 포함된 변수), 컬렉션 또는 구조체에서는 유효하지 않습니다.변수를Array형식으로 선언하는 경우ReDim문에는 새 배열을 만들 수 있는 충분한 형식 정보가 없습니다.
ReDim은 프로시저 수준에서만 사용할 수 있습니다.따라서 변수의 선언 컨텍스트는 프로시저여야 하며, 소스 파일, 네임스페이스, 인터페이스, 클래스, 구조체, 모듈 또는 블록일 수 없습니다.자세한 내용은선언 컨텍스트 및 기본 액세스 수준을 참조하세요.
규칙
여러 변수.동일한 선언문에서 여러 배열 변수의 크기를 조정 하 고 각 변수에 대 한name및boundlist부분을 지정할 수 있습니다.여러 변수는 쉼표로 구분됩니다.
배열 범위입니다.boundlist의 각 항목은 해당 차원의 하 한과 상한을 지정할 수 있습니다.하한은 항상 0(영)입니다.상한은 해당 차원에 가능한 최대 인덱스 값이며 차원의 길이(상한에 1을 더한 값)는 아닙니다.각 차원의 인덱스는 0부터 상한 값까지 다양할 수 있습니다.
boundlist의 차원 수는 배열의 원래 차원 수(차수)와 일치해야 합니다.
데이터 형식.ReDim문은 배열 변수 또는 해당 요소의 데이터 형식을 변경할 수 없습니다.
초기.ReDim문은 배열 요소에 대해 새 초기화 값을 제공할 수 없습니다.
배열.ReDim문은 배열의 차수 (차원 수)를 변경할 수 없습니다.
Preserve를 사용 하 여 크기 조정.Preserve사용 하는 경우 배열의 마지막 차원만 크기를 조정할 수 있습니다.다른 모든 차원의 경우에는 기존 배열의 범위를 지정해야 합니다.
예를 들어 배열에 차원이 하나만 있는 경우 해당 차원의 크기를 조정해도 배열의 모든 내용을 보존할 수 있습니다. 마지막이자 유일한 차원을 변경하기 때문입니다.그러나 배열에 둘 이상의 차원이 있는 경우에는Preserve를 사용하여 마지막 차원의 크기만 변경할 수 있습니다.
정보의.값의 배열을 포함 하는 속성에ReDim를 사용할 수 있습니다.
동작
배열 바꾸기.ReDim기존 배열을 해제 하 고 동일한 순위로 새 배열을 만듭니다.새 배열은 배열 변수에서 해제된 배열을 대체합니다.
을 유지 하지 않고 초기화 합니다.Preserve지정 하지 않으면 해당 데이터 형식에 대 한 기본값을 사용 하 여 새 배열의 요소를 초기화ReDim.
Preserve를 사용 하 여 초기화 합니다.Preserve지정 하는 경우 Visual Basic 기존 배열의 요소를 새 배열에 복사 합니다.
예제
다음 예제에서는 배열의 기존 데이터를 손실하지 않고 동적 배열의 마지막 차원 크기를 늘린 다음 데이터를 부분적으로 손실하며 크기를 줄입니다.마지막으로 크기를 원래 값으로 다시 줄이고 모든 배열 요소를 다시 초기화합니다.
Dim문은 차원이 세 개인 새 배열을 만듭니다.각 차원은 범위 10으로 선언되므로 각 차원의 배열 인덱스는 0에서 10까지의 범위일 수 있습니다.다음 설명에서는 세 개의 차원이 계층, 행 및 열로 지칭됩니다.
첫 번째ReDim은intArray변수의 기존 배열을 대체하는 새 배열을 만듭니다.ReDim기존 배열의 모든 요소를 새 배열에 복사 합니다.또한 모든 계층에 있는 각 행의 끝에 열 10개를 더 추가하고 이러한 새 열의 요소를 0(배열의 요소 형식인Integer의 기본값)으로 초기화합니다.
두 번째ReDim은 새 배열을 하나 더 만들고 적합한 모든 요소를 복사합니다.그러나 5개의 열이 각 계층에 있는 각 행의 끝에서 손실됩니다.이는 해당 열의 사용을 마친 경우 문제가 되지 않습니다.큰 배열의 크기를 줄이면 더 이상 필요하지 않은 메모리를 확보할 수 있습니다.
세 번째ReDim은 새 배열을 하나 더 만들고 각 계층에 있는 각 행의 끝에서 5개의 열을 제거합니다.이번에는 기존 요소를 복사하지 않습니다.이 문은 배열을 원래 크기로 되돌립니다.이 문은Preserve한정자를 포함하지 않기 때문에 모든 배열 요소를 원래 기본값으로 설정합니다.