我在屏幕上有一些指定区域(不在表格上,但在屏幕上),例如,它是屏幕右上角的区域。
Rectangle specifiedRegion = new Rectangle(*,*,*,*);
我想为该区域实现鼠标悬停和鼠标点击事件。当鼠标位于该区域上方时,该区域会出现一些按钮或图片。如果用户单击该区域,则执行鼠标单击事件。
我该怎么办?请提供一些代码或良好的链接。
C#,VS 2008,.net 2.0,3.5
答案 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事件捕获输入,甚至可以将所需的任何图像直接复制到面板。这将整个操作封装在面板中,从而无需在面板类之外进行处理。