P/Invoke 光标的操作


获取与设置光标在屏幕上的位置 

  GetCursorPos 获取光标在屏幕上的位置,光标位置始终是在屏幕坐标纵指定的,并且不受包含光标的窗口映射模式的影响

    函数原型:

      BOOL GetCursorPos(LPPOINT lpPoint);

    参数说明:

      lpPoint:类型LPPOINT,输出参数;一个指向光标在屏幕坐标点的结构指针

    返回值:

      BOOL类型,调用成功返回非0,失败返回0;

  SetCursorPos 设置光标在屏幕上的位置,如果新的坐标不是由最新的ClipCursor函数调用设置的屏幕矩形中,系统自动调整坐标以便光标停留在该矩形内

    函数原型:

      BOOL SetCursorPos(int X,int Y);

    参数说明:

      X:类型int,输入参数;设置光标在屏幕坐标中的x坐标

      Y:类型int,输入参数;设置光标在屏幕坐标中的y坐标

    返回值:

       BOOL类型,调用成功返回非0,失败返回0;

  C#代码调用案例

    /// 
    /// 光标的坐标
    /// 
    [StructLayout(LayoutKind.Sequential)]
    public struct LPPOINT
    {
        public int X;
        public int Y;
    }
 1         //获取光标位置
 2         [DllImport("user32.dll", EntryPoint = "GetCursorPos")]
 3         unsafe public static extern bool GetCursorPos(LPPOINT* lpPoint);
 4         //设置光标位置
 5         [DllImport("user32.dll", EntryPoint = "SetCursorPos")]
 6         public static extern bool SetCursorPos(int X, int Y);
 7 
 8         unsafe static void Main(string[] args)
 9         {
10             int x = 100, y = 100;
11             for (int i = 0; i < 200; i++)
12             {
13                 SetCursorPos(x + i, y + i);
14                 LPPOINT lpPoint;
15                 GetCursorPos(&lpPoint);
16                 Console.WriteLine("[x:{0},y:{1}]", lpPoint.X, lpPoint.Y);
17                 Thread.Sleep(50);
18             }
19             Console.ReadKey();
20         }

获取当前光标句柄

  GetCursor 获取当前光标的句柄

    函数原型:

       HCURSOR WINAPI GetCursor(void);

    参数说明:

      无参

    返回值:

       返回当前光标的句柄,如果没有返回NULL

  C#代码调用案例

1         [DllImport("user32.dll", EntryPoint = "GetCursor")]
2         public static extern IntPtr GetCursor();
3 
4         unsafe static void Main(string[] args)
5         {
6             Console.WriteLine(GetCursor());
7             Console.ReadKey();
8         }

获取全局光标信息

  GetCursorInfo 获取全局光标的信息

    函数原型:

      BOOL GetCursorInfo(PCURSORINFO pci);

    参数说明:

      pci:PCURSORINFO类型,输入输出参数;一个指向PCURSORINFO的结构体的指针,函数调用前必须设置参数结构体cSize成员的值为sizeof(CURSORINFO)

    返回值:

       BOOL类型,调用成功返回非0,失败返回0;

  C#代码调用案例

 1     public struct CURSORINFO
 2     {
 3         public int cbSize;//结构体的大小,可通过sizeof(CURSORINFO)获取赋值
 4         public int flags; //值为0光标隐藏;值为0x00000001光标显示;值为0x00000002禁用光标,该标志显示系统未绘制光标,用户通过触控输入而不是鼠标
 5         public IntPtr hCursor;//光标句柄
 6         public LPPOINT ptScreenPos;//光标在屏幕上的坐标
 7     }
 8 
 9     class Program
10     {
11         [DllImport("user32.dll", EntryPoint = "GetCursorInfo")]
12         unsafe public static extern bool GetCursorInfo(CURSORINFO* pci);
13 
14         unsafe static void Main(string[] args)
15         {
16             CURSORINFO pci;
17             pci.cbSize = sizeof(CURSORINFO);
18             GetCursorInfo(&pci);
19             Console.WriteLine("cbSize:{0},flags:{1},hCursor:{2},[X:{3},Y:{4}]",
20                 pci.cbSize, pci.flags, pci.hCursor, pci.ptScreenPos.X, pci.ptScreenPos.Y);
21             Console.ReadKey();
22         }
23     }

限定光标位置

  ClipCursor 将光标限定在举行区域内

    函数原型:

      BOOL WINAPI ClipCursor(const RECT * lpRect);

    参数说明:

      lpRect:RECT类型,输入参数;一个包含左上角和右下角的屏幕坐标结构指针,如果设置为NULL,则光标可以任意移动到屏幕上的任何位置

    返回值:

       BOOL类型,调用成功返回非0,失败返回0;

  C#代码调用案例

 1     public struct RECT
 2     {
 3         public int left;//矩形的左上角的x坐标
 4         public int top;//矩形的左上角的y坐标
 5         public int right;//矩形的右下角的x坐标
 6         public int bottom;//矩形的右下角坐标
 7     }
 8 
 9     class Program
10     {
11         [DllImport("user32.dll", EntryPoint = "ClipCursor")]
12         unsafe public static extern IntPtr ClipCursor(RECT* lpRect);
13 
14         unsafe static void Main(string[] args)
15         {
16             RECT rect;
17             rect.left = 100;
18             rect.top = 100;
19             rect.right = 200;
20             rect.bottom = 200;
21             ClipCursor(&rect);
22             Console.ReadKey();
23         }
24     }

Header---Winuser.h

Library---user32.dll

参考资源:https://msdn.microsoft.com/zh-cn/vstudio/ms646970%28v=vs.90%29

使用案例:https://msdn.microsoft.com/zh-cn/vstudio/ms648380%28v=vs.90%29#_win32_Creating_a_Cursor