~~~~~~~~~~~~~~~~`如何像外挂那样在DirectX游戏屏幕上绘制自己的文字?~~~~~~~~~~~~~ 只要先解决在DirectDraw上写字就可以了,D3D的暂时不考虑UP有分,解决问题者单独开帖送200分 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ok,搞定了;用线程来画到directShow目标上,已经成功到QQ 堂游戏上绘制时间并显示出来;unit thread_show;interfaceuses classes, Windows, Sysutils, graphics;type TShowThread = class(TThread) private g_handle: thandle; g_dc: hdc; m_hand: thandle; m_dc: hdc; isEnd: boolean; function GetNow(): string; procedure Show(); procedure showALL(ACanvas: Tcanvas); protected procedure Execute; override; public procedure StartThread; procedure EndThread; end;implementation{ TShowThread }procedure TShowThread.EndThread;begin releasedc(m_hand, m_dc); isEnd := true;end;procedure TShowThread.Execute;begin while not isEnd do Synchronize(show);end;function TShowThread.GetNow: string;var SystemTime : TSystemTime;begin GetLocalTime(SystemTime); with SystemTime do result := format('时间:%d:%d:%d ', [wHour, wMinute, wSecond]);end;procedure TShowThread.Show;var tmpcanvas : tcanvas;begin g_handle := findwindow('QQTangWinClass', nil); //qq堂游戏窗体类名 g_dc := getdc(g_handle); tmpcanvas := tcanvas.Create; tmpcanvas.Handle := g_dc; SetBKMode(tmpcanvas.Handle, TRANSPARENT); showALL(tmpcanvas); tmpcanvas.Free; deletedc(g_dc);end;procedure TShowThread.showALL(ACanvas: Tcanvas);begin ACanvas.Font.Size := 8; ACanvas.Font.Style := [fsBold]; ACanvas.Font.Color := clAqua; ACanvas.textout(0, 0, getnow);end;procedure TShowThread.StartThread;begin m_hand := findwindow('QQTangWinClass', nil); //qq堂游戏窗体类名 m_dc := getdc(m_hand); isEnd := false;end;end. 应该是;用线程来画到directdraw目标上,最近directshow词汇出现次数太多,在搞视频聊天程序;打错了... 谢谢S.F如果游戏用DirectX的Flip翻页,用你的方法会出现闪烁我想Hook Flip函数,可是flip是DirectXDraw接口的一个方法 不能用普通办法HOOK 或者我不知道怎么Hook它如果没有更好的办法出现就用你的了欢迎大家继续 不知道你要到什么程序上输出?看看内挂得文章,希望有帮助于你http://www.oioj.net/blog/user2/16215/archives/2005/108852.shtml 通过研究 delphix 对directdraw得封装发现,ddraw 绘制文字实际式通过gdi 实现得;如下:constructor TDirectDrawSurfaceCanvas.Create(ASurface: TDirectDrawSurface);begin inherited Create; FSurface := ASurface;end;destructor TDirectDrawSurfaceCanvas.Destroy;begin Release; FSurface.FCanvas := nil; inherited Destroy;end;procedure TDirectDrawSurfaceCanvas.CreateHandle;begin FSurface.DXResult := FSurface.ISurface.GetDC(FDC); if FSurface.DXResult=DD_OK then Handle := FDC; //surfaceCanvas 继承于TCanvas ,这里式获取dc handle end;procedure TDirectDrawSurfaceCanvas.Release;begin if (FSurface.IDDSurface<>nil) and (FDC<>0) then begin Handle := 0; FSurface.IDDSurface.ReleaseDC(FDC); FDC := 0; end;end;我想,你可以通过hook gdi api 实现。 先试试hook gdi api吧至于那个内挂的文章,晕,全是汇编,晕~~~~~~~~~~~~~~` 请S.F.(chinasf.cnblogs.com) 到这里领分:http://community.csdn.net/Expert/TopicView.asp?id=4284653HOOK GDI函数可以,目前存在问题是DLL一卸载,主程序就异常退出了莫名其妙呵呵 解决问题的根本还是得HOOK flip函数,以后再说吧 MDI系统子窗体最大化时充满主窗体的客户区 两个问题?1.关于combobox的及... 在何监视公司邮件及上网记录?? 访问oracle数据库时建立主从表的问题? 文件时间 sos:dbgrideh加上footers汇总行后,汇总值及记录数值均为0? 在安装一个IMAGE控件时,提示“找不到文件DsgnIntf.dcu”文件,请问怎么解决。、 ~~~~~~~~~明天拿房了,放分~~~~~~~~~ 请教,如何直接操作并口打印机,而无需经过驱动程序?最好有例子 请问一个问题 如何实现一次性读取? 关于clientdataset的奇怪问题
uses classes, Windows, Sysutils, graphics;type
TShowThread = class(TThread)
private
g_handle: thandle;
g_dc: hdc;
m_hand: thandle;
m_dc: hdc;
isEnd: boolean;
function GetNow(): string;
procedure Show();
procedure showALL(ACanvas: Tcanvas);
protected
procedure Execute; override;
public
procedure StartThread;
procedure EndThread;
end;
implementation{ TShowThread }procedure TShowThread.EndThread;
begin
releasedc(m_hand, m_dc);
isEnd := true;
end;procedure TShowThread.Execute;
begin
while not isEnd do
Synchronize(show);
end;function TShowThread.GetNow: string;
var
SystemTime : TSystemTime;
begin
GetLocalTime(SystemTime);
with SystemTime do
result := format('时间:%d:%d:%d ', [wHour, wMinute, wSecond]);
end;procedure TShowThread.Show;
var
tmpcanvas : tcanvas;
begin
g_handle := findwindow('QQTangWinClass', nil); //qq堂游戏窗体类名
g_dc := getdc(g_handle);
tmpcanvas := tcanvas.Create;
tmpcanvas.Handle := g_dc;
SetBKMode(tmpcanvas.Handle, TRANSPARENT); showALL(tmpcanvas); tmpcanvas.Free;
deletedc(g_dc);
end;procedure TShowThread.showALL(ACanvas: Tcanvas);
begin
ACanvas.Font.Size := 8;
ACanvas.Font.Style := [fsBold];
ACanvas.Font.Color := clAqua;
ACanvas.textout(0, 0, getnow);
end;procedure TShowThread.StartThread;
begin
m_hand := findwindow('QQTangWinClass', nil); //qq堂游戏窗体类名
m_dc := getdc(m_hand);
isEnd := false;
end;end.
如果游戏用DirectX的Flip翻页,用你的方法会出现闪烁我想Hook Flip函数,可是flip是DirectXDraw接口的一个方法 不能用普通办法HOOK 或者我不知道怎么Hook它如果没有更好的办法出现就用你的了欢迎大家继续
http://www.oioj.net/blog/user2/16215/archives/2005/108852.shtml
如下:
constructor TDirectDrawSurfaceCanvas.Create(ASurface: TDirectDrawSurface);
begin
inherited Create;
FSurface := ASurface;
end;destructor TDirectDrawSurfaceCanvas.Destroy;
begin
Release;
FSurface.FCanvas := nil;
inherited Destroy;
end;procedure TDirectDrawSurfaceCanvas.CreateHandle;
begin
FSurface.DXResult := FSurface.ISurface.GetDC(FDC);
if FSurface.DXResult=DD_OK then
Handle := FDC; //surfaceCanvas 继承于TCanvas ,这里式获取dc handle
end;procedure TDirectDrawSurfaceCanvas.Release;
begin
if (FSurface.IDDSurface<>nil) and (FDC<>0) then
begin
Handle := 0;
FSurface.IDDSurface.ReleaseDC(FDC);
FDC := 0;
end;
end;我想,你可以通过hook gdi api 实现。
至于那个内挂的文章,晕,全是汇编,晕~~~~~~~~~~~~~~`
http://community.csdn.net/Expert/TopicView.asp?id=4284653HOOK GDI函数可以,目前存在问题是DLL一卸载,主程序就异常退出了莫名其妙
呵呵 解决问题的根本还是得HOOK flip函数,以后再说吧