日期:2014-05-20  浏览次数:20632 次

在.net 2005 下全局钩子的问题
在2003下钩子函数可以正常的使用。但是放到2005下就会出错,在运行但不调试的情况下不会出错。在调试并运行的情况下就会出错,大家谁知道是为什么?怎么解决?

------解决方案--------------------

在.NET中用全局的钩子是会出错的.

这都是老问题了,全局的钩子在.NET环境下并不好用.不是全局的倒是可以使用的.这是.NET特性决定的.
如果一定要使用全局的钩子的话,可以用非托管的DLL程序来实现,比如用VC写一个标准的Win32的或MFC的DLL,然后在用.NET调用这个DLL.

因为全局钩子一定要在非托管的DLL中才能很好的发挥作用.
关于用非托管的DLL来实现全局钩子的例子,在codeproject里有,楼主可以找一下.

------解决方案--------------------
MSDN上的技术文章:

Knowledge Base

HOW TO: Set a Windows Hook in Visual C# .NET
PSS ID Number: 318804

Article Last Modified on 2/10/2003


--------------------------------------------
Microsoft .NET Framework SDK 1.0
Microsoft Visual C# .NET (2002)

--------------------------------------------
SUMMARY

*Set a Mouse Hook
*Global Hook Is Not Supported in .NET Framework
REFERENCES
SUMMARY
This article describes how to set a hook that is specific to a thread and to a hook procedure by using the mouse hook as an example. You can use hooks to monitor certain types of events. You can associate these events with a specific thread or with all of the threads in the same desktop as a calling thread.

Set a Mouse Hook
To set a hook, call the SetWindowsHookEx function from the User32.dll file. This function installs an application-defined hook procedure in the hook chain that is associated with the hook.

To set a mouse hook and to monitor the mouse events, follow these steps:
Start Microsoft Visual Studio .NET.
On the File menu, point to New, and then click Project.
In the New Project dialog box, click Visual C# Projects under Project Types, and then click Windows Application under Templates. In the Name box, type ThreadSpecificMouseHook. Form1 is added to the project by default.
Add the following line of code in the Form1.cs file after the other using statements:
using System.Runtime.InteropServices;

Add following code in the Form1 class:
public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);

//Declare hook handle as int.
static int hHook = 0;

//Declare mouse hook constant.
//For other hook types, you can obtain these values from Winuser.h in Microsoft SDK.
public const int WH_MOUSE = 7;
private System.Windows.Forms.Button button1;

//Declare MouseHookProcedure as HookProc type.
HookProc MouseHookProcedure;

//Declare wrapper managed POINT class.
[StructLayout(LayoutKind.Sequential)]
public class POINT
{
public int x;
public int y;
}

//Declare wrapper managed MouseHookStruct class.
[StructLayout(LayoutKind.Sequential)]
public class MouseHookStruct
{
public POINT pt;
public int hwnd;
public int wHitTestCode;
public int dwExtraInfo;
}

//Import for SetWindowsHookEx function.
//Use this function to install thread-specific hook.
[DllImport( "user32.dll ",CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn,
IntPtr hInstance, int threadId);

//Import for UnhookWindowsHookEx.
//Call this function to uninstall the hook.
[DllImport( "user32.dll ",CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);

//Import for CallNextHookEx.
//Use this function to pass the hook information to next hook procedure in chain.
[DllImport( "user32.dll ",CharSet=CharSet.Auto,