16,554
社区成员
发帖
与我相关
我的任务
分享
..............
Public Type COPYDATASTRUCT
dwData As Long
cbData As Long
lpData As Long
End Type
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Public Sub mySub(lParam As Long, wParam As Long)
On Error Resume Next
Dim cds As COPYDATASTRUCT
Dim w1 As String, n As Long
Dim Byt() As Byte
Call CopyMemory(cds, ByVal lParam, Len(cds))'''''这一句在vb.net中如何更改??
Select Case cds.dwData
Case 1
Case 2
Case 3 '
'重定义数组大小
ReDim Byt(wParam - 1)
Call CopyMemory(Byt(0), ByVal cds.lpData, cds.cbData)''''这一句在vb.net中如何更改??
w1 = StrConv(Byt, vbUnicode)
w1 = Left$(w1, InStr(1, w1, Chr$(0)) - 1)
n = InStr(w1, "|")
' Form1.Text3.Text = Right(w1, Len(w1) - n)
bFromHwnd = CLng(Left$(w1, n - 1))
' Form1.Lab1.Caption = "From:" & bFromHwnd
' Form1.Lab.Caption = "Size:" & wParam
End Select
End Sub
Imports System.Runtime.InteropServices
Public Module LSetTest
Public Structure STRC_B
Private Declare Ansi Sub RtlMoveMemory Lib "kernel32" _
(ByVal Destination As String, ByRef Source As STRC_B, ByVal Length As Integer)
<MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.ByValTStr, SizeConst:=3), VBFixedArray(3)> _
Public strBuff() As Char
Public Property Text() As String
Get
Dim intSize As Integer = Marshal.SizeOf(Me)
Text = Space(intSize)
RtlMoveMemory(Text, Me, intSize)
End Get
Set(ByVal value As String)
End Set
End Property
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
Public Structure STRC_A
Private Declare Ansi Sub RtlMoveMemory Lib "kernel32" _
(ByVal Destination As String, ByRef Source As STRC_A, ByVal Length As Integer)
<MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.ByValTStr, SizeConst:=4), VBFixedArray(4)> _
Public strA() As Char
<MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.ByValTStr, SizeConst:=4), VBFixedArray(4)> _
Public strB() As Char
<MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.ByValTStr, SizeConst:=4), VBFixedArray(4)> _
Public strC() As Char
'Embeded Structure in STRC_A
Public buff As STRC_B
Public Property Text() As String
Get
Dim intSize As Integer = Marshal.SizeOf(Me)
Text = Space(intSize)
RtlMoveMemory(Text, Me, intSize)
End Get
Set(ByVal value As String)
End Set
End Property
End Structure
Sub Main()
Dim abc As STRC_A = New STRC_A
abc.strA = "A___"
abc.strB = Space(4)
abc.strC = "B___"
abc.buff.strBuff = "123"
Console.WriteLine(abc.Text)
Console.Read()
End Sub
End Module
Public Declare Sub CopyMemoryStruct Lib "kernel32" Alias "RtlMoveMemory" (Byref hpvDest As COPYDATASTRUCT, Byval hpvSource As Integer, ByVal cbCopy As Integer)
Public Declare Sub CopyMemoryByte Lib "kernel32" Alias "RtlMoveMemory" (Byref hpvDest As Byte, Byval hpvSource As Integer, ByVal cbCopy As Integer)
Dim cds As New COPYDATASTRUCT
Dim w1 As String, n As Long
Dim Byt() As Byte
CopyMemoryStruct(cds, lParam, Marshal.SizeOf(cds))'''''这一句在vb.net中如何更改??
Select Case cds.dwData
Case 1
Case 2
Case 3 '
'重定义数组大小
ReDim Byt(wParam - 1)
CopyMemoryByte (Byt(0), ByVal cds.lpData, cds.cbData)''''这一句在vb.net中如何更改??
Option Explicit
Public Type COPYDATASTRUCT
dwData As Long
cbData As Long
lpData As Long
End Type
Public Type LARGE_INTEGER
lowpart As Long
highpart As Long
End Type
Public Const GWL_WNDPROC = (-4)
Public Const WM_COPYDATA = &H4A
Global lpPrevWndProc As Long
Global gHW As Long, bFromHwnd As Long
'Copies a block of memory from one location to another.
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Sub Hook()
On Error Resume Next
lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)
'Debug.Print lpPrevWndProc
End Sub
Public Sub Unhook()
On Error Resume Next
Dim temp As Long
temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
End Sub
Public Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error Resume Next
If uMsg = WM_COPYDATA Then
'wParam 传递的是数组的大小
Call mySub(lParam, wParam)
End If
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Function
Public Sub mySub(lParam As Long, wParam As Long)
On Error Resume Next
Dim cds As COPYDATASTRUCT
Dim w1 As String, n As Long
Dim Byt() As Byte
Call CopyMemory(cds, ByVal lParam, Len(cds))
Select Case cds.dwData
Case 1
Form1.Text3.Text = "got a 1"
Case 2
Form1.Text3.Text = "got a 2"
Case 3 '
'重定义数组大小
ReDim Byt(wParam - 1)
Call CopyMemory(Byt(0), ByVal cds.lpData, cds.cbData)
w1 = StrConv(Byt, vbUnicode)
w1 = Left$(w1, InStr(1, w1, Chr$(0)) - 1)
n = InStr(w1, "|")
Form1.Text3.Text = Right(w1, Len(w1) - n)
bFromHwnd = CLng(Left$(w1, n - 1))
Form1.Lab1.Caption = "From:" & bFromHwnd
Form1.Lab.Caption = "Size:" & wParam
End Select
End Sub
Option Explicit
Private Sub Command1_Click()
On Error Resume Next
If Not IsNumeric(Text1.Text) Then
MsgBox "请输入有效hwnd!"
Exit Sub
End If
If Len(Text2.Text) = 0 Then
MsgBox "请输入需要发送的内容!"
Exit Sub
End If
Dim cds As COPYDATASTRUCT, w1 As String, i As Long
Dim Byt() As Byte, bHwnd As Long, bSize As Long
bHwnd = Me.hwnd
w1 = CStr(bHwnd) & "|" & Text2.Text '合并me.hwnd到发送的字符串首位
Byt = StrConv(w1, vbFromUnicode) '直接转换成字节数组
bSize = UBound(Byt) + 1
cds.dwData = 3
cds.cbData = bSize
cds.lpData = VarPtr(Byt(0))
i = SendMessage(CLng(Text1.Text), WM_COPYDATA, bSize, cds) 'Me.hwnd
Lab.Caption = bSize ' IIf(i > 0, "发送成功!", "发送失败了")
End Sub
Private Sub Form_Load()
On Error Resume Next
Me.Caption = Me.hwnd
gHW = Me.hwnd
Hook
End Sub
Private Sub Form_Unload(Cancel As Integer)
Unhook
End Sub
Sub Main()
Dim abc As STRC_A = New STRC_A
abc.strA = "A___"
abc.strB = Space(4)
abc.strC = "B___"
abc.buff.strBuff = "123"
Console.WriteLine(abc.Text)
Console.Read()
End Sub