只要先解决在DirectDraw上写字就可以了,D3D的暂时不考虑
UP有分,
解决问题者单独开帖送200分

解决方案 »

  1.   

    ok,搞定了;用线程来画到directShow目标上,已经成功到QQ 堂游戏上绘制时间并显示出来;unit thread_show;interface
    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.
      

  2.   

    应该是;用线程来画到directdraw目标上,最近directshow词汇出现次数太多,在搞视频聊天程序;打错了...
      

  3.   

    谢谢S.F
    如果游戏用DirectX的Flip翻页,用你的方法会出现闪烁我想Hook Flip函数,可是flip是DirectXDraw接口的一个方法 不能用普通办法HOOK 或者我不知道怎么Hook它如果没有更好的办法出现就用你的了欢迎大家继续
      

  4.   

    不知道你要到什么程序上输出?看看内挂得文章,希望有帮助于你
    http://www.oioj.net/blog/user2/16215/archives/2005/108852.shtml
      

  5.   

    通过研究 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 实现。
      

  6.   

    先试试hook gdi api吧
    至于那个内挂的文章,晕,全是汇编,晕~~~~~~~~~~~~~~`
      

  7.   

    请S.F.(chinasf.cnblogs.com) 到这里领分:
    http://community.csdn.net/Expert/TopicView.asp?id=4284653HOOK GDI函数可以,目前存在问题是DLL一卸载,主程序就异常退出了莫名其妙
    呵呵 解决问题的根本还是得HOOK flip函数,以后再说吧