1000 分大放送!有关文字直接显示在屏幕上。(200分)

  • 主题发起人 主题发起人 evon
  • 开始时间 开始时间
E

evon

Unregistered / Unconfirmed
GUEST, unregistred user!
将一段文字直接显示在画面上。(不是在 form 上面)
在任何游戏中,也能正确显示无误。
具体想法是利用 Hook WM_Paint .....但在有些游戏就不行?
或者有其他的想法。

只要是能彻底解决问题并提供源程序。
1000分大把银子送到您眼前,绝对不黄牛。
 
>将一段文字直接显示在画面上
什么叫显示在画面上?你的意思是说要一直悬挂在所有窗口的前面吧?
先把文字做成图片,放在一个form上,再用API把这个form设置成
不规则的形状,这样的效果就是一段文字悬浮在屏幕上了
最后再把这个form设置成总在最前
不过也可以被游戏自己屏幕挡住
就我所知,在任何情况下都能永远悬挂在最前的窗口是没有的
 
StayOnTop的Form也解决不了问题,很多游戏用DirectDraw.
就我所知,这是可能的,我见过一款显卡,就在左下角贴着字.
起先以为是硬件实现的,可换了驱动程序后就没了
 
是要在屏幕上写字吗?
以前见过。找找看。
 
就是要在屏幕上写字!
我试过如果在 OnTimer Event 中加入
var
DC:HDC;
Str:String;
begin
DC:=GetDC(0);
Try
Str:='Hello';
Textout(Dc,1,1,Pchar(Str),Length(Str));
finally
ReleaseDC(0,DC);
end;
end;
But !...就是会不断闪烁

拜托!各路英雄好汉 多多帮忙
先谢了
 
windows下直接写屏怎么实现?
 
试试用Vxd?
 
在Delphi中有一个Screen对象,可把它当作一个画布直接在上面写字就可。
这时只要操纵画布对象(Canvas)就可以了。

有例如下,
*************************
完整的Delphi程序
***********************
procedure TForm1.Button1Click(Sender: TObject);
var //变量声明
FullscreenCanvas:TCanvas;
dc:HDC;
begin
DC := GetDC (0);
FullscreenCanvas := TCanvas.Create;
FullscreenCanvas.Handle := DC;
// Fullscreen.Canvas.CopyRect (Rect(0,0,screen.Width, screen.Height),fullscreenCanvas,Rect(0,0,Screen.Width,Screen.Height));
FullscreenCanvas.CopyRect (Rect(0,0,Image1.Width, Image1.Height),Image1.Canvas,Rect(0,0,Image1.Width,Image1.Height));
FullscreenCanvas.Free;
ReleaseDC (0, DC);
end;
 
to 程云:
您的方法是行不通的。
在游戏中很可能,画完就马上被清除。
 
我觉的可以用directdraw来实现
 
天下之大,竟无解答之处。

...............^^6^^
 
直接写显存
 
估计是要写个显卡驱动程序了. ^_^

你说的那显卡驱动程序肯定是不管输出什么东西, 都在左下角加入logo,
然后整个图形作为bit流通过端口输出.

所以不会有闪烁和覆盖等问题了
 
屏幕也是一个DC,也就是Canvas,你以前在别的程序里如何实现写字、擦除的,现在同样
也可以这样作,没什么难度,也不至于搞得写显存什么的那么复杂。
 
游戏里面用dx
而dx直接写了显存区
 
程云的方法可行,若想不被刷新掉,先停止游戏,可能用DebugActiveProcess可以做到。
或者先运行你的程序做shell,接管所有的Windows消息,然后所有运行的程序都由你的程序用CreateProcess创建,
然后任何时候都可以debug了,就象soft-ICE(游戏下也可以弹出哦)。
 
热血兄说的有道理,cia 的方法不行,会闪烁的一塌糊涂。
cia 大概忘记了 soft-ice 有一个显示卡兼容表,不兼容的显示卡
根本不支持,想一想是因为什么。

其实干脆别想这个问题了,当初 Windows 编写的初衷就是“共享”,当然包括显示方面。
如果是游戏需要独占还可以理解,一般的应用程序确实没有必要。
 
我个人认为只有一个办法,就是用字幕卡叠加的方式(overlay).
硬件实现吧!
 
我的意见是:

1.采用Overlay的方法在某些显示卡下和某些游戏下是可行的.如果显示卡不支持
或者某些游戏设置了独占模式,就不行了.
2.在上面的方法失败后,可以采用截获API的方法,一般的函数是GDI中的函数,但由于
目前的游戏几乎全部使用了DX,因此需要截获DX中的函数,如Blt,BltFast,等等.
这种方法成功率几乎100%,但如果某些游戏使用的是软件写屏幕,即获得显存指针
后,直接使用内存拷贝的方法,就不行了.
3.如果还想干,试试将显存地址设置为只读,并且截获写非法异常.我没有试过,
可能这种方法是瞎捭.

 

Similar threads

D
回复
0
查看
937
DelphiTeacher的专栏
D
D
回复
0
查看
892
DelphiTeacher的专栏
D
D
回复
0
查看
864
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部