注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

yeye55的博客

编程就象品一杯清茶,清淡却又深厚。

 
 
 

日志

 
 
关于我

宅男一只,喜欢编程。没事的时候就喜欢抱着电脑看看电影、看看动漫、听听音乐、打打网游、逛逛论坛。清静的时候喜欢专研编程技术,但是发现自己至今仍然只是一只三脚猫。

网易考拉推荐

截取鼠标指针的图片  

2011-11-03 14:52:21|  分类: 辅助程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

  本文最早于2008年5月26日在编程论坛(programbbs.com)上发表,页面地址:http://programbbs.com/bbs/view12-10736-1.htm 。

  Windows下的鼠标经常会显示出不同的样子以提示当前的操作,所以对于很多程序来说截取鼠标指针当前的图片并进行分析是很有用处的,下面分析两种截取鼠标指针的图片的方法并给出一个示范程序。

  截取鼠标指针的图片首先要取得鼠标的句柄,然后用API函数DrawIconEx将其绘制在画布上,注意在Windows下鼠标指针(Cursor)和图标(Icon)是没有区别的,利用DrawIconEx的第七个参数istepIfAniCur可以将动态光标的不同帧绘制在画布上,具体的应用可以查看MSDN。

  取得鼠标的句柄的第一种方法是利用API函数GetCursorInfo,很奇怪在MSDN6.0中查不到这个函数,无论鼠标是否停留在本进程的窗口上,利用这个函数都可以取得鼠标的信息,示范代码如下:

//方案1
function Fun1: HCURSOR;
var
    hCur : TCursorInfo;
begin
     ZeroMemory(@hCur,sizeof(hCur));
     hCur.cbSize:=SizeOf(hCur);
    GetCursorInfo(hCur);
    result:=hCur.hCursor;
end;

  取得鼠标的句柄的第二种方法是利用API函数GetCursor,一般情况下,只有当鼠标停留在本进程的窗口上,这个函数才返回正确的鼠标句柄,否则只返回默认的鼠标句柄,也就是小箭的样子,不过可以利用API函数AttachThreadInput将两个进程进行输入绑定,这样当鼠标停留在其它进程的窗口上,就或以返回正确的鼠标句柄,示范代码如下:

//方案2
function Fun2: HCURSOR;
var
    wid : HWND;
    tid : DWORD;
begin
     wid:=GetForegroundWindow; //获取最前面的窗口
     tid:=GetWindowThreadProcessId(wid,nil); //获取窗口所在的进程
     AttachThreadInput(GetCurrentThreadId,tid,true);
    result:=GetCursor;
     AttachThreadInput(GetCurrentThreadId,tid,false);
end;

  显然第一种方法要优于第二种方法。获得鼠标句柄后的绘制就简单了,绘制后的分析属于图片分析技术这里就不讨论了。我做的示范程序如下:

图1

  按“Alt”键可以进行截图,单击“保存截取图片”按纽可以保存截到的图片。这个程序中默认只绘制动态指针的第一帧图片。使用方案2时默认获取最前面窗口的鼠标指针,否则只绘制默认的鼠标图片。这个程序自带了一个KeyHook.dll文件,这是一个键盘钩子程序,用以监视Alt键的按下。

  项目文件下载(点这里

  可执行文件下载(点这里

  解决一个问题的方法通常有很多,我只知道上面的两种方法,如果有高手知道其它方法欢迎讨论。

  评论这张
 
阅读(812)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017