Windows API--光标的操作

Posted 养猪改变生活

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows API--光标的操作相关的知识,希望对你有一定的参考价值。

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

  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#代码调用案例

    /// <summary>
    /// 光标的坐标
    /// </summary>
    [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

以上是关于Windows API--光标的操作的主要内容,如果未能解决你的问题,请参考以下文章

捕获在 Windows 上显示动画系统光标的哪一步

Android 插件化VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )(代码片段

如何使用光标和循环显示来自 sqlite 的片段的 recyclerview

Android - 使用片段和简单的光标适配器填充列表视图

如何在文本区域标签中的特定光标位置插入选择标签下拉值作为文本片段?

Roblox api - 啥是“光标”参数