調(diào)用api
成都創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司,專注成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、網(wǎng)站營銷推廣,空間域名,虛擬主機,網(wǎng)站改版維護(hù)有關(guān)企業(yè)網(wǎng)站制作方案、改版、費用等問題,請聯(lián)系成都創(chuàng)新互聯(lián)。
在Visual Baisc.net中的聲明:
Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Public Const MOUSEEVENTF_LEFTDOWN = H2 '模擬鼠標(biāo)左鍵按下
Public Const MOUSEEVENTF_LEFTUP = H4 ’模擬鼠標(biāo)左鍵釋放
Public Const MOUSEEVENTF_MIDDLEDOWN = H20 '模擬鼠標(biāo)中間鍵按下
Public Const MOUSEEVENTF_MIDDLEUP = H40 '模擬鼠標(biāo)中間鍵釋放
Public Const MOUSEEVENTF_RIGHTDOWN = H8 '模擬鼠標(biāo)右鍵按下
Public Const MOUSEEVENTF_RIGHTUP = H10 '模擬鼠標(biāo)右鍵釋放
Public Const MOUSEEVENTF_MOVE = H1 '模擬鼠標(biāo)指針移動
例:
mouse_event MOUSEEVENTF_LEFTDOWN,10,10,0,0
'在(10,10)模擬鼠標(biāo)左鍵按下
Private Declare Function GetCursorPos Lib "user32" (ByRef lpPoint As POINTAPI) As Long '全屏坐標(biāo)聲明
Private Declare Function ScreenToClient Lib "user32.dll" (ByVal hwnd As Int32, ByRef lpPoint As POINTAPI) As Int32 '窗口坐標(biāo)聲明
Private Structure POINTAPI '聲明坐標(biāo)變量
Public x As Int32 '聲明坐標(biāo)變量為32位
Public y As Int32 '聲明坐標(biāo)變量為32位
End Structure
'以上是聲明部分
'以下是窗口部分
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick '用時鐘控件來取坐標(biāo),窗口上放個Timer組件,Enabled為允許,周期為10到100毫秒均可
Dim P As POINTAPI '聲明坐標(biāo)變量
Dim xx, yy '聲明轉(zhuǎn)換要用到的變量
GetCursorPos(P) '獲取鼠標(biāo)在屏幕中的位置
ScreenToClient(Me.Handle.ToInt32, P) '轉(zhuǎn)換為本窗體的坐標(biāo)
xx = P.x.ToString '把X轉(zhuǎn)換成能顯示到文本框的字符串格式
yy = P.y.ToString '把Y轉(zhuǎn)換成能顯示到文本框的字符串格式
TextBox1.Text = xx + "和" + yy '文本框的內(nèi)容為X坐標(biāo)和Y坐標(biāo)
End Sub
比如你要更換在你某個窗體上的光標(biāo)。
那么在這個窗體內(nèi)用這樣的代碼
Me.Cursor = System.Windows.Forms.Cursors.Cross
如果你要更換當(dāng)前系統(tǒng)顯示的光標(biāo)
System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Cross
其中Cross代表十字光標(biāo),你也可以更改成其他的,直接查看Cursors中的各成員就可以找到了。
幾乎找不到真正VB.NET的api,都是自己將VB的api改成VB.NET的api,我的理解是聲明中對應(yīng)輸入是H的地方保留Long,其他的Long改成Integer,既然VB.NET連MSDN都找不到較全的api說明,不保證api的用法在VB.NET其他版本中適用。
給你個好玩的例子,包括鼠標(biāo)的隱藏(Ctrl_↓)、顯示(Ctrl_↑),移動、點擊
在Form1上放上2個TextBox,其中TextBox1.Multiline = True,并且面積大些,2個Button,運行后在TextBox1中點擊一下會記錄位置,移開鼠標(biāo),點擊移動或點擊Button,可模擬在TextBox1中的點擊
Public Class Form1
Public My_MousePosition As Point
'模擬鼠標(biāo)移動、點擊
Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
'定義光標(biāo)的位置
Declare Function SetCursorPos Lib "user32" Alias "SetCursorPos" (ByVal x As Integer, ByVal y As Integer) As Integer
'鼠標(biāo)的隱藏
Declare Function ShowCursor Lib "user32" Alias "ShowCursor" (ByVal bShow As Integer) As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TextBox1.Multiline = True
Button1.Text = "點擊"
Button2.Text = "移動"
Me.KeyPreview = True
End Sub
Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
If e.Control And e.KeyCode = Keys.Down Then ShowCursor(0)
If e.Control And e.KeyCode = Keys.Up Then ShowCursor(1)
End Sub
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
TextBox2.Text = MousePosition.X " " MousePosition.Y
End Sub
Private Sub TextBox1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseClick
My_MousePosition = MousePosition
TextBox1.Text = My_MousePosition.X " " My_MousePosition.Y vbCrLf
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
SetCursorPos(My_MousePosition.X, My_MousePosition.Y)
mouse_event(H2, 0, 0, 0, 0)
mouse_event(H4, 0, 0, 0, 0)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
SetCursorPos(My_MousePosition.X, My_MousePosition.Y)
End Sub
End Class
其中
mouse_event Lib "user32" (ByVal dwFlags As Long
的dwFlags的代碼是
Const MOUSEEVENTF_LEFTDOWN = H2
Const MOUSEEVENTF_LEFTUP = H4
Const MOUSEEVENTF_MIDDLEDOWN = H20
Const MOUSEEVENTF_MIDDLEUP = H40
Const MOUSEEVENTF_MOVE = H1
Const MOUSEEVENTF_ABSOLUTE = H8000
Const MOUSEEVENTF_RIGHTDOWN = H8
Const MOUSEEVENTF_RIGHTUP = H10
例1:以下程序我們申請幾個指向不同類型的指針:
’使用StructLayout(LayoutKind.Sequential)屬性告訴net編譯器:結(jié)構(gòu)的元素在內(nèi)存中按其出現(xiàn)的順序排列
StructLayout(LayoutKind.Sequential) _
Public Structure DEFUDT_Test
Public bytb As Byte
Public i32a As Int32
End Structure
Public Function fnGetIntptr1() As IntPtr
’取得一個4字節(jié)數(shù)組指針
Dim tabytTest(3) As Byte
’以下語句告訴net垃圾回收進(jìn)程不對tabytTest進(jìn)行處理,也就是說tabytTest占用的內(nèi)存區(qū)域固定不變。
Dim thObject As GCHandle = GCHandle.Alloc(tabytTest, GCHandleType.Pinned)
Dim tpObject As IntPtr = thObject.AddrOfPinnedObject() ’取得指向字節(jié)數(shù)組的指針
’取得一個指向32位內(nèi)存數(shù)據(jù)的指針,
’由于使用gchandle取指針的方法只能對引用的對象有效,
’所以對如int32等值類型必須使用將其封裝成為一個對象的方法以變?yōu)橐妙愋?/p>
Dim ti32Test As Object = Convert.ToInt32(0)
’以下語句告訴net垃圾回收進(jìn)程不對ti32test進(jìn)行處理,也就是說ti32Test的內(nèi)存位置固定不變。
Dim thObject1 As GCHandle = GCHandle.Alloc(ti32Test, GCHandleType.Pinned)
Dim tpObject1 As IntPtr = thObject1.AddrOfPinnedObject() ’取得ti32Test的首地址
Dim tudtTest1 As DEFUDT_Test
’由于結(jié)構(gòu)是一種值類型變量,為保證指針申請方便,我們申請
’取得一個和結(jié)構(gòu)tudtTest1大小一致的字節(jié)數(shù)組指針,只要空間占用長度和結(jié)構(gòu)一樣就可以了
’由于net在結(jié)構(gòu)封裝中會插入額外的數(shù)據(jù)位,所以一定要用sizeof方法得到結(jié)構(gòu)在非托管使用時的實際大小
Dim tudtTest(Marshal.SizeOf(tudtTest1)) As Byte
Dim thObject2 As GCHandle = GCHandle.Alloc(tudtTest, GCHandleType.Pinned)
Dim tpObject2 As IntPtr = thObject2.AddrOfPinnedObject() ’取得指向結(jié)構(gòu)的指針
’在這兒你可以寫對指針處理的任意代碼(在例2中會給予補充)……
’在使用完畢后一定要釋放指針指向的內(nèi)存塊,讓垃圾回收器可對這個內(nèi)存塊回收處理
If thObject.IsAllocated Then
thObject.Free()
End If
If thObject1.IsAllocated Then
thObject1.Free()
End If
If thObject2.IsAllocated Then
thObject2.Free()
End If
End Function
上例中指針流程處理可以歸納為:
1、 定義一個具有合適內(nèi)存長度的引用變量(關(guān)于引用變量和值變量的差異可以參觀VB.NET的書籍)
2、使用GCHandle.Alloc方法將變量的內(nèi)存區(qū)域固定下來。
3、使用GCHandle對象的AddrOfPinnedObject取得該內(nèi)存區(qū)域的首地址并賦值給指針變量.
4、對指針進(jìn)行操作
5、使用GCHandle對象的free方法釋放指針指向的內(nèi)存區(qū)域以便net垃圾回收器可以回收這個內(nèi)存空間
2、指針?biāo)赶驍?shù)據(jù)的存取
在.net中,對指針指向數(shù)據(jù)的存儲函數(shù)都封裝在marshal類中,主要的函數(shù)包括:Copy、PtrToStringUni 、PtrToStructure 、OffsetOf、WriteXXX,RreadXXX等,其中WriteXXX的表示向指針?biāo)硎镜牡刂分袑懭隭XX類型的數(shù)據(jù),而ReadXXX中作用就是將指針?biāo)诘刂返臄?shù)據(jù)以XXX類型方式讀出??蠢?,我們使用這些方法演示對例1那幾個指向不同類型數(shù)據(jù)的指針作數(shù)據(jù)存/取操作。
例2:演示向例1申請得到的幾個指針執(zhí)行寫入及讀取數(shù)據(jù)的操作.
Marshal.WriteInt32(tpObject1, 0, Convert.ToInt32(77)) ’向ti32Test變量指向的地址寫入32位整數(shù)77
MsgBox("現(xiàn)在ti32Test的值為:" ti32Test) ’因為變量存儲地址的數(shù)據(jù)已改為77,所以顯示為77
’以下這句之所以可行,因為ti32Test是32位整數(shù),而tpObject指向的tabytTest數(shù)組剛好有4個元素
’而每一個byte元素都占用8位,合起來就是32位,和ti32Test占用的空間一樣。這就印證了前面提’
’到的net中指針沒有指向類型的說明。
Marshal.WriteInt32(tpObject, 0, ti32Test)
’以下代碼再將tabytTest字節(jié)數(shù)組的內(nèi)容理解為一個int32整數(shù),
’并將值賦值給tudtTest結(jié)構(gòu)中的int32元素
’我們使用Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32以取得i32a元素在結(jié)構(gòu)中的內(nèi)存偏移位置
’所以New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32)就臨時產(chǎn)生了
’一個指針并指向i32a所在的內(nèi)存地址(, 這個方法也說明了指針可以以字節(jié)為單位進(jìn)行加減計算以指向合適的變量。
’Marshal.ReadInt32的作用是從指針中讀取一個32整數(shù)。
Marshal.WriteInt32(New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32), _
0, Marshal.ReadInt32(tpObject))
’這兒可以將字節(jié)數(shù)組的內(nèi)容復(fù)制到真正的結(jié)構(gòu)中
MsgBox(Marshal.OffsetOf(tudtTest1.GetType, "i32a").ToInt32)
tudtTest1 = CType(Marshal.PtrToStructure(tpObject2, GetType(DEFUDT_Test)), DEFUDT_Test)
MsgBox("結(jié)構(gòu)tidtTest1中i32a元素的值為:" tudtTest1.i32a) ’此處將顯示剛賦的值77
MoveFirst(指針指向第一條記錄)、MovePrevious(指針指向上一條記錄)、MoveNext(指針指向下一條記錄)、MoveLast(指針指向最后一條記錄)、Update(更新)。
分享名稱:vb.net指針位置 vbnet控件位置
網(wǎng)站地址:http://aaarwkj.com/article20/hhpjjo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、、自適應(yīng)網(wǎng)站、網(wǎng)站排名、微信公眾號、App設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)