跨进程图形设备问题
这段时间我在弄一个程序,需要跨进程操作图形设备,但出现了些问题
程序A,用GDI创建了一个设备
如:
- VB code
...mvarhDC = CreateCompatibleDC(mvarWindowhDC)...
然后将这个设备句柄发送给程序B,程序B收到句柄后,向程序A画图
- VB code
...BitBlt PA_hDC, 0, 0, 640, 480, Picture1.hdc, 0, 0, vbSrcCopy...
结果失败
我也尝试过发位图句柄给程序B操作:
- VB code
SetBitmapBits PA_hBitmap,BitmapSize,BMPBytes(0)
但结果一样失败
后来发现跨进程后好像无法直接操作别称程序设备,在窗口中尝试GetWindowsDC,
发现每一次的设备句柄都不一样,但是可以操作,但是像我这样没有窗口句柄,
自己建立的设备该如何给其他的进程控制他呢?
有几点说明清楚,我建立的设备的稳定性是可以保证的,另外一个进程收到的句柄
值内容也是与我创建的设备相同的,需要绘制的图形设备也是绝对可以采集到图像
的。所有程序在单个进程中是没问题的,但是分成两个进程后就出现了问题。
[解决办法]
GetWindowsDC本来就是每一次的设备句柄都不一样的:)
[解决办法]
友情Up............
[解决办法]
过来占座位学习的,勿扰~~
[解决办法]
顶
[解决办法]
与窗口句柄不同的是,DC的作用域为进程,如果需要跨进程使用DC,可以考虑以下思路:
一、使用线程注入的方式,让另一个进程的某个代码段成为目标进程的线程,这样一来,该线程就可以访问目标线程的DC等私有句柄。
二、不中进程共享DC,而是跨进程共享DC中的位图内存,比如使用无文件内存映射方式,两个进程分别创建自己的DC,然后一个进程先把共享内存选入为DC的绘图位图,并绘制显示结果,再取消位图选择,发送一个消息到另一个进程,由另一个进程把共享内存选入为绘图位图,最后显示结果。
三、如果显示结果针对具体窗口,可以将DC与窗口结合起来,即设置CS_OWNDC风格,用API创建创建窗口,另一个进程使用HOOK技术拦截窗口消息处理,再使用GetWindowDC获得窗口的绘图DC,这样两个进程的绘制结果均针对同一个窗口,即达到共享目的。
四、暂时还没想起来...
[解决办法]
up
操作同一个DC不行,操作同一片内存未知是否可行.
[解决办法]
这种hdc肯定不能进行跨进程操作
getwindowdc/getdc 得到的句柄变化的问题,可以通过指定窗口类使用独立绘图区的常数解决,就象vb的hasDC属性一样,保持 true, hdc就不变化了
其实有稍好一点的办法,也同样涉及到跨进程内存读写,利用位图结构
程序B: (发送端)
创建hdc,绘图, 绘图完毕后,get绘图数据,得到hdc的位图数据内容,得到的将是一个位图结构
发送自定义消息 WM_DrawProjectImage(位图结构地址),结构总长度
程序A: (源)
取到自定义消息 WM_DrawProjectImage 程序B.数据地址
readprocessmemory 程序B.位图结构地址,结构总长度,xxx
gdi位图绘图api,setdibxxx完成绘图
[解决办法]
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶