请高手进来,图形上显示字体的问题。(100分)

  • 主题发起人 主题发起人 dyzgd
  • 开始时间 开始时间
D

dyzgd

Unregistered / Unconfirmed
GUEST, unregistred user!
如果哪位大侠能够在传奇游戏的画面的左上角显示出‘text'这几个字的话,本人愿500分相送。
 
我没有传奇,这个程序拿去试一下,如果能用,只要100分。
procedure TForm1.Timer1Timer(Sender: TObject);
var
H:HWND;
dc:HDC;
Canvas:TCanvas;
begin
H:=GetForegroundWindow;
dc:=GetWindowDC(H);
Canvas:=TCanvas.Create;
Canvas.Handle:=dc;
Canvas.Brush.Style:=bsClear;
Canvas.Font.Size:=30;
Canvas.Font.Color:=clRed;
Canvas.TextOut(0,0,'text');
ReleaseDC(H,dc);
Canvas.Free;
end;
 
做得到吗?所有当前的显示,都占用显卡内存的当前显示页,如果使用独占模式,连剪切
都做不了,还有 blt 或翻页时的同步问题。唯一或许可以花点脑筋的,就是改它内部资源,
让它作为程序自己的东西,能否做到就不知道了。胡说八道,请见谅。
 
DarwinZhang 的代码居然可以在 DirectX 的程序中使用啊。测试星际争霸通过。
 
虽然可以显示,但我把时间设成1000,就会一闪一闪,时间改成小一些也有闪动感,用这种办法可能在实际使用中有问题。
 
to 小雨哥 兄:您的那几篇OpenGL的文章我看了,感觉不错!
只是我的显示卡不支持OpenGL [:(],
顺便问一句,我只用OpenGL画点和线会不会速度比GUI还慢?

to dyzgd: 是这样的,因为我们不知道其他程序(游戏)到底什么时候会刷新,
而其他程序一刷新就会将我们写上去的图形清除,
所以只能够用Timer来不停的写,实际只要Interval只要设置成50
就可以使得肉眼不会产生难受的感觉。
而这时系统的开销是很小的,因为只写数量不多的图形。
在实际使用中我没有遇到这个办法有什么不妥的。
 
TO:DarwinZhang 兄:
那个帖子你也看了,呵呵,非常感谢。3D 上 OGL 总体比 DX 方便,DX 用立即模式几乎
就赶上 OGL 了,总还是没赶上,不过 DX 还有个保留模式,方便应用级设计。画点线绝对
是 GDI 又快又好,不行还有 GDI + 啊。 :-)
TO:dyzgd
我要说的 DarwinZhang 兄已经说了,应该就是这样了。
 
不行啊,我都设成5了也不行,在帝国,传奇,极品飞车,红警等等几个游戏里都一样,闪的太历害了,有时根本看不清是什么字,我用的是XP。
 
是吗?我在媒体播放器里用得好好的.也许游戏和媒体播放器机制不一样,你再看看这个程序:
procedure TForm1.Button1Click(Sender: TObject);
var
H:HWND;
dc:HDC;
Canvas:TCanvas;
begin
While Tag=0 do
begin
H:=GetForegroundWindow;
dc:=GetWindowDC(H);
Canvas:=TCanvas.Create;
Canvas.Handle:=dc;
Canvas.Brush.Style:=bsClear;
Canvas.Font.Size:=30;
Canvas.Font.Color:=clRed;
Canvas.Lock;
Canvas.TextOut(0,0,'text');
Canvas.Unlock;
ReleaseDC(H,dc);
Canvas.Free;
Application.ProcessMessages;
end;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
Tag:=1;
end;
 
还是不行,只是比以前好一点点而已。我想可能要用其他的函数了。
 
我没有游戏可以实验[:(],
没办法.....
 
传奇客户端本身能实现在任意位置显示文字
很多外挂也能做到,而且很平滑,看不出抖动

猜想是不是拦截游戏本身的汉字输出函数实现(类似textout之类的函数?参数为:x,y位置、输出内容)
因为现在所有传奇外挂都是hook winsock函数实现拦截数据包取得/修改所需要数据实现其强大功能的。
 
应不是,肯定是用其他方法实现的,请有这方面经验的朋友给个方法。
 
比较耗
资源
 
就没有高手来回答这个问题吗
 
先生成一个DLL
-------------------------------------------------------------------------------------
library HookKeyboard;

uses
SysUtils,
Classes,
Windows,
Forms,Graphics;

{$R *.res}
const
MyHookAtom='DarwinZhang_KBH_Atom';
var
HHK:HHook=0;
Form:TForm;
FormHandle,IDEvent:DWord;

//定时器函数
procedure MyTimer(hwnd:HWND; umsg,idevent:DWord; dwTime:DWord); stdcall;
const
DisplayText='text'; //欲显示的内容
var
dc:HDC;
Canvas:TCanvas;
begin
if GetForeGroundWindow=Hwnd then exit;
SetForeGroundWindow(Hwnd);
dc:=GetWindowDC(Hwnd);
Canvas:=TCanvas.Create;
Canvas.Handle:=dc;
Canvas.Font.Color:=clRed;
Canvas.TextOut(0,0,DisplayText); //显示文字
ReleaseDC(Hwnd,dc);
Canvas.Free;
end;

//键盘钩子
function MyKeyboardHook(ncode:Integer; wparam:WParam; lparam:LParam ):LResult; stdcall;
begin
result:=0;
if ncode<0 then begin
CallNextHookEx(HHK,ncode,wparam,lparam);
Exit;
end;
if (lparam shr 31=0) or (wparam<>VK_F11) then exit; //F12键按下

if FindAtom(MyHookAtom)<>0 then exit; //只允许进入一次
AddAtom(MyHookAtom);

Form:=TForm.CreateParented(0);
with Form do begin
BorderStyle:=bsNone;
Width:=80; Height:=20;
Show;
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOMOVE or SWP_NOSIZE or SWP_NoACTIVATE);
FormHandle:=Form.Handle;
//万一不行用下面一句
// IDEvent:=SetTimer(FormHandle,FormHandle,200,@MyTimer);
end;
end;

//设置键盘钩子
function SetKeyboardHook:LongBool; stdcall;
begin
if HHK=0 then
HHK:=SetWindowsHookEx(WH_KEYBOARD,@MyKeyboardHook,Hinstance,0);
Result:=HHK<>0;
end;
//撤销键盘钩子
procedure UnHookKeyBoardHook; stdcall;
begin
if HHK=0 then exit;
UnHookWindowsHookEx(HHK);
HHK:=0;
DeleteAtom(FindAtom(MyHookAtom));
KillTimer(FormHandle,IDEvent);
end;

exports
SetKeyBoardHook,
UnHookKeyBoardHook;

begin
end.

再调用
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
const KBDLLName='HookKeyboard.dll';

function SetKeyboardHook:LongBool; stdcall; external KBDLLName;
procedure UnHookKeyBoardHook; stdcall; external KBDLLName;

procedure TForm1.FormCreate(Sender: TObject);
begin
SetKeyboardHook;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnHookKeyBoardHook;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SetKeyboardHook;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
UnHookKeyBoardHook;
end;

end.


不晓得行不行,你试一下.记得用F11键激活。
 
你的方法是创建了form后在form上写出来的吧。这样就多了个后面筐,很难看得。
 
没人了??
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
637
import
I
I
回复
0
查看
612
import
I
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部