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#代码调用案例
/// <summary>
/// 光标的坐标
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct LPPOINT
{
public int X;
public int Y;
}
//获取光标位置
[DllImport("user32.dll", EntryPoint = "GetCursorPos")]
unsafe public static extern bool GetCursorPos(LPPOINT* lpPoint);
//设置光标位置
[DllImport("user32.dll", EntryPoint = "SetCursorPos")]
public static extern bool SetCursorPos(int X, int Y); unsafe static void Main(string[] args)
{
int x = , y = ;
for (int i = ; i < ; i++)
{
SetCursorPos(x + i, y + i);
LPPOINT lpPoint;
GetCursorPos(&lpPoint);
Console.WriteLine("[x:{0},y:{1}]", lpPoint.X, lpPoint.Y);
Thread.Sleep();
}
Console.ReadKey();
}
获取当前光标句柄
GetCursor 获取当前光标的句柄
函数原型:
HCURSOR WINAPI GetCursor(void);
参数说明:
无参
返回值:
返回当前光标的句柄,如果没有返回NULL
C#代码调用案例
[DllImport("user32.dll", EntryPoint = "GetCursor")]
public static extern IntPtr GetCursor();
unsafe static void Main(string[] args)
{
Console.WriteLine(GetCursor());
Console.ReadKey();
}
获取全局光标信息
GetCursorInfo 获取全局光标的信息
函数原型:
BOOL GetCursorInfo(PCURSORINFO pci);
参数说明:
pci:PCURSORINFO类型,输入输出参数;一个指向PCURSORINFO的结构体的指针,函数调用前必须设置参数结构体cSize成员的值为sizeof(CURSORINFO)
返回值:
BOOL类型,调用成功返回非0,失败返回0;
C#代码调用案例
public struct CURSORINFO
{
public int cbSize;//结构体的大小,可通过sizeof(CURSORINFO)获取赋值
public int flags; //值为0光标隐藏;值为0x00000001光标显示;值为0x00000002禁用光标,该标志显示系统未绘制光标,用户通过触控输入而不是鼠标
public IntPtr hCursor;//光标句柄
public LPPOINT ptScreenPos;//光标在屏幕上的坐标
} class Program
{
[DllImport("user32.dll", EntryPoint = "GetCursorInfo")]
unsafe public static extern bool GetCursorInfo(CURSORINFO* pci); unsafe static void Main(string[] args)
{
CURSORINFO pci;
pci.cbSize = sizeof(CURSORINFO);
GetCursorInfo(&pci);
Console.WriteLine("cbSize:{0},flags:{1},hCursor:{2},[X:{3},Y:{4}]",
pci.cbSize, pci.flags, pci.hCursor, pci.ptScreenPos.X, pci.ptScreenPos.Y);
Console.ReadKey();
}
}
限定光标位置
ClipCursor 将光标限定在举行区域内
函数原型:
BOOL WINAPI ClipCursor(const RECT * lpRect);
参数说明:
lpRect:RECT类型,输入参数;一个包含左上角和右下角的屏幕坐标结构指针,如果设置为NULL,则光标可以任意移动到屏幕上的任何位置
返回值:
BOOL类型,调用成功返回非0,失败返回0;
C#代码调用案例
public struct RECT
{
public int left;//矩形的左上角的x坐标
public int top;//矩形的左上角的y坐标
public int right;//矩形的右下角的x坐标
public int bottom;//矩形的右下角坐标
} class Program
{
[DllImport("user32.dll", EntryPoint = "ClipCursor")]
unsafe public static extern IntPtr ClipCursor(RECT* lpRect); unsafe static void Main(string[] args)
{
RECT rect;
rect.left = ;
rect.top = ;
rect.right = ;
rect.bottom = ;
ClipCursor(&rect);
Console.ReadKey();
}
}
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
P/Invoke 光标的操作的更多相关文章
- 转载:C# this.invoke()作用 多线程操作UI 理解二
Invoke()的作用是:在应用程序的主线程上执行指定的委托.一般应用:在辅助线程中修改UI线程( 主线程 )中对象的属性时,调用this.Invoke(); //测试的窗体 public class ...
- C# this.invoke()作用 多线程操作UI
Invoke()的作用是:在应用程序的主线程上执行指定的委托.一般应用:在辅助线程中修改UI线程( 主线程 )中对象的属性时,调用this.Invoke(); //测试的窗体 public class ...
- js 光标选中 操作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- js光标定位操作
1. 自动选中区域内容 <html> <meta http-equiv="Content-Type" content="text/html; chars ...
- C#多线程操作界面控件的解决方案(转)
C#中利用委托实现多线程跨线程操作 - 张小鱼 2010-10-22 08:38 在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了 ...
- 使用ide编程时候 不知为何突然光标变宽,如何恢复成原有的细竖光标
各位朋友们, 你们在编程时候有没有这样的情况: 码着码着,突然不知什么原因,光标变成这样了: 这种宽的光标,不知道怎么调都调不回去,而且网上也没有类似的问题描述 就对我们编程极其不便(因为这种光标是操 ...
- Capslock+ 键盘党都爱的高效利器 - 让 Windows 快捷键操作更加灵活强大
Capslock+ 键盘党都爱的高效利器 - 让 Windows 快捷键操作更加灵活强大 优化辅助 Windows 2016-06-05 91,167 微博微信QQ空间印象有道邮件 ...
- day8 文件操作
文件基本操作 # 打开文件 f = open("小重山","r",encoding="utf-8") # readline 方法 只查看一行 ...
- python文件读取操作、序列化
1.对文件进行读写操作时,先建立文件句柄 f = open("test.txt","r",encoding="UTF-8") 其中,r为文件 ...
随机推荐
- 怎么解决深入学习PHP的瓶颈?
PHP给学习者的感觉是:初学的时候很容易,但是学了2-3年,就深刻感觉遇到了瓶颈,很难深入,放弃又可惜.所谓“鸡肋,食之无味弃之可惜”的感觉很是贴切. 经常会有这种感觉:不学,看似也不后退:学了,好像 ...
- 启用 DHCP
#开启DHCP协议 Get-NetIPInterface -Dhcp Disabled|Set-NetIPInterface -Dhcp Enabled #开启本机上所有博通网卡的DHCP Get-W ...
- MySQL 8.0.13的使用心得
今天在阿里云上安装了最新版的MySQL,把碰到的一些问题总结下 1.导入从另一台服务器dump的.sql,出现如下提示: ERROR at line xxx: Unknown command '\\' ...
- 理解基本包装类型Number,String,Boolean
在前面我们知道了引用类型是什么了,也就能理解包装类型了.包装对象其实也是一种引用类型,之所以要单独提出来只不过是因为它们可以把原始类型的值变成(包装成)对象,这样它们也就获得了各自类型相应的特殊行为了 ...
- 数据元&数据字典&元数据
1. 数据元 data element(数据元素),单个数据单元,是数据的基本单位.参阅data field(数据字段). 2. 元数据 首先,我们举个例子来看看什么叫做“元”,在后现代主义文学中有一 ...
- 使用QT开发GoogleMap瓦片显示和下载工具
之前做项目的时候经常遇到需要大量地图背景数据,然后没有数据被逼着去Google上下载瓦片数据在拼接成整张影像的工作,其实遥感影像晚上有很多可以下载到的,但是大部分是作为研究用的,作为GIS的背景图或者 ...
- mysql使用Navicat 导出和导入数据库
系统环境: Win7 x64软件准备:Navicat Premium_11.2.7简体中文版下载网址:http://www.cr173.com/soft/419023.html 现在我就向大家介绍 m ...
- Office365学习笔记—创建WikiPage
1,项目有个需求:项目表每更新一次,就把跟该项目有关的任务创建一个静态页(历史版本功能)! 注意事项:需要在页面上拖一个ContentEditer!将代码放在ContentEditer里面,因为我试过 ...
- Oracle中插入千万条测试数据
测试需求,id.姓名.邮箱.手机号不可重复 1.创建序列 create sequence id_sequence; //创建序列id_sequence 2.创建表 create table USERI ...
- iOS安装CocoaPods详细过程
iOS安装CocoaPods详细过程 一.简介 什么是CocoaPods CocoaPods是OS X和iOS下的一个第三类库管理工具,通过CocoaPods工具我们可以为项目添加被称为“Pods”的 ...