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。这将整个操作封装在面板中,避免了在面板类之外处理的需要。这不需要是一个位于单独、不可见窗体上的不可见面板吗?听起来没那么简单。(尽管有办法做到这一点)这难道不需要一个单独的、不可见的窗体上的不可见面板吗?听起来没那么简单。(不过,有办法做到这一点)