请问:如何用Api监测系统新建了窗口(或进程)? ( 积分: 0 )

  • 主题发起人 主题发起人 chen_jin
  • 开始时间 开始时间
C

chen_jin

Unregistered / Unconfirmed
GUEST, unregistred user!
这个问题应该不难吧,我是新手,请指点,谢谢!
 
这个问题应该不难吧,我是新手,请指点,谢谢!
 
var<br> &nbsp;ProcessSnapShotHandle: THandle;<br> &nbsp;ProcessEntry: TProcessEntry32;<br> &nbsp;Ret: BOOL;<br> &nbsp;s: string;<br> &nbsp;ModuleSnapShotHandle: THandle;<br> &nbsp;ModuleEntry: TModuleEntry32;<br> &nbsp;i:integer;<br>begin<br> &nbsp; &nbsp;Result :=0;<br> &nbsp; &nbsp;ProcessSnapShotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);<br> &nbsp; &nbsp;if ProcessSnapShotHandle&gt;0 then<br> &nbsp; &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ProcessEntry.dwSize:=SizeOf(TProcessEntry32);<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Ret:=Process32First(ProcessSnapShotHandle, ProcessEntry);<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while Ret do<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ModuleSnapShotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessEntry.th32ProcessID);<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ModuleSnapShotHandle&gt;0 then<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // &nbsp;ModuleEntry.dwSize:=SizeOf(TModuleEntry32);<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // &nbsp;Ret:=Module32First(ModuleSnapShotHandle, ModuleEntry);<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ret:=Process32Next(ProcessSnapShotHandle, ProcessEntry) &nbsp;;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i:=i+1;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end;<br> &nbsp; &nbsp; &nbsp; &nbsp;CloseHandle(ProcessSnapShotHandle);<br> &nbsp; &nbsp; &nbsp; &nbsp;Result :=i;<br> &nbsp; &nbsp; end;<br><br><br>end;<br><br>返回值即为当前进程数.可以将当前返回的进程数与上一次调用函数获得的进程数比较,即可判断是否新建了进程.
 
首先感谢zfg886大侠的回答。<br>这个方法也可以,但如果跟前一次调用函数获得的进程数相比,什么时候调用呢?<br>如果是隔一段时间检查一次,是不是太浪费系统资源了?可否hook系统,在其新建窗口或建新进程时监测?<br>我是菜鸟,还请多关照,谢谢!
 
如果要监控指定的窗口是否建立,用个findwindow判断就可以了.但要遍历系统所有的窗口句柄,从而监控是否新建窗口,难度就更大了.<br>如果采用 HOOK API ,如何有效的截获createprocess这个函数也还得进一步测试.HOOK所有进程,显示占用资源更多.而且不利于程序稳定性,HOOK指定进程显然在这里根本用不上.<br><br>事实上我上面提供的代码并占用不了多少系统时间.
 
现在就是要监测指定的窗口,比如监测用户是否打开了“记事本”程序,用FindWindow,如何监测?不停的循环找这个窗口吗?<br>我想是不是应该从系统新建进程或窗口的时候再用FindWindow找是否有“记事本”窗口好一点,感觉不停的循环总不是太好!<br>但问题是,如何知道系统新建了进程或窗口呢?
 
我感觉你后面的有点自相矛盾了.你要等到系统新建进程或窗口的时候去检测系统是否新建了进程或窗口.这样就有点难以理解了.<br><br>再者,新建窗口和新建进程对系统来说完全是两码事.如果是新建窗口,因为建立窗口是一个过程,包含很多API,所以还是只能通过窗口句柄来判断窗口是否已经建立起来了.事实上一个定时器或者消息偱环是占用不了多少资源的.<br>当然,也许你的本意并非如此,以我估计,你可能是想在某个进程启动的前期就对这个进程进行某项处理吧.不然绝无必要对这么一点点系统资源如此惜吝,如果是我估计的这样,用编程的方法来解决,还是只有HOOK createprocess函数了.在启动初期就可以处理了.不过我在进行另外一种类似工作的时候,不是采用的编程方法来处理,而是通过反汇编直接对这个程序修改其入口处的代码.修改后一劳永逸.
 
拦截WM_CREATE消息
 
明白了,谢谢二位,对zfg886数次耐心解答表示感谢!<br>麻子兄大名早有耳闻,能得到你的指点荣幸之致!
 
后退
顶部