我需要在桌面发生变化时,对桌面抓图,但是,始终找不到系统重画的消息!
我尝试 Hook  WH_CALLWNDPROC、WH_CALLWNDPROCRET、WH_GETMESSAGE:
  SetWindowsHookEx(WH_CALLWNDPROC , @OnPaintMessageHookHandler , Hinstance , 0)然后,检查消息:
function OnPaintMessageHookHandler(iCode: Integer;wParam: WPARAM;lParam: LPARAM): LRESULT; stdcall;
var HWndCalc:HWnd ;  cpw: CWPRETSTRUCT;
begin
   Result := 0;   {//1、检查不到
       cpw :=PCWPRETSTRUCT(lparam)^;
       if cpw.message = WM_PAINT then     //2、检查不到
       if lParam=(wm_paint) then  
   }
    //3、检查不到
   if icode=(wm_paint) then //or (wm_ncpaint) or (WM_ERASEBKGND) then
   begin
         HWndCalc:=Findwindow(nil,Pchar('FolderEncryption'));
         if HWndCalc<>0 then
         PostMessage(HWndCalc,1236,0,0);
   end ;
end ;

解决方案 »

  1.   

    >>我需要在桌面发生变化时,对桌面抓图
    HWND GetDesktopWindow(VOID);得到桌面的 handle, Hook 它的
    delphi 深度历险 一书 有说
    这个也不是什么 系统级 的
      

  2.   

    以下到底哪一个是我需要的??? 或者检查消息方法不对???
      WH_MIN = -1;  WH_MSGFILTER = -1;  WH_JOURNALRECORD = 0;  WH_JOURNALPLAYBACK = 1;  WH_KEYBOARD = 2;  WH_GETMESSAGE = 3;  WH_CALLWNDPROC = 4;  WH_CBT = 5;  WH_SYSMSGFILTER = 6;  WH_MOUSE = 7;  WH_HARDWARE = 8;  WH_DEBUG = 9;  WH_SHELL = 10;  WH_FOREGROUNDIDLE = 11;  WH_CALLWNDPROCRET = 12;  WH_MAX = 12;  WH_MINHOOK = WH_MIN;  WH_MAXHOOK = WH_MAX;
      

  3.   

    本来想去抄抄书的,结果跑到南山书城没有 delphi 深度历险 一书!!!看看其他方法!
    谢谢  aiirii
      

  4.   

    你得用DLL来写系统的钩子才行啊。
    看看吧:http://blog.csdn.net/linzhengqun
    找里面的钩子的文章,那几篇几乎是我的BLog里面最常用到的了。发了好多份Demo。
      

  5.   

    linzhengqun(风。我回来了) 对啊,没错,我是用了钩子!
    同1个DLL里面,我可以拦截到 键盘、鼠标的消息,但是就是这个 WM_PANINT 搞不定!!
      

  6.   

    delphi 深度历险 一书的程序例子我下载大概看了一下,似乎根本就不是我想要的,他有2个涉及桌面方面的程序例子,不过都是取桌面句丙,然后对桌面进行涂鸦、刷新,也可以引申到抓取图片,但是,都与 桌面的重画消息无关!
      

  7.   

    你先把那几篇文章看看,如有需要,我发Demo给你。
    我想,WM_PAINT是Send过去的,而不是Post过去的,所以,可能你的钩子类型有些问题,不要用GetMessage的,而用RetProc的,你看看我的文章吧。
      

  8.   

    >>都与 桌面的重画消息无关!奇怪,如果无关,那么是什么时候对: 对桌面进行涂鸦
    随时?还是?不过,可能实现方法不同,它是子类化成 desktop 的窗口
      

  9.   

    aiirii讲完之后,我立马跑到南山书城,没有 delphi 深度历险 一书,
    但是大概翻了一下一本叫 delphi api参考 的书,我也重点看了下关于
    钩子的类型,正好与 linzhengqun 的文章有点类似!跟WM_PAINT有点关联的似乎只有 WH_CALLWNDPROC 、WH_CALLWNDPROCRET ,
    但是这2个钩子我也找不到WM_PAINT消息。网上很多关于WM_PAINT的帖子,但几乎都是基于应用程序中的VCL Controls
    的回调函数处理,只有一些什么屏幕取词的帖子有点挨边,但是都讲的不细!
      

  10.   

    http://community.csdn.net/Expert/topic/4028/4028947.xml?temp=.8544428
      

  11.   

    我现在想做一个基于局域网的网络 监控 小软件,主要监视流程(以下不含控制):一、客户端:(每一个线程作以下每一个处理)
       A、抓图
          (有些人可能会在鼠标点击或键盘输入时触发抓图、也有人会
            加个定时器周期性的隔段时间抓图,但是,我觉得2种方法都不太合理,
            都有各自的缺陷,所以我还是想找WM_PAINT消息;        甚至有可能的话,只抓 桌面上有变化的区域;现在此法的实现对我有点
            难度, linzhengqun 的抓图文章也正好缺这个,不过,我也有其他处理方法
            弥补这个缺陷)   B、把图分割成若干块
            原因下面再讲;目前想把图片割成 4 X 3块,每一块1个编号   C、每一小块图片与上次的抓图 XOR 处理
            因为我只想压缩和传输变化了的小块图片
               发送方: 原图a  XOR  新图b    =>  有待传送的图c
               接受方: 原图a  XOR  c        =>  新图b   D、压缩有变化的图片(XOR的结果)
            采用RLE压缩算法;
            之所以把图片分成4 X 3小块,主要是考虑减少压缩时间、
            提高压缩效率、从而降低CPU的占用率和减少网络传输压力。   E、传送到服务器端
            直接使用API 实现 UDP 传输(可以广播、单播、甚至假的组播<不同端口>)
    二、服务器端:
            跟上面反方向处理!
            根据小块编号,只修改局部变化的画面,其他没什么好说的!现在都准备好了,只差 抓图!!!???
      

  12.   

    十分感谢 aiirii ,问题终于解决了!!!为什么那么多人把钩子的lparam当做CWPRETSTRUCT结构处理,
    而他实际是一个指向TMsg结构的指针。之前总是全文搜索delphibbs,很少用csdn的全文搜索,因为以前
    csdn的全文搜索 大多数是空链接 !bs自己一下