如何获取系统当前 鼠标指针样式的值

futurecs 2012-07-26 07:05:15
要做一个远程控制程序,现在需求服务端系统鼠标指针样式发生变化时能获取到变化成什么状态,通知让客户端鼠标也变成相同样式,比如从IDC_ARROW变为IDC_WAIT,如何能截获到IDC_ARROW和IDC_WAIT的值呢? 我用GetCursorInfo得到的信息只有坐标,没有指针样式的数值, 截获WM_SETCURSOR消息,其中也没发现相应的值,该如何获取呢?
...全文
1696 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
牛虻&专家 2012-07-31
  • 打赏
  • 举报
回复
GetCursor和SetCursor的应用
futurecs 2012-07-31
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
你可以使用下VNC,他的鼠标形状,你是自定义的,也是可以传输到控制端的,它就是开了一条线程来判断鼠标的句柄有没有改变,有改变的话就,就认为形状有变化,然后取得鼠标的位图数据,发送到控制端,具体去看MouseShapeDetector.cpp单元吧~~
[/Quote]

试了下Tigthvnc,截取鼠标的代码应该在WindowsMouseGrabber中,而且不支持ANI格式的动态光标。动态的光标只是以静态传输。

他判断鼠标变化的代码是
bool WindowsMouseGrabber::isCursorShapeChanged()
{
HCURSOR hCursor = getHCursor();
if (hCursor == m_lastHCursor) {
return false;
}
m_lastHCursor = hCursor;

return true;
}

这在有些情况下是没法判断鼠标变化的,比如你在控制服务端的时候,通过服务端的控制面板改变鼠标指针方案,修改完后 鼠标指针样式不会立即变化。

我测试过, 系统自带的那些指针方案,不管改成哪种样式的,相同状态下的鼠标句柄值都是一样的, 例如WinXP下默认的指针方案和恐龙(系统方案)对比,同样是在 <后台运行>状态时,虽然鼠标指针看上去一个是恐龙,一个是小沙漏,但是获取的HCURSOR句柄是完全相同的。

而我的目的是需要知道鼠标的状态,而不是具体的形状,目前的解决办法是先取得当前鼠标的句柄,然后和LoadCursor(NULL,IDC_xxxx);获取的句柄进行对比,

如果获取的句柄 == LoadCursor(NULL,IDC_CROSS); 那就告诉客户端变成 十字光标
如果获取的句柄 == LoadCursor(NULL,IDC_IBEAM); 那就告诉客户端变成 工字光标
以此类推,如果都无法识别的就只能告诉客户端变成 普通指针。

这种办法的缺点就是一些用自定义鼠标样式的程序就只能一直显示普通剪头,而且像Excel中改变列宽和行高的那种鼠标状态也无法识别,因为那种样式是在系统默认列表里没有的。 QQ的远程协助就和我描述的状态一样。

看来只有传输鼠标图像或者这种方案了。

晚一些再结贴。
lqfcu2 2012-07-30
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

引用 12 楼 的回复:
要是别人使用的不是标准的系统鼠标样式,你怎么办,还是得传鼠标的图形过去,这个鼠标的图标文件很小的,你可以参考下VNC的鼠标是怎么传输到客户端的~~


WIN自带的远程协助都是把鼠标传输到客户端,而且ANI格式的动画鼠标都可以显示,不知道VNC是否可以。

好吧,可能我对系统鼠标状态的理解有问题,可能系统自己都不知道鼠标现在是不是在一个输入框中,是不是在某……
[/Quote]

你可以使用下VNC,他的鼠标形状,你是自定义的,也是可以传输到控制端的,它就是开了一条线程来判断鼠标的句柄有没有改变,有改变的话就,就认为形状有变化,然后取得鼠标的位图数据,发送到控制端,具体去看MouseShapeDetector.cpp单元吧~~
futurecs 2012-07-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
要是别人使用的不是标准的系统鼠标样式,你怎么办,还是得传鼠标的图形过去,这个鼠标的图标文件很小的,你可以参考下VNC的鼠标是怎么传输到客户端的~~
[/Quote]

WIN自带的远程协助都是把鼠标传输到客户端,而且ANI格式的动画鼠标都可以显示,不知道VNC是否可以。

好吧,可能我对系统鼠标状态的理解有问题,可能系统自己都不知道鼠标现在是不是在一个输入框中,是不是在某个窗口的边缘可以改变窗口大小,这些完全是由程序告诉系统的。
lqfcu2 2012-07-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

还有没有高手来回答一下……
[/Quote]

要是别人使用的不是标准的系统鼠标样式,你怎么办,还是得传鼠标的图形过去,这个鼠标的图标文件很小的,你可以参考下VNC的鼠标是怎么传输到客户端的~~
futurecs 2012-07-30
  • 打赏
  • 举报
回复
还有没有高手来回答一下……
futurecs 2012-07-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
GetClassLong(hWnd,GCL_HCURSOR);
[/Quote]

这个好像也达不到我的需求,或者是我使用方法不对?

我是通过GetCursorPos先获取鼠标位置,然后WindowFromPoint 获取 hWnd
然后GetClassLong(hWnd,GCL_HCURSOR);
返回的值应该还是HCURSOR句柄吧?
futurecs 2012-07-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
那个结构体中不是有个HCURSOR句柄吗?
typedef struct {
DWORD cbSize;
DWORD flags;
HCURSOR hCursor;
POINT ptScreenPos;
} CURSORINFO, *PCURSORINFO, *LPCURSORINFO;[/Quote]
hCursor 句柄可以获取图像,我需要的不是图像,而是这个样式对应的一个ID, 然后通知客户机的鼠标也变成相同的样式,服务端的鼠标图像传输来,客户机也没法通过图像来设置系统的鼠标样式。
futurecs 2012-07-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
http://archive.cnblogs.com/a/1996573/
这个例子很详细
[/Quote]

这个例子是获取位图的,我的目的不是把远程机器的鼠标样式直接绘制在图像上传输出来,而是知道远程机器上的鼠标样式的ID,从而使本机的鼠标样式也变成相同的。

比如QQ的远程协助,本机控制远程的电脑,鼠标移动到远程电脑窗口的边缘,本机的鼠标也会变成改变大小的样式, 一定有一个消息是通知系统把鼠标改变成某种样式,但是spy不出来。
futurecs 2012-07-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
算了,你不如去比较一下
HCURSOR hcur = GetCursor();
HCURSOR harrow = AfxGetApp()-> LoadStandardCursor(IDC_ARROW);
if(hcur == harrow)
{
}
[/Quote]
试了一下,不错,算是一种办法, 但是如果应用程序自定义了鼠标的样式,比如把默认的箭头改成了彩色的,那么这么对比就不知道现在鼠标是什么状态了。

SetSystemCursor 这个参数可以把系统鼠标的各种状态替换成自定义图案,所以我觉得系统里应该还是有什么办法取到当前鼠标是什么状态的,这样不管自定义成什么图形,都可以知道鼠标应该是什么状态。
futurecs 2012-07-27
  • 打赏
  • 举报
回复
换个思路说,Windows 鼠标无非就是以下这些状态,我只是想知道系统当前鼠标是什么状态,我不会在乎是什么样的图形。

还是说Windows 鼠标根本就没有这个状态,而是实时判断鼠标移动到什么位置该加载什么光标?

IDC_APPSTARTING 标准的箭头和小沙漏
IDC_ARROW 标准的箭头
IDC_CROSS 十字光标
IDC_HELP 标准的箭头和问号
IDC_IBEAM 工字光标
IDC_NO 禁止圈
IDC_SIZEALL 四向箭头指向东、西、南、北
IDC_SIZENESW 双箭头指向东北和西南
IDC_SIZENS 双箭头指向南北
IDC_SIZENWSE 双箭头指向西北和东南
IDC_SIZEWE 双箭头指向东西
IDC_UPARROW 垂直箭头
IDC_WAIT 沙漏
zgszft 2012-07-27
  • 打赏
  • 举报
回复
算了,你不如去比较一下
HCURSOR hcur = GetCursor();
HCURSOR harrow = AfxGetApp()-> LoadStandardCursor(IDC_ARROW);
if(hcur == harrow)
{
}
Eleven 2012-07-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
要做一个远程控制程序,现在需求服务端系统鼠标指针样式发生变化时能获取到变化成什么状态,通知让客户端鼠标也变成相同样式,比如从IDC_ARROW变为IDC_WAIT,如何能截获到IDC_ARROW和IDC_WAIT的值呢? 我用GetCursorInfo得到的信息只有坐标,没有指针样式的数值, 截获WM_SETCURSOR消息,其中也没发现相应的值,该如何获取呢?
[/Quote]
那个结构体中不是有个HCURSOR句柄吗?
typedef struct {
DWORD cbSize;
DWORD flags;
HCURSOR hCursor;
POINT ptScreenPos;
} CURSORINFO, *PCURSORINFO, *LPCURSORINFO;
长尾巴的悟空 2012-07-26
  • 打赏
  • 举报
回复
应该解决了~给分吧,哈哈!
小马喝水 2012-07-26
  • 打赏
  • 举报
回复
zgszft 2012-07-26
  • 打赏
  • 举报
回复
GetClassLong(hWnd,GCL_HCURSOR);

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧