咋就不成功呢,发送了个DATACOPY消息(74#),不仅仅是lpdata.data没过来啊,消息根本就没过来。。咋个事?
解决方案 »
- 请问如何在PictureBox内画出菱形
- 关于库存管理问题?困惑多时了。
- 关于vb里的Msflexgrid控件的使用?想请教各位了,实在紧急!
- "保存"按钮的问题
- 如何关闭excel
- 请问 timer_time 是什么意思呀!
- 假如我用程序启动了一个word ,如何获得它的hWnd-窗口句柄
- 关于背景音乐,请高手们各抒己见。
- 急!!谁可以给我发个VB的小程序?比如象拼图、贪吃蛇之类的程序。100分奉送。
- 请问有 ORACLE 的错误码 文档吗?倾我所有300分。
- ado引用版本问题,引用时看到有2.0到2.8各个版本,有什么区别?该选择哪个?
- vb中如何操作webbrowser控件中的word的文字格式(急!!高分求助!!)
首先给对方申请一段内存,然后在首地址写上代码68 &hXXXXXXXX
68 0
68 7A
68 HANDLE
E8 SENDMESSAGE ADDRESS
C3
CC
00
……
其中&hXXXXXXXX是LPDATA数据的内存地址,LPDATA实际数据存放在申请的内存的后半部分。我咋觉得我写的没问题啊,查看申请的内存的内容反汇编确实也是上面的内容啊反顺序提供参数,非INTEGER类型使用指针,E8后面的相对地址计算……在测试其他API函数时,均没有问题,包括GETWINDOWTEXTA(W)等等啊
是不是这个……和消息循环有关啊
这段的代码是这样的:(.NET的代码) Public Structure COPYDATASTRUCT
Public WindowHwnd As Integer
Public size As Integer
<MarshalAs(UnmanagedType.LPStr)> _
Public lpData As String
Shared Function ToByres(ByVal c As COPYDATASTRUCT) As Byte()
Dim ret(c.size + 7) As Byte
Array.Copy(System.BitConverter.GetBytes(c.WindowHwnd), 0, ret, 0, 4)
Array.Copy(System.BitConverter.GetBytes(c.size), 0, ret, 4, 4)
Dim sb() As Byte = System.Text.Encoding.ASCII.GetBytes(c.lpData)
Array.Copy(sb, 0, ret, 8, sb.Length)
Return ret
End Function
End Structure
Const WM_COPYDATA As Integer = &H4A Dim send As RunRemoteAPI Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click send = New RunRemoteAPI(CInt(TextBox1.Text))
' Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Dim s(1023) As Byte Dim a As Integer = send.CallRemoteAPIByName("user32", "getwindowtextw", True, New mFuncParam(Me.Handle.ToInt32), New mFuncParam(s), New mFuncParam(1024)) MsgBox(System.Text.Encoding.Unicode.GetString(send.RemoteBytesFromIndex(1)))
Dim c As New COPYDATASTRUCT
c.WindowHwnd = Me.Handle.ToInt32
c.lpData = "1234567890"
c.size = c.lpData.Length Dim cb As Byte() = COPYDATASTRUCT.ToByres(c)
'Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long TextBox3.Text = Hex(send.CallRemoteAPIByName("User32", "SendMessageA", True, New mFuncParam(Me.Handle.ToInt32), New mFuncParam(WM_COPYDATA), New mFuncParam(0), New mFuncParam(cb)))
TextBox2.Text = Hex(send.BaseAddress) Debug.Print("ok") End Sub接收消息的是这样的: Protected Overrides Sub DefWndProc(ByRef m As System.Windows.Forms.Message)
Select Case m.Msg
Case WM_COPYDATA
Dim mystr As New COPYDATASTRUCT()
Dim mytype As Type = mystr.[GetType]()
mystr = DirectCast(m.GetLParam(mytype), COPYDATASTRUCT)
MsgBox(mystr.lpData)
Case Else
MyBase.DefWndProc(m)
End Select
End Sub根本就没反应…………消息没过来
1、使用&H40A等自定义消息,且不等待远线程退出,我的程序就能接受到消息……
2、使用&H40A等自定义消息,且等待远线程退出,那么我的程序就卡死在等待那里。
3、使用&h4A(WM_COPYDATA),等待远线程退出和不等待远线程退出,都不会接收到消息,而且等待函数立即返回……
就是给dll注入然后给远程进程的控件子类话,把消息发到本地过程处理的代码
不过用DLL搞的时候也发生了同样问题,在请教达人之后发现VC++.NET的代码没问题,最后还是定位在lpData参数声明上,在GOOGLE上千搜万索找到一个鸟语网站,受到点化……问题解决。
就是说LPSTR不是正道。。
感谢各位支持,散分。