第一个问题:想知道以下3个Api函数的详细解释:
1.SetWindowsHookEx
2.UnhookWindowsHookEx
3.CallNextHookEx
(不用费劲去Msdn找了,Api参考手册居然都没有,晕)
第二个问题(还是我提问过多次的那个老问题):
我想在资源管理器窗口上 再加上一个Toolbar,(我看到过有些软件做到了,而且添加的Toolbar中还有启动程序的按钮,比如 金山独霸),请问在注册表中的那里更改可以做到?是不是还有朋友不明白我的意思?就是这样的:
在 资源管理器(或者我的电脑) 工具条上按鼠标键,出来菜单选择“链接”,你看,是不是多了一个Toolbar出来?我想自己添加一个类似于"链接"的Toolbar到资源管理器上的工具条,我想应该是在注册表中修改或添加某个键值来做到的.当然,不一定要添加Toolbar,添加一个按纽也可以,不过我想不太可能.呵呵.还有,不是对IE来操作,是对资源管理器(或者我的电脑)的操作!(有朋友总是告诉我在IE上添加按纽,不是我想要的.)请赐教,回答出来或提供思路200分相送!UP也有份!!最新消息:现在我已经知道了注册表中这个地方
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Toolbar
下增加一些键值能够达到效果,(就是会在鼠标右键菜单中出来Toolbar的自定义过的选单),可是现在我并不会自己增加键值,请教高人!

解决方案 »

  1.   

    IE右键菜单:
    HKEY_USERS\.DEFAULT\Software\Microsoft\Internet Explorer\MenuExt\自定义菜单名字
    (默认)=“C:\PROGRAM FILES\自定义菜单名字\自定义菜单名字.htm”
    IE工具栏按钮:
    参考一下以下的位置
    HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Extensions其实不管是资源管理器还是IE,里面的“链接”还是“工具栏”都是调用注册表中的某一位置
    要不微软为什么把IE捆绑在Windows中一起销售呢?有时间的话,参考并且斧正一下我的程序,谢谢在先!
    http://www.wjez.net/wchsoft/ipage2.htm
    (严防死守)你需要的问题在:“IE设置”----“下一步”
      

  2.   

    1.SetWindowsHookEx
    【VB声明】
      Private 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【别名】
      SetWindowsHookExA实例
    'In a module
    Public Const WH_KEYBOARD = 2
    Public Const VK_SHIFT = &H10
    Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
    Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
    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
    Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Public hHook As Long
    Public Function KeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        'if idHook is less than zero, no further processing is required
        If idHook < 0 Then
            'call the next hook
            KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
        Else
            'check if SHIFT-S is pressed
            If (GetKeyState(VK_SHIFT) And &HF0000000) And wParam = Asc("S") Then
                'show the result
                Form1.Print "Shift-S pressed ..."
            End If
            'call the next hook
            KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
        End If
    End Function'In a form, called Form1
    Private Sub Form_Load()
        'KPD-Team 2000
        'URL: http://www.allapi.net/
        'E-Mail: [email protected]
        'set a keyboard hook
        hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, App.hInstance, App.ThreadID)
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        'remove the windows-hook
        UnhookWindowsHookEx hHook
    End Sub
      

  3.   

    1.SetWindowsHookEx
    【VB声明】
      Private 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【别名】
      SetWindowsHookExA实例
    'In a module
    Public Const WH_KEYBOARD = 2
    Public Const VK_SHIFT = &H10
    Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
    Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
    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
    Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Public hHook As Long
    Public Function KeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        'if idHook is less than zero, no further processing is required
        If idHook < 0 Then
            'call the next hook
            KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
        Else
            'check if SHIFT-S is pressed
            If (GetKeyState(VK_SHIFT) And &HF0000000) And wParam = Asc("S") Then
                'show the result
                Form1.Print "Shift-S pressed ..."
            End If
            'call the next hook
            KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
        End If
    End Function'In a form, called Form1
    Private Sub Form_Load()
        'KPD-Team 2000
        'URL: http://www.allapi.net/
        'E-Mail: [email protected]
        'set a keyboard hook
        hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, App.hInstance, App.ThreadID)
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        'remove the windows-hook
        UnhookWindowsHookEx hHook
    End Sub
      

  4.   

    2.UnhookWindowsHookEx
    【VB声明】
      Private Declare Function UnhookWindowsHookEx Lib "user32" Alias "UnhookWindowsHookEx" (ByVal hHook As Long) As Long实例:
    'In a module
    Public Const WH_KEYBOARD = 2
    Public Const VK_SHIFT = &H10
    Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
    Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
    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
    Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Public hHook As Long
    Public Function KeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        'if idHook is less than zero, no further processing is required
        If idHook < 0 Then
            'call the next hook
            KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
        Else
            'check if SHIFT-S is pressed
            If (GetKeyState(VK_SHIFT) And &HF0000000) And wParam = Asc("S") Then
                'show the result
                Form1.Print "Shift-S pressed ..."
            End If
            'call the next hook
            KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
        End If
    End Function'In a form, called Form1
    Private Sub Form_Load()
        'KPD-Team 2000
        'URL: http://www.allapi.net/
        'E-Mail: [email protected]
        'set a keyboard hook
        hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, App.hInstance, App.ThreadID)
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        'remove the windows-hook
        UnhookWindowsHookEx hHook
    End Sub3.CallNextHookEx
    【VB声明】
      Private Declare Function CallNextHookEx Lib "user32" Alias "CallNextHookEx" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long实例:
    'In a module
    Public Const WH_KEYBOARD = 2
    Public Const VK_SHIFT = &H10
    Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
    Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
    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
    Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Public hHook As Long
    Public Function KeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        'if idHook is less than zero, no further processing is required
        If idHook < 0 Then
            'call the next hook
            KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
        Else
            'check if SHIFT-S is pressed
            If (GetKeyState(VK_SHIFT) And &HF0000000) And wParam = Asc("S") Then
                'show the result
                Form1.Print "Shift-S pressed ..."
            End If
            'call the next hook
            KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
        End If
    End Function'In a form, called Form1
    Private Sub Form_Load()
        'KPD-Team 2000
        'URL: http://www.allapi.net/
        'E-Mail: [email protected]
        'set a keyboard hook
        hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, App.hInstance, App.ThreadID)
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        'remove the windows-hook
        UnhookWindowsHookEx hHook
    End Sub
      

  5.   

    SetWindowsHookEx,UnhookWindowsHookEx,CallNextHookEx谁说在MSDN中没有说明的?这三个函数和钩子函数有关,SetWindowsHookEx用于设置一个钩子函数,UnhookWindowsHookEx用于卸载一个钩子函数,CallNextHookEx调用钩子函数链中的下一个钩子函数。
    SetWindowsHookEx Function--------------------------------------------------------------------------------The SetWindowsHookEx function installs an application-defined hook procedure into a hook chain. You would install a hook procedure to monitor the system for certain types of events. These events are associated either with a specific thread or with all threads in the same desktop as the calling thread. SyntaxHHOOK SetWindowsHookEx(          int idHook,
        HOOKPROC lpfn,
        HINSTANCE hMod,
        DWORD dwThreadId
    );
    ParametersidHook
    [in] Specifies the type of hook procedure to be installed. This parameter can be one of the following values. 
    WH_CALLWNDPROC
    Installs a hook procedure that monitors messages before the system sends them to the destination window procedure. For more information, see the CallWndProc hook procedure.
    WH_CALLWNDPROCRET
    Installs a hook procedure that monitors messages after they have been processed by the destination window procedure. For more information, see the CallWndRetProc hook procedure.
    WH_CBT
    Installs a hook procedure that receives notifications useful to a computer-based training (CBT) application. For more information, see the CBTProc hook procedure.
    WH_DEBUG
    Installs a hook procedure useful for debugging other hook procedures. For more information, see the DebugProc hook procedure.
    WH_FOREGROUNDIDLE
    Installs a hook procedure that will be called when the application's foreground thread is about to become idle. This hook is useful for performing low priority tasks during idle time. For more information, see the ForegroundIdleProc hook procedure. 
    WH_GETMESSAGE
    Installs a hook procedure that monitors messages posted to a message queue. For more information, see the GetMsgProc hook procedure.
    WH_JOURNALPLAYBACK
    Installs a hook procedure that posts messages previously recorded by a WH_JOURNALRECORD hook procedure. For more information, see the JournalPlaybackProc hook procedure.
    WH_JOURNALRECORD
    Installs a hook procedure that records input messages posted to the system message queue. This hook is useful for recording macros. For more information, see the JournalRecordProc hook procedure.
    WH_KEYBOARD
    Installs a hook procedure that monitors keystroke messages. For more information, see the KeyboardProc hook procedure.
    WH_KEYBOARD_LL
    Windows NT/2000/XP: Installs a hook procedure that monitors low-level keyboard input events. For more information, see the LowLevelKeyboardProc hook procedure.
    WH_MOUSE
    Installs a hook procedure that monitors mouse messages. For more information, see the MouseProc hook procedure.
    WH_MOUSE_LL
    Windows NT/2000/XP: Installs a hook procedure that monitors low-level mouse input events. For more information, see the LowLevelMouseProc hook procedure.
    WH_MSGFILTER
    Installs a hook procedure that monitors messages generated as a result of an input event in a dialog box, message box, menu, or scroll bar. For more information, see the MessageProc hook procedure.
    WH_SHELL
    Installs a hook procedure that receives notifications useful to shell applications. For more information, see the ShellProc hook procedure.
    WH_SYSMSGFILTER
    Installs a hook procedure that monitors messages generated as a result of an input event in a dialog box, message box, menu, or scroll bar. The hook procedure monitors these messages for all applications in the same desktop as the calling thread. For more information, see the SysMsgProc hook procedure.
    lpfn
    [in] Pointer to the hook procedure. If the dwThreadId parameter is zero or specifies the identifier of a thread created by a different process, the lpfn parameter must point to a hook procedure in a dynamic-link library (DLL). Otherwise, lpfn can point to a hook procedure in the code associated with the current process. 
    hMod
    [in] Handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process. 
    dwThreadId
    [in] Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads running in the same desktop as the calling thread. 
    Return ValueIf the function succeeds, the return value is the handle to the hook procedure. If the function fails, the return value is NULL. To get extended error information, call GetLastError.
    ResAn error may occur if the hMod parameter is NULL and the dwThreadId parameter is zero or specifies the identifier of a thread created by another process. Calling the CallNextHookEx function to chain to the next hook procedure is optional, but it is highly recommended; otherwise, other applications that have installed hooks will not receive hook notifications and may behave incorrectly as a result. You should call CallNextHookEx unless you absolutely need to prevent the notification from being seen by other applications. Before terminating, an application must call the UnhookWindowsHookEx function to free system resources associated with the hook. The scope of a hook depends on the hook type. Some hooks can be set only with global scope; others can also be set for only a specific thread, as shown in the following table. Hook Scope 
    WH_CALLWNDPROC Thread or global 
    WH_CALLWNDPROCRET Thread or global 
    WH_CBT Thread or global 
    WH_DEBUG Thread or global 
    WH_FOREGROUNDIDLE Thread or global 
    WH_GETMESSAGE Thread or global 
    WH_JOURNALPLAYBACK Global only 
    WH_JOURNALRECORD Global only 
    WH_KEYBOARD Thread or global 
    WH_KEYBOARD_LL Global only 
    WH_MOUSE Thread or global 
    WH_MOUSE_LL Global only 
    WH_MSGFILTER Thread or global 
    WH_SHELL Thread or global 
    WH_SYSMSGFILTER Global only 
    For a specified hook type, thread hooks are called first, then global hooks. The global hooks are a shared resource, and installing one affects all applications in the same desktop as the calling thread. All global hook functions must be in libraries. Global hooks should be restricted to special-purpose applications or to use as a development aid during application debugging. Libraries that no longer need a hook should remove its hook procedure. Windows 95/98/Me: SetWindowsHookEx is supported by the Microsoft&reg; Layer for Unicode (MSLU). However, it does not make conversions. To see Unicode messages, notifications, and so forth, you must subclass the window. To use this version of the application programming interface (API), you must add certain files to your application, as outlined in Installing and Releasing Hook Procedures
      

  6.   

    UnhookWindowsHookEx Function--------------------------------------------------------------------------------The UnhookWindowsHookEx function removes a hook procedure installed in a hook chain by the SetWindowsHookEx function. SyntaxBOOL UnhookWindowsHookEx(          HHOOK hhk
    );
    Parametershhk
    [in] Handle to the hook to be removed. This parameter is a hook handle obtained by a previous call to SetWindowsHookEx. 
    Return ValueIf the function succeeds, the return value is nonzero.If the function fails, the return value is zero. To get extended error information, call GetLastError.
    ResThe hook procedure can be in the state of being called by another thread even after UnhookWindowsHookEx returns. If the hook procedure is not being called concurrently, the hook procedure is removed immediately before UnhookWindowsHookEx returns. 
      

  7.   

    CallNextHookEx Function--------------------------------------------------------------------------------The CallNextHookEx function passes the hook information to the next hook procedure in the current hook chain. A hook procedure can call this function either before or after processing the hook information. SyntaxLRESULT CallNextHookEx(          HHOOK hhk,
        int nCode,
        WPARAM wParam,
        LPARAM lParam
    );
    Parametershhk
    [in] Handle to the current hook. An application receives this handle as a result of a previous call to the SetWindowsHookEx function. 
    nCode
    [in] Specifies the hook code passed to the current hook procedure. The next hook procedure uses this code to determine how to process the hook information. 
    wParam
    [in] Specifies the wParam value passed to the current hook procedure. The meaning of this parameter depends on the type of hook associated with the current hook chain. 
    lParam
    [in] Specifies the lParam value passed to the current hook procedure. The meaning of this parameter depends on the type of hook associated with the current hook chain. 
    Return ValueThis value is returned by the next hook procedure in the chain. The current hook procedure must also return this value. The meaning of the return value depends on the hook type. For more information, see the descriptions of the individual hook procedures.
    ResHook procedures are installed in chains for particular hook types. CallNextHookEx calls the next hook in the chain. Calling CallNextHookEx is optional, but it is highly recommended; otherwise, other applications that have installed hooks will not receive hook notifications and may behave incorrectly as a result. You should call CallNextHookEx unless you absolutely need to prevent the notification from being seen by other applications. 
      

  8.   

    yunok (★ 杨云鹏,用VB,向高手们学习! ★):你的第二个问题,是嵌入式软件使用的方法,请版主来回答吧。也许VB难以实现(用C)
      

  9.   

    =========================================================================
    其实不管是资源管理器还是IE,里面的“链接”还是“工具栏”都是调用注册表中的某一位置
    要不微软为什么把IE捆绑在Windows中一起销售呢?
    =========================================================================
    To: wchsoft(无名工作室) 兄:
       IE和资源管理器里面的“链接”,"地址栏”,的确是调用同一地址的,但是和第三方应用程序加入的快捷栏却是不同的.  如果您不相信,请您亲自试一试,我试试验了多次实在没有办法才来麻烦大家的.     还有,微软把IE捆绑在Windows中一起销售,一是为了打跨其他浏览器,比如网景等等,而是为了迅速扩大垄断地位.   这个我的题目要求有什么关系??我不明白.
      

  10.   

    To:  qingming81(晴明) gcj123(佛的光辉)      我想知道3个Api函数各个参数的详细意义呀.这些例子在Snow_Win32Api中我也找到但过得. :(              当然,看完这些例子也很有帮助的.  谢谢你们!
      

  11.   

    ===========================================================================
    yunok (★ 杨云鹏,用VB,向高手们学习! ★):你的第二个问题,是嵌入式软件使用的方法,请版主来回答吧。也许VB难以实现(用C)
    ===========================================================================To: qingming81(晴明) :
         通过注册表可以解决的,我已经可以做到在资源管理器工具栏处点击鼠标右键出来"凝尘软件"字样的菜单了(就是跟在"链接"下面多出来的.呵呵),只是现在还不知道如何出来一个Toolbar,并且上边有我的应用程序. :(
      

  12.   

    ==========================================================================
    不知道你是否装了聊天软件“雅虎通”,建议你装一装,在装之前把注册表导出,装之后再导出,然后通过FC比较到一个文本文件中,看看该文本文件,我相信你会有很大的收获的。
    ==========================================================================To: wchsoft(无名工作室) 
        我装过瑞星,诺顿,3721上网助手,雅虎通,金山独霸等等.我除了用过FC以外,还用过 多种 Reg快照软件来进行对比过. 但是,所有软件的写注册表方法和键值统统是不定的,且无规律可循的. 甚至装2次同样的软件,写注册表的位置都不同. 我晕. 所以才来请教高人的.
      

  13.   

    To: wchsoft(无名工作室) 
         您的软件"IE严防死守"我看了, 挺好的.但是功能和效果(甚至可用价值)上还有一些缺陷,请参看我主页上(http://ioi.xiloo.com)的卢培培作品“注册表大师”,我认为是相当好的作品。另外,不才我也有很多对Api操作(类似于超级兔子)的东东,请您下载参看。
         请恕在下直言,您的软件在实用率上并没有太大特色,至于能有多少用户使用,请您不妨做个调查试试看。:)  努力!
      

  14.   

    http://www.eaoo.com/design/list.asp?classid=2&Nclassid=12
      

  15.   

    TO:cnpr(-----)
        谢谢您给我的网站,但是没有我需要的答案.
      

  16.   

    工具栏的按钮一般在HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Extensions
    不过如果你想在工具栏上添加按钮的话,好象先要在系统中注册一个键值。如:
    {ABFC18BB-ED0C-425d-9EF4-42624205BBA4}
    至于“雅虎通”,我刚刚接到朋友推荐,对于他为什么在工具栏上写那么多的信息,我还在研究。注意,“雅虎通”是在IE上另外建立一个工具栏区域。
      

  17.   

    To: gcj123(佛的光辉)     哦!!!十二分Sorry啊!都怪我粗心啊!看见E文就头大.呵呵.谢谢你啊!api解释我要带回家边翻字典边看了!  呵呵。
      

  18.   

    To:wchsoft(无名工作室) 
        我的题目您可有认真的看呢?我已经说明了:
    ----------------------------------
    还有,不是对IE来操作,是对资源管理器(或者我的电脑)的操作!(有朋友总是告诉我在IE上添加按纽,不是我想要的.)
    ----------------------------------
        再次强调,我不需要再IE上添加按钮,那个十分简单。7行代码即可实现。我需要的是对资源管理器的操作。    谢谢你。
      

  19.   

    To:yunok(★ 杨云鹏,用VB,向高手们学习! ★) 
       谢谢你诚恳的语言!至于你推荐的东西,我会去看的。
       在软件的实用率上我知道没有多大的使用价值,正是这个原因或许也有其他的原因,我在两个月之前就放弃了VB,不过现在只是无聊,来看看我的CSDN,能帮助人就帮助人,尽自己的能力吧!
      

  20.   

    To:wchsoft(无名工作室) 
        您的网站留言板已经打不开了。是否需要我给您提供一个(就是类似于我主页上的那个)?Asp做的。您可以直接放在我的空间上管理。请参看http://ioi.xiloo.com的链接。
      

  21.   

    能力有限!抱歉!yunok(★ 杨云鹏,用VB,向高手们学习! ★) 兄。
      

  22.   

    再To:wchsoft(无名工作室) 
         微软支持VB到2008年呢!为什么要放弃呢?(当然,大家也已经开始看.net了嘛! :)   )虽然Vb入门容易。但是精通确实是困难的。不过各人有个人的想法,希望您一路走好。
      

  23.   

    看到hook总觉得和钩子有关!
    不过我不懂,帮你up!
      

  24.   

    那几个 API 我就不管了,说你说的 IE 按钮和工具栏。IE 工具栏上的按钮的添加很简单,不一定要编程,改改注册表就可以了
    IE 的历史/搜索/媒体等这样的“窗口”叫做 Band,要写 Band 用 VB 存在一定的困难(其实不是不可以,VB也可以实现很多接口),需要写成COM,并注册到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Explorer Bars,详细的内容回头再说。
    简单说说增加菜单和按钮,拿 flashget 做例子:
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\{D6E814A0-E0C5-11d4-8D29-0050BA6940E3}]
    "ButtonText"="FlashGet"
    "Default Visible"="Yes"
    "Exec"="D:\\play\\工具软件\\工具软件\\FLASHGET\\flashget.exe"
    "HotIcon"="D:\\play\\工具软件\\工具软件\\FLASHGET\\flashget.exe,128"
    "Icon"="D:\\play\\工具软件\\工具软件\\FLASHGET\\flashget.exe,223"
    "CLSID"="{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}"
    "MenuStatusBar"="FlashGet"
    "MenuText"="&FlashGet"
    1、在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions
    创建一个新的项,并用 genguid 生成一个 guid 作为名字,例如 flashget 的
    {D6E814A0-E0C5-11d4-8D29-0050BA6940E3},你需要换一个不重复的哦2、添加若干key,如 ButtonText MenuStatusBar 等描述信息
    3、添加 Exec 指向你的执行程序
    4、为它添加图表文件和激活图表文件 Icon 和 HotIcon
    5、一定要创建一个 CLSID,值必须为"{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}",这告诉 IE 它是一个menuitem
    6、Flashget 没有这一项,你可以创建string类型的key,名为 MenuCustomize ,值为"help",如果有这个MenuCustomize且为"help",你新增的这一菜单项就跑到“帮助”菜单项下,否则是“工具”菜单项下。
    好了,你可以修改 flashget 的注册表试试看效果——别忘记关掉IE,重新打开。
      

  25.   

    这样你的IE的“工具”或者“帮助”菜单里会多了一项,工具条上也会多了一个按钮。
    如果你希望用它调用一个com,而不是exe文件,那么不用创建 "Exec" 项,改为 ClsidExtension,并填写你的COM的 GUID——注意,该COM必需实现了IOleCommandTarget和IObjectWithSite(具体方法查MSDN吧,我不记得了)如果你不想执行exe,也不想调用com,可以让这个菜单项或按钮调用一个script:用"Script"代替"Exec",并将指向你的javascript/vbscript/windowshostscript的文件的完整路径赋值给它。
      

  26.   

    至于 Band 这东西就比较多了,除了IE的历史/媒体等“band”,还有realplayer等软件自己实现的——实际上实现一个最简单的Band也不需要写程序,修改注册表就可以创建一个Band并用html作为其显示的内容——比如做一个自己的搜索入口。而WindowXP以后,新增了不少Band,比如桌面任务条上可以创建各种Band,甚至像 MediaPlayer9 那样可以最小化到任务条上变成一个和输入法一样的Band,还可以弹出一个小窗口播放video ! 呵呵,这些就不多说了,你慢慢看资料吧。
      

  27.   

    To:piggybank(吞硬币的小猪)        我超级超级^999次方晕死。大哥啊!!我都说了N^999次了。我不需要对IE的操作啊!
    -------------------------------------------------------------------
    还有,不是对IE来操作,是对资源管理器(或者我的电脑)的操作!(有朋友总是告诉我在IE上添加按纽,不是我想要的.)
    -------------------------------------------------------------------
    我都神经质了~~晕~谁在告诉我关于IE的我可不给分了哦! :)
      

  28.   

    做成一个COM,实现前面说的接口,注册到
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Explorer Bars\{Your COM GUID}
      

  29.   

    To:piggybank(吞硬币的小猪)
       哥哥,不否认您的资料很有价值,我花了一晚上时间完成了您文章中所说对“Band”的操作。在IE能实现的很好。 我非常感谢您的回答。   但是,您的答案并非是我所需求的。因为在IE中添加相关键值内容后,并不能再资源管理器中的Toobar显示出来。所以在我的这个问题上,您的文章对我没有帮助。
     
       谢谢。
      

  30.   

    那三个API是专门处理Hook
    找本参考书看吧推荐:
    《Visual BASIC Win32 API 编程》
    Steven Roman著
      

  31.   

    To zyl910(910:分儿,我又来了!) 兄:
       好的。我星期天去买。不知道贵不贵哦。 :)
      

  32.   

    sorry 前面没仔细看HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Toolbar\{Your COM GUID}关掉所有的 explorer 再打开试试看,在资源管理器菜单的“查看”下面有没有你的 toolbar ?
      

  33.   

    To:piggybank(吞硬币的小猪) 
       没有的。5555555555555555.
      

  34.   

    补充一下,别弄错了
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Toolbar\
    创建一个新的键值,类型为二进制,名字为{Your GUID}
    类型改为string似乎也可以 x(
      

  35.   

    To:piggybank(吞硬币的小猪) 
        感谢大侠指点!!!您的这句话终于回答道位置上了。 :)   不过您说的这一点我已经做到了。然后呢?我可以在资源管理器中的右键,实现出来我添加文字的字样。但是如何增加Toolbar呢?增加了后如何在上边添加应用程序的启动按钮呢?   让我写什么Com之类的我觉得比较困难啊!我是菜鸟的。:(    期待您的回答!!!
      

  36.   

    VB 做 toolbar 的com似乎不行啊(有一些高级方法没测试过),上面说的
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Toolbar\
    创建一个新的键值,类型为二进制,名字为{Your GUID}
    需要你做一个组件实现一些特别接口才行——例如 flashget 和 天网搜索等。这些com如果注册到上面说的位置,就可以同时出现在资源管理器和ie的工具条上了。
    另外做资源管理器的右键菜单要做到Winzip或更强(例如 Picaview那样对图片文件点右键能够预览)也需要COM,VB实现不了那几个接口(我不确定,虽然VB可以实现很多接口,但没试过。或许 hack vb 可以做到,参考《高级VisualBasic编程》一书)。对资源管理器还可以做很多事情,比如动态改变特定的一些文件的图标——比如同样是一个.txt文件,内容中包含指定的内容或长度大于指定大小可以让它的图标与别的.txt不同,还可以改变鼠标浮动到一个文件上面时显示的tooltip的内容等等,但
    要写 com 实现一些特殊接口。呵呵,我不知道明后天是否有时间。如果有空倒是可以试试看用vb是否能做到,抱歉啦。
      

  37.   

    To:piggybank(吞硬币的高手高手高高手),
        哥哥!!你果然是高人啊!说到俺心里了!!您的意思俺明白了~但是现在我的问题该怎么办呢??是不是没有办法解决了?我狂晕死啊啊!真的是困扰我很久很久了。唉~到最后居然不能解决吗?   拜托你啊!想想办法帮小弟。  感激不尽! 请你吃饭!!来大连玩俺以身相许!!
        晚上我也在努力试验看看。    谢谢高人!!
      

  38.   

    你说的对资源管理器点右键出现的菜单叫做 contextmenu,属于 shell programming 的 7(好像是7种,不大记得)中的 contextmenu handler,要实现大概是 IShellExtInit 和 IContextMenu 这两个接口。另外几种如上面说的shell扩展编程也需要实现这些接口(不同的类型有所不同)。当对资源管理器进行操作的时候,资源管理器会在注册表的特定位置找注册项对应的COM,找到后会把参数传递给COM——因此COM必须实现一些约定的接口才能接收数据,才能做出相应处理。
    这和 ToolBar 的实现类似,但不一样。我印象中csdn有朋友翻译了老外的文章讲 shell programing(讲得很好,此前我一直找不到资料和方法),我这就给你搜来<外壳扩展编写完全傻瓜指南>(一)(Michael Dunn)    mefish(翻译)
    http://www.csdn.net/Develop/Read_Article.asp?Id=10683但,这需要用 vc/atl 写 com ,不要气馁啊!
      

  39.   

    To: piggybank(吞硬币的小猪)
        哦!原来是这样啊!我自己问的问题,居然连它属于什么都不知道.  唉!郁闷.越来越觉得自己像傻Boy,什么都不懂. 不爽!超级郁闷.    关于shell的扩展,我也找过很多相关资料,可是我发现真的是太少了. 今天得piggybank(吞硬币的小猪)指点. 终于又明白些了!还望大哥多多指教啊!    用vc/atl写com 啊,那我可真的是一窍不通了。难道必须在学习VC才能做到吗?埃。不知道VB能不能做到啊!piggybank(吞硬币的小猪)兄,您可有什么办法吗?
      

  40.   

    To:passer_wave(路人) 
        我也是菜鸟啊!也在努力学习东西。 :)  大家一起努力了!  :)
      

  41.   

    To:passer_wave(路人) 
       应该谢的是回答问题的高手哦! 大家一起努力啊!呵呵。
      

  42.   

    呵呵,既然都到以身相许的地步了,看来要放点儿法宝咯我在我2000年的“学习心得”中找到了这个例子(脑子不好使,记不住),可以不写COM在工具条上显示点儿自己的东西,用到 IE 的 水平和垂直 Band 中也可以。来,先创建一个 piggyToolBar.reg 文件,内容如下
    ______________________________________________________________
    Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\CLSID\{0288B63B-C60B-4847-A787-F0051026533D}]
    @="piggyToolBar"[HKEY_CLASSES_ROOT\CLSID\{0288B63B-C60B-4847-A787-F0051026533D}\Implemented Categories][HKEY_CLASSES_ROOT\CLSID\{0288B63B-C60B-4847-A787-F0051026533D}\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}]
    [HKEY_CLASSES_ROOT\CLSID\{0288B63B-C60B-4847-A787-F0051026533D}\InprocServer32]
    "ThreadingModel"="Apartment"
    @="shdocvw.dll"[HKEY_CLASSES_ROOT\CLSID\{0288B63B-C60B-4847-A787-F0051026533D}\Instance]
    "CLSID"="{4D5C8C2A-D075-11d0-B416-00C04FB90376}"[HKEY_CLASSES_ROOT\CLSID\{0288B63B-C60B-4847-A787-F0051026533D}\Instance\InitPropertyBag]
    "Url"="http://www.google.com"
    ______________________________________________________________双击这个文件,导入注册项,然后关闭资源管理器再打开(实际上调试这类程序的时候一般把浏览器和资源管理器调整为运行为单进程,就不用反复开关了)。选中资源管理器的“查看”->“工具栏”->“piggyToolBar”,你的工具条上似乎“没有变化”?可能被顶到最边上了吧,呵呵。对工具条点右键,去掉对“锁定工具栏”的选择,然后
    找找——可能就在最右边了。找到新建的工具条,把它拖出来——你看到的工具条似乎是一个空白块,不用担心,鼠标移动到它的下方 resize 放大它——出现在你面前的是 google 页面 :)你如果把
    "Url"="http://www.google.com"
    改成
    "Url"="x:\yourfolder\tool.htm"
    自己做一个网页模仿一下工具条的按钮也不是难事哦 
    怎么样?不用 COM 也能写自己的 tool bar 吧?
    呵呵,其它的 IE 和资源管理器的各种 Band,甚至桌面任务栏的 DeskBand 等 也能如此实现 :)
      

  43.   

    关于Hook

    一、基本概念:    钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。    钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。二、运行机制:1、钩子链表和钩子子程:    每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定的,应用程序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。 Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表。如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。    钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的C函数。用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可以是系统中所有线程的事件。    钩子子程必须按照以下的语法:
        LRESULT CALLBACK HookProc
    (
    int nCode, 
          WPARAM wParam, 
          LPARAM lParam
         );
    HookProc是应用程序定义的名字。nCode参数是Hook代码,Hook子程使用这个参数来确定任务。这个参数的值依赖于Hook类型,每一种Hook都有自己的Hook代码特征字符集。
    wParam和lParam参数的值依赖于Hook代码,但是它们的典型值是包含了关于发送或者接收消息的信息。2、钩子的安装与释放:    使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中。SetWindowsHookEx函数总是在Hook链的开头安装Hook子程。当指定类型的Hook监视的事件发生时,系统就调用与这个Hook关联的Hook链的开头的Hook子程。每一个Hook链中的Hook子程都决定是否把这个事件传递到下一个Hook子程。Hook子程传递事件到下一个Hook子程需要调用CallNextHookEx函数。
        
    HHOOK SetWindowsHookEx( 
         int idHook,      // 钩子的类型,即它处理的消息类型
         HOOKPROC lpfn,   // 钩子子程的地址指针。如果dwThreadId参数为0
       // 或是一个由别的进程创建的线程的标识,
       // lpfn必须指向DLL中的钩子子程。
       // 除此以外,lpfn可以指向当前进程的一段钩子子程代码。
       // 钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。
         HINSTANCE hMod,  // 应用程序实例的句柄。标识包含lpfn所指的子程的DLL。
       // 如果dwThreadId 标识当前进程创建的一个线程,
       // 而且子程代码位于当前进程,hMod必须为NULL。
       // 可以很简单的设定其为本应用程序的实例句柄。
         DWORD dwThreadId // 与安装的钩子子程相关联的线程的标识符。
       // 如果为0,钩子子程与所有的线程关联,即为全局钩子。
                     ); 
      函数成功则返回钩子子程的句柄,失败返回NULL。  以上所说的钩子子程与线程相关联是指在一钩子链表中发给该线程的消息同时发送给钩子子程,且被钩子子程先处理。    在钩子子程中调用得到控制权的钩子函数在完成对消息的处理后,如果想要该消息继续传递,那么它必须调用另外一个SDK中的API函数CallNextHookEx来传递它,以执行钩子链表所指的下一个钩子子程。这个函数成功时返回钩子链中下一个钩子过程的返回值,返回值的类型依赖于钩子的类型。这个函数的原型如下:LRESULT CallNextHookEx
    (
    HHOOK hhk;
    int nCode;
    WPARAM wParam;
    LPARAM lParam;
     );

    hhk为当前钩子的句柄,由SetWindowsHookEx()函数返回。
    NCode为传给钩子过程的事件代码。
    wParam和lParam 分别是传给钩子子程的wParam值,其具体含义与钩子类型有关。

        钩子函数也可以通过直接返回TRUE来丢弃该消息,并阻止该消息的传递。否则的话,其他安装了钩子的应用程序将不会接收到钩子的通知而且还有可能产生不正确的结果。    钩子在使用完之后需要用UnHookWindowsHookEx()卸载,否则会造成麻烦。释放钩子比较简单,UnHookWindowsHookEx()只有一个参数。函数原型如下:UnHookWindowsHookEx
    (
    HHOOK hhk;
    );
    函数成功返回TRUE,否则返回FALSE。
      

  44.   

    WINDOWS的钩子函数可以认为是WINDOWS的主要特性之一。利用它们,您可以捕捉您自己进程或其它进程发生的事件。通过“钩挂”,您可以给WINDOWS一个处理或过滤事件的回调函数,该函数也叫做“钩子函数”,当每次发生您感兴趣的事件时,WINDOWS都将调用该函数。一共有两种类型的钩子:局部的和远程的。 
      局部钩子仅钩挂您自己进程的事件。 
      远程的钩子还可以将钩挂其它进程发生的事件。远程的钩子又有两种: 
      基于线程的 它将捕获其它进程中某一特定线程的事件。简言之,就是可以用来观察其它进程中的某一特定线程将发生的事件。 
      系统范围的 将捕捉系统中所有进程将发生的事件消息。 
      安装钩子函数将会影响系统的性能。监测“系统范围事件”的系统钩子特别明显。因为系统在处理所有的相关事件时都将调用您的钩子函数,这样您的系统将会明显的减慢。所以应谨慎使用,用完后立即卸载。还有,由于您可以预先截获其它进程的消息,所以一旦您的钩子函数出了问题的话必将影响其它的进程。记住:功能强大也意味着使用时要负责任。
      在正确使用钩子函数前,我们先讲解钩子函数的工作原理。当您创建一个钩子时,WINDOWS会先在内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去。新的钩子将加到老的前面。当一个事件发生时,如果您安装的是一个局部钩子,您进程中的钩子函数将被调用。如果是一个远程钩子,系统就必须把钩子函数插入到其它进程的地址空间,要做到这一点要求钩子函数必须在一个动态链接库中,所以如果您想要使用远程钩子,就必须把该钩子函数放到动态链接库中去。当然有两个例外:工作日志钩子和工作日志回放钩子。这两个钩子的钩子函数必须在安装钩子的线程中。原因是:这两个钩子是用来监控比较底层的硬件事件的,既然是记录和回放,所有的事件就当然都是有先后次序的。所以如果把回调函数放在DLL中,输入的事件被放在几个线程中记录,所以我们无法保证得到正确的次序。故解决的办法是:把钩子函数放到单个的线程中,譬如安装钩子的线程。
      钩子一共有14种,以下是它们被调用的时机: 
      WH_CALLWNDPROC 当调用SendMessage时 
      WH_CALLWNDPROCRET 当SendMessage的调用返回时 
      WH_GETMESSAGE 当调用GetMessage 或 PeekMessage时 
      WH_KEYBOARD 当调用GetMessage 或 PeekMessage 来从消息队列中查询WM_KEYUP 或 WM_KEYDOWN 消息时 
      WH_MOUSE 当调用GetMessage 或 PeekMessage 来从消息队列中查询鼠标事件消息时 
      WH_HARDWARE 当调用GetMessage 或 PeekMessage 来从消息队列种查询非鼠标、键盘消息时 
      WH_MSGFILTER 当对话框、菜单或滚动条要处理一个消息时。该钩子是局部的。它时为那些有自己的消息处理过程的控件对象设计的。 
      WH_SYSMSGFILTER 和WH_MSGFILTER一样,只不过是系统范围的 
      WH_JOURNALRECORD 当WINDOWS从硬件队列中获得消息时 
      WH_JOURNALPLAYBACK 当一个事件从系统的硬件输入队列中被请求时 
      WH_SHELL 当关于WINDOWS外壳事件发生时,譬如任务条需要重画它的按钮. 
      WH_CBT 当基于计算机的训练(CBT)事件发生时 
      WH_FOREGROUNDIDLE 由WINDOWS自己使用,一般的应用程序很少使用 
      WH_DEBUG 用来给钩子函数除错
      

  45.   

    呵呵,不过毕竟因为没有实现那些特定的接口,功能有限。Web 方式下可以通过 external 获得外部窗口的参数,toolbar 方面我没研究过,但在 contextmenu 中可以仿照 flashget 来做——看 flashget 目录下的 jc_link.htm 和 jc_all.htm,实际上都是 javascript 调用 :)
      

  46.   

    查查VC的头文件,你发现,在NT内核下,这两个钩子特别有用(特别对VB的同胞)
    WH_KEYBOARD_ll    实现全局键盘挂钩,不用dll
    WH_MOUSE_ll       实现全局鼠标挂钩,不用dll
      

  47.   

    To:piggybank(吞硬币的小猪) 兄:
       我试着创建了piggyToolBar.reg,呵呵。这个方法不错啊!可是还是离想象的效果有些偏差。:(
       事已至此,我也非常想知道用VB如何写出来符合如题要求的Com来。如果吞硬币的小猪哥哥,您有时间的话,能不能写个范例给菜鸟看看呢? :)
       再次谢谢小猪哥!(另:为什么叫吞硬币的小猪呢?便便可是有困难的,要是早晨起来屎涨........)
      

  48.   

    To:yefanqiu(叶帆)兄
       呵呵。早就看过不少仁兄的帖子。今日得到叶帆兄指点,非常荣幸啊!呵呵
       有关于Hook的文字简直是太少了。更不要说例子了。谢谢你贴出来关于Hook的概念,什么时候您有时间的话,再向您仔细讨教。 :)
      

  49.   

    可以找相关的书籍系统的看看,关于HOOK和回掉函数。HOOK其实类似与系统的后门,用与调试。书上讲的比较系统全面,推荐 window核心编程 一书,在网上能找到下载的
      

  50.   

    谢谢jlum99(闲人) 兄! 揭帖了要!  :)
      

  51.   

    piggybank 直译是 “小猪形象的存钱罐”,就是我们说的“扑满”。
    叫这个名字是取其 厚积薄发 之意,呵呵用 VB 实现相关的一些接口可能比较困难(如果是别人可能直接告诉你不行,但我用vb也做过一些比较特殊的接口,只有试验之后才能知道结果了),最好还是学习 VC/ATL,并不难的。
      

  52.   

    shdocvw.dll 实际上就是我们的 ie 的核心——显示 html 就靠它了
    你如果要执行本地程序,实际上用我的例子里面的方法——用shdocvw.dll,也就是网页,那么就会遇到访问本地文件权限的问题,网页会提示用户。
    所以,最好是自己写一个组件来代替 shdocvw.dll原理其实一样的,shdocvw.dll实现了某几个特殊的接口,你的组件也必须实现。
    呵呵,不好意思我还没工夫试试看用vb来实现这些接口,一会儿我看看有没有时间试试看。