1、如何在不知道窗口标题的情况下得到外部程序的句柄?
2、如果是MDI窗体的话,主窗体和子窗体是不是有不同的句柄啊?这样的话用getwindowrect得到的就是每一个具体的窗体的范围吧,如何得到整个外部应用程序的范围呢?
3、如何监视外部程序界面的变动,当外部程序的窗体变动时,将外部程序的界面截图存储?以上最好给出示例代码,分数我目前怎么给不了高分啊,我会加,现在我有8000多分,可是不让我给,郁闷,解决后我会猛加

解决方案 »

  1.   

    1、情况多啦。你可以从鼠标处得,可以通PID得,还可以从DC得多拉。
    2、模糊。但应该不是一个吧。用getwindowrect就自然是这个窗口的坐标啦;只要句柄指清楚是那个窗口就能得到那个窗口的坐标,不管是父还是子,问题应该在怎样得到这个窗口的句柄。
    3。更模糊。你要监视拦截那个外部程序的一些消息。……!!
      

  2.   

    楼上可否说的详细些?
    其实我是想做一个给远程做程序演示的东西,比如:我现在给远程的计算机演示word,首先我要找到word 的句柄,因为我只想剪切word的图,但是word的标题我很难确定下来,用findwindow可能够戗;找到句柄后我就能够找到其rect,然后copyrect,但是我又不想用计时器实时去切屏,那样效率可能很低,所以我想跟踪word的界面变化,当界面变化时再切图;切图后跟上一个切图对比,将不同部分的图片压缩后传递给远程的计算机;远程的计算机有一个接受程序,收到消息后自动解压在相应的地方显示发送过来的图片。至于第二个问题,我担心演示MDI程序时,切图的范围会不准
    谢谢各位大侠们给点指点
      

  3.   

    呵呵,小虫来了!
    嘻嘻,同名的呀?不过楼主真不好意思,你的这一堆的问题
    现在真的是没有时间去帮你调试了,在这里就胡说一点点吧:1、如何在不知道窗口标题的情况下得到外部程序的句柄?
      如果得不到标题,你可以通过句柄的方法来得到它,但因为句柄是WINDOWS动态创建的,所以呢,我以为这个办法并不是太可靠,我认为还是用标题的办法比较好
      就拿WORD来说,它的标题可能为“文档1- Mirosoft Word”,
      呵呵,每个文档的格式都差不多,而且MS的所有窗口都差不多,所以,你只要的准了关键词“Microsoft Word”就行了呀,你可以列举系统中的所有窗口,然后根据句柄得到标题,根据标题判断这个是不是WORD的窗口,如果是的话,你就要吧操作下一步了。。2、如果是MDI窗体的话,主窗体和子窗体是不是有不同的句柄啊?这样的话用getwindowrect得到的就是每一个具体的窗体的范围吧,如何得到整个外部应用程序的范围呢?
      如果想得到句柄是不是相同,我建议楼主用VC++6自带的工具SPY++去看一看窗口的句柄就可以得到结论了。。
      
    3、如何监视外部程序界面的变动,当外部程序的窗体变动时,将外部程序的界面截图存储?
      这个我以为最困难了,这就需要你用HOOK去监视系统有没有按键、鼠标事件发生,发生在哪个窗口上,如果有的话,那你就可以截图了,不过这样,你的系统8成会受不了的
      

  4.   

    呵呵,小虫来了!
    嘻嘻,同名的呀?不过楼主真不好意思,你的这一堆的问题
    现在真的是没有时间去帮你调试了,在这里就胡说一点点吧:1、如何在不知道窗口标题的情况下得到外部程序的句柄?
      如果得不到标题,你可以通过句柄的方法来得到它,但因为句柄是WINDOWS动态创建的,所以呢,我以为这个办法并不是太可靠,我认为还是用标题的办法比较好
      就拿WORD来说,它的标题可能为“文档1- Mirosoft Word”,
      呵呵,每个文档的格式都差不多,而且MS的所有窗口都差不多,所以,你只要的准了关键词“Microsoft Word”就行了呀,你可以列举系统中的所有窗口,然后根据句柄得到标题,根据标题判断这个是不是WORD的窗口,如果是的话,你就要吧操作下一步了。。2、如果是MDI窗体的话,主窗体和子窗体是不是有不同的句柄啊?这样的话用getwindowrect得到的就是每一个具体的窗体的范围吧,如何得到整个外部应用程序的范围呢?
      如果想得到句柄是不是相同,我建议楼主用VC++6自带的工具SPY++去看一看窗口的句柄就可以得到结论了。。
      
    3、如何监视外部程序界面的变动,当外部程序的窗体变动时,将外部程序的界面截图存储?
      这个我以为最困难了,这就需要你用HOOK去监视系统有没有按键、鼠标事件发生,发生在哪个窗口上,如果有的话,那你就可以截图了,不过这样,你的系统8成会受不了的
      

  5.   

    http://free1.ripplehost.com/~rh978/book/1/1/53.html上面一篇文章应该可以解决楼主的第一个问题还有,对第二个问题的补充,我想楼主可以把整个屏蔽截下来就行了吧,何必费这么多的事呢?而且WORD的MDI方式,你并不好找它的整个应用程序窗口呀!截屏的代码网上很多,就不需要我贴了吧。。
      

  6.   

    下面是一个得到鼠标下的窗口的句柄,
    鼠标移到什么上面就可得到什么的句柄
    希望能给你一些思路,
     procedure TForm1.GetAWnd(var Wnd: hWnd; var WClassName:string;
      var WndText:string; var WndOwner: hWnd);
    var
      classname:pchar;
      text:pchar;
      winPos:TPoint;
    begin
      GetCursorPos(winpos);
      Wnd:=WindowFromPoint(WinPos);
      GetMem(ClassName,225);为类名分配内存
      GetMem(Text,225);为文本文字分配内本
      GetClassName(Wnd, classname, 225);得到这鼠标下控件的类名,
      GetWindowText(Wnd, Text, 225);得到文本文字
      WndOwner:=GetWindow(Wnd,GW_Owner);
      wclassname:=string(classname);
      wndtext:=string(text);
      FreeMem(className,0);
      FreeMem(text,0);
    end;
    这只是一个过程,你可以相应改动就可达到你要的了
      

  7.   

    同名的小虫:能否将下面的给个例子,多谢1、如何在不知道窗口标题的情况下得到外部程序的句柄?
      如果得不到标题,你可以通过句柄的方法来得到它,但因为句柄是WINDOWS动态创建的,所以呢,我以为这个办法并不是太可靠,我认为还是用标题的办法比较好
      就拿WORD来说,它的标题可能为“文档1- Mirosoft Word”,
      呵呵,每个文档的格式都差不多,而且MS的所有窗口都差不多,所以,你只要的准了关键词“Microsoft Word”就行了呀,你可以列举系统中的所有窗口,然后根据句柄得到标题,根据标题判断这个是不是WORD的窗口,如果是的话,你就要吧操作下一步了。。
      

  8.   

    //贴上一段 代码, 注意了 一定要uses comobj 这个单元
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls,ComObj;type
      TForm1 = class(TForm)
        Button1: TButton;
        Label1: TLabel;
        Edit1: TEdit;
        procedure StartOrlinkToWord;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.StartOrlinkToWord;
    var
      V:Variant;
    begin
      try
        V:=GetActiveOleObject('Word.Basic');//与已打开的word 当前激活的文档 相关联
      except //如果word 还没有打开 或 没有当前激活的文档 则引发异常
        V:=CreateOleObject('Word.Basic'); // 打开word 
        v.filenew; //新建 文档
      end;
      v.AppShow; //显示word
     // v.filenew; 
      // 以下是对word 进行各种操作. 很多, 如下:
       V.Insert(edit1.text) ; //向word 追加数据.
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      StartOrLinkToWord;
    end;end.
      

  9.   

    可用鼠标hook监控鼠标点击事件,可设定双击鼠标右键保存鼠标所致的窗口。应该不难,网上有好多源程序。