按键精灵教程:控件实现抓抓获取句柄功能
在按键精灵论坛上看到了一个这样的问题:能不能添加一个类似“抓抓”抓句柄那样的控件?
有了这个控件,咱们可以放在QUI界面上,让用户自己获取窗口句柄,那么,通用同步器这类的脚本实现起来就轻松多了。
(ps:通用同步器是指能够兼容多种游戏窗口键鼠同步功能,也就是说没办法预先知道窗口的类名,标题名去获取窗口句柄,这个时候,抓抓句柄功能就很重要了。)
其实呢,“抓抓”抓句柄的功能,实现起来是很容易的,我们一起来操作看看。
实现功能
点击图片控件之后鼠标不松开,到了需要获取句柄的窗口松开鼠标,获取窗口句柄显示在标签控件里。(点击图片控件之后,按住鼠标左键光标形状改变,松开鼠标之后,光标恢复系统默认形状。)
思路&步骤
1、画一个计时器。时间间隔设置为200毫秒,有效设置为否(即:Timer1.Enabled=false)
2、在图像控件点击事件中:(图像控件中设置显示图像为:光标 )①调用api修改光标形状为:②将图像控件显示的图像改为:光标 ,点击之后就变为空的,就像是里面的光标跑走了一样。③Timer1控件的Enabled属性设置为True ,启动计时器。
3、在计时器Timer事件中,使用api函数GetAsyncKeyState检测上次按过的鼠标键,如果鼠标松开则:①使用MousePoint鼠标指向窗口命令获取当前鼠标指向的窗口句柄。②将获取到的窗口句柄显示在标签中。③将光标形状还原成系统默认形状
④将图像控件显示的图像改为:光标 最后将计时器Enabled属性设置为false,不可用。
修改光标要使用的api函数
函数
SetSystemCursor
函数功能
该函数使一个应用程序定制系统光标。
函数声明
PublicDeclareFunctionSetSystemCursorLib"user32"Alias"SetSystemCursor"(ByValhcurAsLong,ByValidAsLong)AsLong
函数语法
SetSystemCursor(hCur,id)
参数说明
hcur:替换的光标句柄。id:被替换的系统光标标识符。
函数
LoadCursorFromFile
函数功能
在一个指针文件或一个动画指针文件(扩展名分别是.cur和.ani)的基础上创建一个指针。//白话解释就是:获取一个光标文件的句柄
函数声明
PublicDeclareFunctionLoadCursorFromFileLib"user32"Alias"LoadCursorFromFileA"(ByVallpFileNameAsString)AsLong
函数语法
LoadCursorFromFile("c:\变化.cur")//引号中为光标文件所在地址
函数
SystemParametersInfo
函数功能
该函数使一个应用程序定制系统光标。
函数声明
PublicDeclareFunctionSystemParametersInfoLib"user32"Alias"SystemParametersInfoA"(ByValuActionAsLong,ByValuParamAsLong,lpvParamAsAny,ByValfuWinIniAsLong)
函数语法
SystemParametersinfo(uiAction,uiParam,pvParam,fWinlni)
参数说明
uiAction:该参数指定要查询或设置的系统级。本例子中,这个参数要取值为:SPI_SETCURSORS功能:重置系统光标。将ulParam参数设为0并且pvParam参数设为NULL。ulParam:与查询或设置的系统参数有关。关于系统级参数的详情。pvParam:与查询或设置的系统参数有关。关于系统级参数的详情。fWinlni:如果设置系统参数,则它用来指定是否更新用户配置文件(Profile)。亦或是否要将WM_SETTINGCHANGE消息广播给所有顶层窗口,以通知它们新的变化内容。本例子中,这个参数要取值为:SPIF_SENDCHANGED功能:在更新用户配置文件之后广播消息。
判断鼠标左键按下的api函数
函数
GetAsyncKeyState
函数功能
用来判断函数调用时指定虚拟键的状态。
函数声明
PrivateDeclareFunctionGetAsyncKeyStateLib"user32"(ByValvKeyAsLong)AsInteger
返回值
GetAsyncKeyState返回值等于1说明键已经被按过并且当前是松开的状态GetAsyncKeyState返回值等于0说明键是松开的状态GetAsyncKeyState返回值等于-32767说明键是按下的状态
调用api函数之前,要先声明,声明部分代码如下:
PublicDeclareFunctionSetSystemCursorLib"user32"Alias"SetSystemCursor"(ByValhcurAsLong,ByValidAsLong)AsLong
PublicDeclareFunctionLoadCursorFromFileLib"user32"Alias"LoadCursorFromFileA"(ByVallpFileNameAsString)AsLong
PublicDeclareFunctionSystemParametersInfoLib"user32"Alias"SystemParametersInfoA"(ByValuActionAsLong,ByValuParamAsLong,lpvParamAsAny,ByValfuWinIniAsLong)
PrivateDeclareFunctionGetAsyncKeyStateLib"user32"(ByValvKeyAsLong)AsInteger
修改光标形状-代码
hCursor=LoadCursorFromFile("c:\变化.cur")'获取光标的句柄//api加载光标文件,不能直接加载按键附件中的文件,需释放到电脑盘符中
CallSetSystemCursor(hCursor,32512)//设置光标形状32512是系统标准光标OCR_NORMAL的常数。
恢复光标形状-代码
SystemParametersInfo87,0,0,2
//第一个87是SPI_SETCURSORS的常数。第一个参数设置为SPI_SETCURSORS,第二个和第三个参数都设置为0.第三个参数2是SPIF_SENDCHANGED的常数。
判断鼠标左键是否弹起
LButton=GetAsyncKeyState(1)'鼠标左键状态
IfLButton=0Then//如果鼠标左键松开
//
EndIf
咱们的核心代码都分析完了,现在将这些代码组合起来,看看运行效果会是怎样的。
代码
PublicDeclareFunctionSetSystemCursorLib"user32"Alias"SetSystemCursor"(ByValhcurAsLong,ByValidAsLong)AsLong
PublicDeclareFunctionLoadCursorFromFileLib"user32"Alias"LoadCursorFromFileA"(ByVallpFileNameAsString)AsLong
PublicDeclareFunctionSystemParametersInfoLib"user32"Alias"SystemParametersInfoA"(ByValuActionAsLong,ByValuParamAsLong,lpvParamAsAny,ByValfuWinIniAsLong)
PrivateDeclareFunctionGetAsyncKeyStateLib"user32"(ByValvKeyAsLong)AsInteger
EventForm1.Timer1.Timer
LButton=GetAsyncKeyState(1)'鼠标左键状态
//RButton=GetAsyncKeyState(2)'鼠标右键状态
IfLButton=0Then//如果鼠标左键松开
hwnd=Plugin.Window.MousePoint()
Form1.Label1.Caption=hwnd
Form1.PictureBox1.Picture="Attachment:\光标2.jpg"//图像控件图像改为光标2.jpg
SystemParametersInfo87,0,0,2//还原光标形状
Form1.Timer1.Enabled=False
EndIf
EndEvent
EventForm1.PictureBox1.Click
hCursor=LoadCursorFromFile("c:\变化.cur")'获取光标的句柄//api加载光标文件,不能直接加载按键附件中的文件,需释放到电脑盘符中
CallSetSystemCursor(hCursor,32512)//设置光标形状
Form1.Timer1.Enabled=True
Form1.PictureBox1.Picture="Attachment:\光标1.jpg"//图像控件图像改为光标1.jpg
EndEvent
EventForm1.Load
PutAttachment"c:\","变化.cur"//释放光标文件
EndEvent
标签:控件,句柄,按键精灵