本文以鼠标挂钩为例,介绍如何设置特定于某个线程的挂钩和特定于某个挂钩过程的挂钩。您可以使用挂钩监视特定类型的事件。您可以将这些事件作为一个调用线程与一个特定的线程或同一桌面中的所有的线程关联起来。
返回页首
设置鼠标挂钩
若要设置挂钩,请从 User32.dll 文件中调用
SetWindowsHookEx 函数。此函数可将一个应用程序定义的挂钩过程安装到与此挂钩关联的挂钩链中。
若要设置一个鼠标挂钩并监视鼠标事件,请按照以下步骤操作:
1. |
启动 Microsoft Visual Studio .NET。 |
2. |
在文件菜单上,指向新建,然后单击项目。 |
3. |
在新建项目对话框中,单击项目类型下的 Visual C# 项目,然后单击模板下的 Windows 应用程序。在名称框中键入 ThreadSpecificMouseHook。默认情况下将 Form1 添加到项目中。 |
4. |
将下面的代码行添加到 Form1.cs 文件中的其他 using 语句后面。using System.Runtime.InteropServices;
|
5. |
在 Form1 类中添加以下代码: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,
CallingConvention=CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode,
IntPtr wParam, IntPtr lParam);
|
6. |
向窗体添加 Button 控件,然后将下面的代码添加到 Button1_click 过程:private void button1_Click(object sender, System.EventArgs e)
{
if(hHook == 0)
{
// Create an instance of HookProc.
MouseHookProcedure = new HookProc(Form1.MouseHookProc);
hHook = SetWindowsHookEx(WH_MOUSE,
MouseHookProcedure,
(IntPtr)0,
AppDomain.GetCurrentThreadId());
//If SetWindowsHookEx fails.
if(hHook == 0 )
{
MessageBox.Show("SetWindowsHookEx Failed");
return;
}
button1.Text = "UnHook Windows Hook";
}
else
{
bool ret = UnhookWindowsHookEx(hHook);
//If UnhookWindowsHookEx fails.
if(ret == false )
{
MessageBox.Show("UnhookWindowsHookEx Failed");
return;
}
hHook = 0;
button1.Text = "Set Windows Hook";
this.Text = "Mouse Hook";
}
}
|
7. |
在 Form1 类中为 MouseHookProc 函数添加下面的代码:public static int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
//Marshall the data from callback.
MouseHookStruct MyMouseHookStruct = (MouseHookStruct) Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));
if (nCode < 0)
{
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
else
{
//Create a string variable with shows current mouse. coordinates
String strCaption = "x = " +
MyMouseHookStruct.pt.x.ToString("d") +
" y = " +
MyMouseHookStruct.pt.y.ToString("d");
//Need to get the active form because it is a static function.
Form tempForm = Form.ActiveForm;
//Set the caption of the form.
tempForm.Text = strCaption;
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
}
|
8. |
按 F5 键运行此项目,然后单击窗体上的按钮以设置此挂钩。当指针在窗体上移动时,鼠标坐标将出现在窗体标题栏上。再次单击此按钮可删除此挂钩。 |
返回页首
在 .NET 框架中不支持全局挂钩
您无法在 Microsoft .NET 框架中实现全局挂钩。若要安装全局挂钩,挂钩必须有一个本机动态链接库 (DLL) 导出以便将其本身插入到另一个需要调入一个有效而且一致的函数的进程中。这需要一个 DLL 导出,而 .NET 框架不支持这一点。托管代码没有让函数指针具有统一的值这一概念,因为这些函数是动态构建的代理。
返回页首
有关窗口挂钩的更多信息,请参见下面的 MSDN 文档:
相关推荐
Visual C# .NET程序设计经典。经典编程实例源代码,分章节发送。
Visual C# .NET程序设计经典 配套光盘 科学工业出版社
Visual C#.NET开发实践:Visual C#.NET开发实践.rar
本书是一本讲解如何通过Visual C#.NET开发应用软件的书籍,它以5个实际项目为依托,全面而系统地再现了项目开发的实际过程,具有很大的实用价值和参考意义。 全书首先介绍SQL Server 2000基础知识、ADO.NET基础...
应用程序设计编制(Visual C#平台)Visual C# .NET试题汇编(程序员级)
部分概要介绍了visual c# .net程序设计 的基础知识;第?部分讲述了visual c# .net的高级应用,介绍与过去的 编程语言相比的独到之处;第?部分介绍了windows窗体设计,详细地讲述 了windows窗体的用法,...
MCAD-MCSD制胜宝典—用Visual Basic .NET和Visual C#.NET开发XML Web服务与服务器组件。
Visual C#.NET数据库开发经典案例解析 王晟编著
Visual C#.NET网络编程Visual C#.NET网络编程
Visual C#.NET 程序设计教程课后答案(罗福强、白忠建)习题答案1-14
综合应用案例篇通过“类联众游戏大厅的网络象棋”综合性案例,配以详细的代码说明和图片解释,使读者在掌握原理篇中提供的技术或技巧后,使用这些技术尝试实现更为复杂的功能,在实践中掌握和领会Visual C#.NET编程...
这个是我从学校图书馆上下载的数字图像处理--Visual C#.NET编程与实验光盘镜像,解压以后得到iso的镜像文件
包括ppt课件和随书源代码,颇具参考价值……
Visual C# .NET 网络核心编程
Visual C#.NET数据库开发经典案例解析之生产管理系统 完整的文档说明,适合刚接触java数据库开发编程的朋友
介绍使用Visual C#.NET来开发网络程序的
深入解析Visual C#.Net,需要有一定的编程基础
非常经典的高校C# .net开发教程,《Visual C#.NET程序设计》作者,李兰友,杨晓光,清华出版社,北交出版社,含有书籍和源码。 本书主要介绍Visual C#.NET应用程序设计技术。内容包括:Visual C#.NET集成环境,常用...
8 Visual C#.NET 入门与进阶 programmimg
Visual C#.NET案例开发集锦 源代码类