关于窗口化一个全屏程序,有啥好的建议

yxwsbobo 2010-05-20 08:02:47
比如一个全屏游戏, 窗口化他,有什么好的建议想法啊? 比如自己弄一个窗口,然后把游戏放入自己的窗口中之类的,兼容性要好点
...全文
346 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yxwsbobo 2010-05-21
  • 打赏
  • 举报
回复
看来比想象的要复杂不少,等把3d程序设计学完之后再来解决这个问题吧
sunlin7 2010-05-20
  • 打赏
  • 举报
回复
如果它本身就只是GDI窗口的全屏程序,可以给这个窗口发送消息,控制大小。但如果是directX或者是OpenGl的全屏窗口,好像就没有那么简单了……使用dll注入技术,hook掉窗口创建函数,还要hook掉directx(opengl)的设备创建函数,并修改参数为窗口模式(比如hook DX3D的CreateDevice函数,将D3DPRESENT_PARAMETERS的Windowed参数修改为true).
sunlin7 2010-05-20
  • 打赏
  • 举报
回复
很多游戏本身就提供两种模式的切换,比如魔兽的是:
war3.exe -window
war3.exe -fullscreen

magic7004 2010-05-20
  • 打赏
  • 举报
回复
楼主的要求和虚拟机貌似差距比较大吧,虚拟机是虚拟的电脑,而不是虚拟的桌面。
康斯坦汀 2010-05-20
  • 打赏
  • 举报
回复
思路转换一下,类似VMWare那些虚拟机都可以全屏放到窗口的。
向立天 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yxwsbobo 的回复:]
引用 1 楼 xianglitian 的回复:

一般全屏游戏是要协调层级过去屏幕资源的
估计不能用简单的方法窗口话


这么说确实, 他可能直接使用屏幕的。。。



那如果虚拟一个屏幕复杂不? 比如虚拟机他肯定包含了游戏窗口化功能,这说明理论应该可以,看如何实现了
[/Quote]

具体的我不太清楚
读书时做的游戏都是全屏的
当时老师说窗口游戏比较麻烦
你可以下个DirectX的SDK
里面有例程是可以进行全屏和窗口切换的
不同的三维SDK这里的处理也不尽相同
OpenGL就方便一些
不过我知道的都是在程序内部转换
不知道通过第三方方法怎么实现
yxwsbobo 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xianglitian 的回复:]

一般全屏游戏是要协调层级过去屏幕资源的
估计不能用简单的方法窗口话
[/Quote]

这么说确实, 他可能直接使用屏幕的。。。



那如果虚拟一个屏幕复杂不? 比如虚拟机他肯定包含了游戏窗口化功能,这说明理论应该可以,看如何实现了
icefairy 2010-05-20
  • 打赏
  • 举报
回复
mark
向立天 2010-05-20
  • 打赏
  • 举报
回复
一般全屏游戏是要协调层级过去屏幕资源的
估计不能用简单的方法窗口话
jameshooo 2010-05-20
  • 打赏
  • 举报
回复
虚拟机首先虚拟的就是硬件,看起来当然是把全屏变成窗口了。

虚拟机是唯一通用的方法。全屏游戏是可以更改屏幕分辨率和位深的,窗口游戏就不行,一个桌面只能是一种分辨率和位深,所以切换是不行的。有些游戏既提供窗口类型也提供全屏类型,是因为它们内部执行了不同的处理流程,初始化设备的方式都不一样。
zhanshen2891 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lisunlin0 的回复:]
如果它本身就只是GDI窗口的全屏程序,可以给这个窗口发送消息,控制大小。但如果是directX或者是OpenGl的全屏窗口,好像就没有那么简单了……使用dll注入技术,hook掉窗口创建函数,还要hook掉directx(opengl)的设备创建函数,并修改参数为窗口模式(比如hook DX3D的CreateDevice函数,将D3DPRESENT_PARAMETERS的Windowed参数修改为……
[/Quote]

基于dx的3D程序是这样的,基于directdraw的是SetDisplayMode,你先调试一下看看是什么程序
尹成 2010-05-20
  • 打赏
  • 举报
回复
如果你是窗口别的游戏,则用ChangeDisplaySettings来改变屏幕的分辨率,不过你要有HOOK API的基础. 写一个DLL,注入游戏进程,HOOK API.但是游戏是一开始就要改变分辨率的,所以可以用createprocess调用游戏.其中用CREATE_SUSPENDED参数,然后注入DLL,HOOK ChangeDisplaySettings函数调用.简单点直接反回 DISP_CHANGE_SUCCESSFUL,使游戏认为分辨率改变成功.复杂点可以自已设置分辨率.
,最后用ResumeThread恢复进程.
尹成 2010-05-20
  • 打赏
  • 举报
回复
DXSDK8里的例子完整代码路径是\DXSDK8\samples\Multimedia\DirectDraw\SwitchScreenMode
切换模式时要重新调用 SetCooperativeLevel和SetDisplayMode
还有他们的绘图方式不一样,所以BACKBUFFER的结构不一样,也要重新创建,如果自己写底层的话可以让两种BACKBUFFER一样

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧