首页 » PHP教程 » sendmessage与php技巧_关于SendMessage函数

sendmessage与php技巧_关于SendMessage函数

访客 2024-12-14 0

扫一扫用手机浏览

文章目录 [+]

然而,如果一个线程将发送给其它线程创建的窗口,SendMessage会繁芜很多。
Windows会哀求创建窗口线程处理。
因此调用SendMessage不一定会成功。
由于我们发送有关的数据不在其它线程中,不过你的会追加到被调用线程窗口的行列步队中。
可能有时你用SendMessage向其它程序成功的发送过的履历。
对我也有过。
由于成功了,以是就没深入一点研究过。

现在用SendMessage修正我我正在编辑文本的记事本的窗口标题

sendmessage与php技巧_关于SendMessage函数

Dim strTitle as String

sendmessage与php技巧_关于SendMessage函数
(图片来自网络侵删)

strTitle=\公众How are you\"大众

Call SendMessage(FindWindow(\公众Notepad\"大众,\公众text.txt - Notepad\"大众),WM_SETTEXT,0,strTitle)

咦成功了,stTitle不是在自己的进程空间吗?记事本程序怎么能访问我的地址空间呢?答案是当调用SendMessage时,该函数中的代码要检讨是事发送一个WM_SETTEXT。
如果是,它将地址空间中以0结尾的字符串放到一个内存映射文件中。
该内存映射文件将被其它进程所共享。
然后它将发送到其它进程的线程。
当接管线程准备好处理WM_SETTEXT时,它确定包含新窗口标题副本的,被共享的内存映射文件在其自己的的地址的空间位置。
不过大多数不须要这样的处理,只有在进程间发送数据才这样。

那是不是进程间发送都会这样建立一个共享的内存映射文件呢,答案是否定的。
尤其是在自己定义的时。
这个时候怎么办呢?一种方法是用WM_COPYDATA,一种方法可以用ReadProcessMemory和WriteProcessMemory函数从其它进程读取数据和写入数据

WM_COPYDATA是一个分外的同进它与一个分外的构造体一起利用。
来看看这个构造体的形式

Public Type COPYDATASTRUCT

dwData As Long

cbData As Long

lpData As Long

End Type

个中cbData 成员指定了你想要发送给其它进程的字节数,lpData指定要发送的数据的第一个字节地址,dwData成员留给自己用。
当SendMessage 看到正在发送的的WM_COPYDATA时,它创建一个大小为cbData字节的内存映射文件,并且将数据从你的地址空间复制到该内存映射文件中,然后将发送到目标窗口,当接管窗口处理该时,lParam参数指向一个存在于吸收进程地空间的COPYDATASTRUCT构造。
该当构造的lpData成员指向吸收进程的地址空间中的共享内存。

现在我们谈论第二种方法,这种方法紧张是在其它进程中开避一段内存区域,怎么开避就要用到VirtualAllocEx这个函数了.现在我们用一个实例解释一下,在运行中输入msconfig 打开我们的配置,选择启动项选项卡看看有些什么启动项,现在我就要让全部启动项不不钩选上。

pHandle = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, ProcessID)

'先在远程进程等分配内存

pMyItemMemory = VirtualAllocEx(pHandle, 0, Len(myItem), MEM_COMMIT, PAGE_READWRITE)

'做好读取和改变ListView中Item项目属性的事情

myItem.Mask = LVIF_STATE

myItem.iItem = pRow

myItem.StateMask = -1

'把属性写入远程进程

Result = WriteProcessMemory(pHandle, pMyItemMemory, myItem, Len(myItem), szInByte)

'向远程进程发送

retValue = SendMessage(hWindow, LVM_GETITEM, 0, ByVal pMyItemMemory)

'把读取的远程进程写入本地缓冲区

Result = ReadProcessMemory(pHandle, pMyItemMemory, myItem, Len(myItem), szOutByte)

'修正读取后的信息

myItem.State = (myItem.State And (Not LVIS_STATEIMAGEMASK)) Or &H1000

'把读取后的信息写入远程进程

Result = WriteProcessMemory(pHandle, pMyItemMemory, myItem, Len(myItem), szInByte)

'向远程进程发送

Result = SendMessage(hWindow, LVM_SETITEM, 0, ByVal pMyItemMemory)

'开释分配的远程内存

Result = VirtualFreeEx(pHandle, pMyItemMemory, 0, MEM_RELEASE)

Result = CloseHandle(pHandle)

相关文章

php反射类注释技巧_php反射机制用法详解

面向工具编程中工具被授予了自省的能力,而这个自省的过程便是反射。反射,直不雅观理解便是根据到达地找到出发地和来源。比如,一个光秃秃...

PHP教程 2024-12-15 阅读0 评论0