hook处理消息(200)

  • 主题发起人 主题发起人 diskfox
  • 开始时间 开始时间
D

diskfox

Unregistered / Unconfirmed
GUEST, unregistred user!
windows 是消息处理机制的。做什么都有一个消息,现在写一个hook让他取的所有程序运行的消息,在windows还没处理这个创建窗体时我们自已的hook先处理这个消息。按我们自已的判断让他是运行还是不运行。如果我们选确定就让他把消息放过。如果选取消就不运行这个程序。在把他的程序的路径和自身名称提示给用户。最好能把他完成 给点提示或给点hook处理创建消息的文章
 
不是做什么都有消息的。要已经创建了的窗体才有消息,所以你的想法不成立。
 
白河愁可能是你说错了吧。一个程序要创建出来。他就会向windows 发送一个创建的消息(表达的不好,不可以说是创建)。当windows收到了他才会把程序给运行启来。
 
钩子dllvar hHook: Integer; ProcSaveExit: Pointer;function HookProc(Code: Integer; wParam: wParam; lParam: lParam): LRESULT; stdcall;begin if Code >= 0 then if wParam = WM_CREATE then if 不是我要的窗口,由lparam取得窗口信息判断 then begin Result := 100; SendMessage(对方句柄, WM_CREATE, 0, 0); PostMessage(对方句柄, WM_CLOST, 0, 0); Exit; end; Result := CallNextHookEx(hHook, Code, wParam, lParam);end;function SetHook: Boolean; stdcall; export;begin hHook := SetwindowsHookEx(WH_CALLWNDPROC, HookProc, HInstance, 0);//或者用WH_GETMESSAGE钩子 Result := hHook <> 0;end;procedure UnHook; stdcall; export;begin if hHook <> 0 then UnHookWindowsHookEx(hHook);end;procedure KeyHookExit; far;begin if hHook <> 0 then UnHook; ExitProc := ProcSaveExit;end;exports SetHook, UnHook;begin ProcSaveExit := ExitProc; ExitProc := @KeyHookExit;end.
 
我同意“不是做什么都有消息”的观点,但窗口创建倒确实可以获得,只不过不是上面截获“WM_CREATE”的方法,在 Windows 发出“WM_CREATE”的时候,窗口已经创建了,这个情况在很多介绍 Windows 编程的书上都说明的,上面的代码也确实可能可以起到作用,但这时窗口已经有了。仔细检查各种各样的钩子,CBT可能是可以获得这样效果的最简单方法了,另外还有直接替换 Windows 系统函数的做法,也是很常用的。
 
呵呵看来是本人的说错误,呵呵新建文件夹这一些就没有事件会出来小雨哥能说清楚一点吗最好能给出实例
 
叶不归,如果按你所说的哪就像小雨哥说的一样了程序都运行起来了这样就没意义了要的是他还没运行起来就要判断
 
此话差矣,没有实践,怎么能说没有意义下面的网址是别人的实践,大概就是说WM_CREATE是在窗体真正创建之前可以拦截你自己看看,实际效果如何,你自己试试http://topic.csdn.net/u/20070723/02/a7bb4ef9-f6db-43ab-98cb-0dc84aa183f8.html
 
还是非常谢谢你如此热心回答呵呵
 
叶不归能不能把你所发的写完整来啊 if 不是我要的窗口,由lparam取得窗口信息判断 then begin Result := 100; SendMessage(对方句柄, WM_CREATE, 0, 0); PostMessage(对方句柄, WM_CLOST, 0, 0); Exit;我要的是能挂所有程序每有程序运行都要提示如果要得到他们的句柄不就是等于他们先运行起来了吗。如果他们还没运行起来。WINDOWS如何给他们分析句柄实例了
 
唉,实在不信的话,你不 uses froms 写个程序就知道了。
 
白河愁兄弟不知你所说的不信是说我说消息的还是说叶不归兄弟的啊叶不归兄弟的我测试了是可以得到所有程序的创建信息。但也会像小雨哥所说的已经创建出来了的现像。
 
反正,没窗体,没消息。
 
var hHook: Integer; ProcSaveExit: Pointer;function HookProc(Code: Integer; wParam: wParam; lParam: lParam): LRESULT; stdcall;begin Result := CallNextHookEx(hHook, Code, wParam, lParam); if Code = HC_ACTION then if PCWPStruct(lParam)^.message = WM_CREATE then begin //关闭主窗体caption为Form1的程序 if PCREATESTRUCT(PCWPStruct(lParam)^.lParam)^.lpszName = 'Form1' then PostMessage(PCWPStruct(lParam)^.hwnd, WM_CLOSE, 0, 0); Result := 0; end;end;function SetHook: Boolean; stdcall; export;begin hHook := SetwindowsHookEx(WH_CALLWNDPROC, HookProc, HInstance, 0); Result := hHook <> 0;end;procedure UnHook; stdcall; export;begin if hHook <> 0 then UnHookWindowsHookEx(hHook);end;procedure KeyHookExit; far;begin if hHook <> 0 then UnHook; ExitProc := ProcSaveExit;end;exports SetHook, UnHook;begin ProcSaveExit := ExitProc; ExitProc := @KeyHookExit;end.对方写在create中的事件还是会执行的,上面程序在它创建之后马上post了关闭消息,将其关闭,唉,你就将就着用吧。
 
其实,应用程序创建时,有一个默认不显示的主窗体,你看到的和创建的都只是子窗体面以.当你创建了一个应用程序,DELPHI就以经创建了一个隐藏的窗体.-------
 
白河愁反正,没窗体,没消息。 但是按微软上面好像也有说到窗体创建的过程。也是把窗体要创建的消息发送给系统处理系统处理了才把他真真的创建出来
 
还是非常谢谢叶不归兄弟的回答但是你给出的不是我想要的你这样就等于把窗体创建出来在马上把他关闭掉了这失去了我想的我是要他在发送创建消息时,把这个消息取出来。在由我们自已来判断是否要创建这个窗体如果要就把他这个创建消息放过去让WINDOWS处理。如果不要就把这个消息给Free了。白河愁兄弟可能我没说错。WINDOWS在还没创建完窗体时是有一个消息的。他创建时是要向WINDOWS发送一个创消息他才来创建的
 
感觉:1.窗体在创建之后是一定会通知操作系统的,正如叶不归与小雨综合起来所描述的情况。2.窗体在创建之前会不会有“启示性”消息,预先通知操作系统呢?这个问题似乎不好说,应该会实现有一个触发消息,但种类会很多,比如鼠标的单击与双击、定时器等,之后就调用系统创建窗体或进程的api,这时我觉得系统没必要产生消息。
 
在windows编程的书中大多都有说到窗体的创建所以说创建一个窗体是有消息的。所以希望大家能帮我完善
 
后退
顶部