C# 为指定的屏幕区域实现鼠标悬停和鼠标单击事件

C# 为指定的屏幕区域实现鼠标悬停和鼠标单击事件,c#,winforms,C#,Winforms,我在屏幕上有一些指定的区域(不是在窗体上,而是在屏幕上),例如,它位于屏幕右上角的区域 Rectangle specifiedRegion = new Rectangle(*,*,*,*); 我想为该区域实现鼠标悬停和鼠标点击事件。当鼠标在该区域上方时,该区域会出现一些按钮或图片。若用户单击该区域,则执行鼠标单击事件 我怎么做?请提供一些代码或好的链接 C#,VS 2008,.net 2.0,3.5在我们开始之前只是一个警告,解决方案不会很漂亮,因为您不能完全在托管代码中完成这项工作 现在:

我在屏幕上有一些指定的区域(不是在窗体上,而是在屏幕上),例如,它位于屏幕右上角的区域

Rectangle specifiedRegion = new Rectangle(*,*,*,*);
我想为该区域实现鼠标悬停和鼠标点击事件。当鼠标在该区域上方时,该区域会出现一些按钮或图片。若用户单击该区域,则执行鼠标单击事件

我怎么做?请提供一些代码或好的链接


C#,VS 2008,.net 2.0,3.5

在我们开始之前只是一个警告,解决方案不会很漂亮,因为您不能完全在托管代码中完成这项工作

现在:

为了拦截发送给其他应用程序的消息,您需要使用User32.dll进行一些本机调用。如果你想用你想要的艰难方式来解决这一切

假设你不是受虐狂,我在上面找到了一个很好的C#library,它比你自己手动截取这些信息要容易得多。使用鼠标位置的X和Y坐标为鼠标消息设置回调。您可以使用其
Contains
方法确定鼠标消息是否在
矩形的范围内

specifiedRegion.Contains(mouseLocation); //where mouseLocation is a Point
User32还具有为屏幕获取设备上下文所需的功能:

[DllImport("User32.dll")]
public static extern IntPtr GetDC(IntPtr hwnd);

[DllImport("User32.dll")]
public static extern void ReleaseDC(IntPtr dc);
要获取屏幕的DC,请使用以下调用
GetDC

IntPtr screenDC = GetDC(IntPtr.Zero);
有了这个DC,我们可以得到C#
图形
对象并开始绘图

Graphics g = Graphics.FromHdc(screenDC);
请记住处置
图形
对象,并在完成后释放DC,否则将导致内存泄漏

g.Dispose();
ReleaseDC(screenDC);

在我们开始之前,只是一个警告,解决方案不会很漂亮,因为您不能完全在托管代码中完成这项工作

现在:

为了拦截发送给其他应用程序的消息,您需要使用User32.dll进行一些本机调用。如果你想用你想要的艰难方式来解决这一切

假设你不是受虐狂,我在上面找到了一个很好的C#library,它比你自己手动截取这些信息要容易得多。使用鼠标位置的X和Y坐标为鼠标消息设置回调。您可以使用其
Contains
方法确定鼠标消息是否在
矩形的范围内

specifiedRegion.Contains(mouseLocation); //where mouseLocation is a Point
User32还具有为屏幕获取设备上下文所需的功能:

[DllImport("User32.dll")]
public static extern IntPtr GetDC(IntPtr hwnd);

[DllImport("User32.dll")]
public static extern void ReleaseDC(IntPtr dc);
要获取屏幕的DC,请使用以下调用
GetDC

IntPtr screenDC = GetDC(IntPtr.Zero);
有了这个DC,我们可以得到C#
图形
对象并开始绘图

Graphics g = Graphics.FromHdc(screenDC);
请记住处置
图形
对象,并在完成后释放DC,否则将导致内存泄漏

g.Dispose();
ReleaseDC(screenDC);

有一个非常简单的方法可以做到这一点。只需在希望发生这种情况的区域中创建一个面板控件。使用panel控件的mousemove和mouseclick事件捕获输入,您甚至可以将所需的任何图像直接复制到panel。这将整个操作封装在面板中,避免了在面板类之外处理的需要。

有一种非常简单的方法可以做到这一点。只需在希望发生这种情况的区域中创建一个面板控件。使用panel控件的mousemove和mouseclick事件捕获输入,您甚至可以将所需的任何图像直接复制到panel。这将整个操作封装在面板中,避免了在面板类之外处理的需要。

这不需要是一个位于单独、不可见窗体上的不可见面板吗?听起来没那么简单。(尽管有办法做到这一点)这难道不需要一个单独的、不可见的窗体上的不可见面板吗?听起来没那么简单。(不过,有办法做到这一点)