我需要在桌面发生变化时,对桌面抓图,但是,始终找不到系统重画的消息!
我尝试 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 ;
我尝试 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 ;
HWND GetDesktopWindow(VOID);得到桌面的 handle, Hook 它的
delphi 深度历险 一书 有说
这个也不是什么 系统级 的
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;
谢谢 aiirii
看看吧:http://blog.csdn.net/linzhengqun
找里面的钩子的文章,那几篇几乎是我的BLog里面最常用到的了。发了好多份Demo。
同1个DLL里面,我可以拦截到 键盘、鼠标的消息,但是就是这个 WM_PANINT 搞不定!!
我想,WM_PAINT是Send过去的,而不是Post过去的,所以,可能你的钩子类型有些问题,不要用GetMessage的,而用RetProc的,你看看我的文章吧。
随时?还是?不过,可能实现方法不同,它是子类化成 desktop 的窗口
但是大概翻了一下一本叫 delphi api参考 的书,我也重点看了下关于
钩子的类型,正好与 linzhengqun 的文章有点类似!跟WM_PAINT有点关联的似乎只有 WH_CALLWNDPROC 、WH_CALLWNDPROCRET ,
但是这2个钩子我也找不到WM_PAINT消息。网上很多关于WM_PAINT的帖子,但几乎都是基于应用程序中的VCL Controls
的回调函数处理,只有一些什么屏幕取词的帖子有点挨边,但是都讲的不细!
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 传输(可以广播、单播、甚至假的组播<不同端口>)
二、服务器端:
跟上面反方向处理!
根据小块编号,只修改局部变化的画面,其他没什么好说的!现在都准备好了,只差 抓图!!!???
而他实际是一个指向TMsg结构的指针。之前总是全文搜索delphibbs,很少用csdn的全文搜索,因为以前
csdn的全文搜索 大多数是空链接 !bs自己一下