想问一下,在VB6.0/VBA中如何使用WinAPI,输入进程名称,来获得进程的ID呢?或者更直接一点的问题,就是使用怎么能够拦截制定窗体的弹出窗口?使用Hook的话,需要知道进程的ID,所以才会有之前的问题。谢谢大家!

解决方案 »

  1.   

    添加此模块:http://www.m5home.com/bbs/dispbbs.asp?boardid=28&Id=745&page=3dim Pid as longif FindProcess("explorer.exe",pid) then
        msgbox pid
    end if
      

  2.   

    vb可以知道搜索出进程的id但是vb拦截弹出窗口完成不了
      

  3.   

    再弱弱的问一下,VBA可以执行全局的hook拦截吗?
      

  4.   


    是哪篇呢?还有,我想知道用vba能实现拦截其他程序内部消息框的功能吗?我用hook的时候,总是绑定不了其它的程序。
      

  5.   

    让人家去写驱动啊而且vb如果不内嵌汇编,不使用特殊方法来制作dll我还真想不出什么办法来做全局hook 
      

  6.   

    VB制作全局的hook是没有问题的,不需要借助第三方的dll,只用api就行了。这点可以放心,因为做成了一个拦截全局键盘输入的hook,我现在只是做这个拦截消息框的hook出现问题了。
      

  7.   

    拦截全局键盘的hook
    Option Explicit
    Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
    Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As LongPublic Const WM_CLOSE = &H10
    Const GWL_HINSTANCE = (-6)
    Public Type KBDLLHOOKSTRUCT
       vkCode As Long   'value of the key you pressed
       scanCode As Long
       flags As Long
       time As Long
       dwExtraInfo As Long
    End Type
    Public Const WH_KEYBOARD = 2
    Public Const WH_KEYBOARD_LL = 13
    Public Const HC_ACTION = 0
    Public Const VK_DELETE = &H2E
    Public Const WM_COMMAND = &H111
    Public KeyboardHook As LongPublic Sub Hook()
    Dim Hin As Long
       Hin = GetWindowLong(FindWindow("XLMAIN", vbNullString), GWL_HINSTANCE)   'better compatibility excel97,XP,2003.
       Debug.Print Application.Hinstance
       'hook the keyboard
       KeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, Hin, 0)
    End Sub
    Public Sub UnHook()
       'unhook the keyboard.
       UnhookWindowsHookEx KeyboardHook
    End Sub
    Public Function LowLevelKeyboardProc(ByVal nCode As Long, ByVal wParam As Long, lParam As Long) As Long
    Dim xpInfo As KBDLLHOOKSTRUCT
       If nCode = HC_ACTION Then
           
           CopyMemory xpInfo, lParam, Len(xpInfo)   'copy the structure from lParam to xpinfo
           LowLevelKeyboardProc = -1
        
       Else
          LowLevelKeyboardProc = CallNextHookEx(KeyboardHook, nCode, wParam, lParam)
       End If
    End Function
      

  8.   

    hook键盘鼠标是没有问题因为这里不需要用到dll,而你需要拦截对方调用api的过程这个就和hook键盘鼠标有本质的不同了这个一定要dll,而vb做的dll并非标准的dll 所以我说vb全局钩子光靠vb是做不成的你并没有理解什么叫全局hook 你在网上肯定找不到纯vb写的跨进程的api hook
      

  9.   

    跨进程全局HOOK是可以的,不需要DLL只要在EXE内完成即可,以前我在vbgood上发有一个程序就是监视进程启动的,不过就是要自己注入到其他进程
      

  10.   


    嘿嘿,正因为不理解才要问啊,为什么一定要用到第三方的dll呢?dll不也是应用程序的一种吗?只是不能自己执行啊。
      

  11.   

    其实给你说下原理吧
    哪篇文章我也不记得了
    因为我现在也不想写什么文章
    CSDN对技术博客一点都不看中
    懒得写了浪费我去打字
    好了废话不说
    首先你得自己写一段shellcode然后使用WriteProcessMemory写入到目标进程中,然后使用CreateRemoteThread等相关api让此shellcode执行,如果要接收控制操作可以在shellcode里加入SendMessage发送自定义消息那样其实和dll一样的效果
      

  12.   

    其实不使用CreateRemoteThread等函数也能让代码执行起来
      

  13.   

    你的shellcode用什么写的?
    不还是要用到汇编
    纯粹vb不还是完成不了。至于不使用CreateRemoteThread等函数也能让代码执行起来这个倒正常 api hook本来就有多个方式shellcode也可以  修改 IAT同样可以 SEH也可以。
    但是都要用到汇编或者特殊办法来生成可输出函数dll。
      

  14.   

    dll倒不需要
    只需要一段shellcode就行了
    其实说用到汇编也不否定,其实应该说是完全自己写机器码而已
    也不表示VB不能用机器码来执行程序吧
    只是在写机器码的时候VB没VC等方便,当然更没汇编爽了
      

  15.   

    你看清我说的话先
    但是都要用到汇编或者特殊办法来生成可输出函数dll。 
    我说的是或者
    我没说汇编和dll都是必须的
    而且我前面也说了是“纯vb”完成不了api hookvb来完成api hook的办法我也了解,
    而vb sheelcode完成apihook的办法也并非什么新技术
    2004年台湾就有人写出代码了。