比如说,我的程序用 FindWindow 找到一个正在运行的窗口(非自身程序的,有可能是写字板、Word等),我需要拦截下对该窗口的关闭,让这个窗口无法关闭,只能由我的程序来控制它关闭?谢谢!

解决方案 »

  1.   

    基本的方法是通过FindWindow找到窗口,然后通过SetWindowLong设置窗口的消息处理函数,然后在函数中拦截wm_close消息。你可以参考下面的帖子:http://www.xtremevbtalk.com/printthread.php?t=208310这个是一个相应窗口的标题改变的。你可以修改一下成为相应窗口的关闭的。当然最好的方法是利用Delphi或者VC写一个hook的DLL由VB调用来拦截wm_close消息。
      

  2.   

    这个例子不能实现我说的那个功能,因为他只能监视自己创建的窗口,如果把SetWindowLong监视的句柄换成其他如Word等的窗口,就会失败,SetWindowLong返回0.
      

  3.   

    如果需要监视外部进程的窗口的话就需要做一个DLL Hook了。
      

  4.   

    vb自己也可以实现hook功能呀,为什么要用dephi? 是不是hook的某些功能VB实现不了?
      

  5.   

    如果你需要hook到其它进程的话,你的hook回调函数必须写到一个DLL中。而VB用正常的手段是无法创建普通的DLL的。
      

  6.   

    用超级绿豆的APIHook的方法应该可以解决
      

  7.   

    作一个全局的窗体HOOK,就可以了。
      

  8.   

    大家都在说做一个HOOK.
    做捕捉键盘、鼠标的我知道,做捕捉窗口关闭的,应该怎样?谢谢!有能具体一点的资料和例子吗?
      

  9.   

    VB用正常的手段是无法创建普通的DLL的
    =============================
    正常手段是无法创建,但有方法创建呀! 如果只是这个原因的话,完全可以用VB来做了! 请问高手还有没有其它原因,一定要用其它工具? 谢谢
      

  10.   

    这个问题有难度,不论是跨进程的子类还是全局钩子一般都需要额外的dll,只用vb很难完成//做捕捉键盘、鼠标的我知道,做捕捉窗口关闭的,应该怎样?
    基本上没什么差别,只是钩子不同而已,捕捉消息的话,用WH_GetMessage
      

  11.   

    有没有,额外dll的例子程序呀?
      

  12.   

    Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As Long, ByVal bRevert As Long) As Long
    Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
    Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
    Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
    Const MF_BYPOSITION = &H400&
    Const MF_REMOVE = &H1000&Dim hSysMenu As Long
    Dim nCnt As Long
    hSysMenu = GetSystemMenu(句柄, False)
    If hSysMenu Then
    nCnt = GetMenuItemCount(hSysMenu)
    If nCnt Then
    RemoveMenu hSysMenu, nCnt - 1, MF_BYPOSITION Or MF_REMOVE
    RemoveMenu hSysMenu, nCnt - 2, MF_BYPOSITION Or MF_REMOVE
    DrawMenuBar 句柄
    End If
    End If
      

  13.   

    HotUs(@_@) 的方法只是把系统菜单的关闭屏蔽了.
    但不能阻止程序自带的关闭功能和Alt-F4等等方式的关闭.