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

时间:2010-08-12 06:00:15

标签: c# winforms

我在屏幕上有一些指定区域(不在表格上,但在屏幕上),例如,它是屏幕右上角的区域。

Rectangle specifiedRegion = new Rectangle(*,*,*,*);

我想为该区域实现鼠标悬停和鼠标点击事件。当鼠标位于该区域上方时,该区域会出现一些按钮或图片。如果用户单击该区域,则执行鼠标单击事件。

我该怎么办?请提供一些代码或良好的链接。

C#,VS 2008,.net 2.0,3.5

2 个答案:

答案 0 :(得分:2)

在我们开始之前只是一个警告,解决方案不会很漂亮,AFAIK你不能在托管代码中完全做到这一点。

现在:

为了拦截到其他应用程序的消息,您需要使用User32.dll进行一些本机调用。如果你想要以SetWindowsHookEx开头的方式想出这一切。

假设你不是一个受虐狂,我在CodeProject找到了一个很好的C#库,它会比手动试图自己拦截这些消息更容易。使用鼠标位置的X和Y坐标设置鼠标消息的回调,您可以使用其Rectangle方法确定它是否在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对象并开始绘制。

Graphics g = Graphics.FromHdc(screenDC);

请记住在完成后放置Graphics对象并释放DC,否则会导致内存泄漏。

g.Dispose();
ReleaseDC(screenDC);

答案 1 :(得分:1)

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