求简单的更换系统鼠标方案的方法
本帖最后由 sanmoking 于 2010-7-31 19:06 编辑求简单的更换系统鼠标方案的方法,
在更换前先保存原始方案,程序退出后还原为原始的方案。
意思就是程序在运行时用自己的方案。
HotKeySet("{F3}","getcur")
HotKeySet("{F4}","exitt")
#include <StructureConstants.au3>
#include <WinAPI.au3>
;我菜鸟一个,下面的注释是我的理解
$mousehide = 1
FileInstall("mouse1.ani",@TempDir&"\mouse1.ani",0);自定义光标文件
$hPrev = _WinAPI_DuplicateCursor(_WinAPI_LoadCursor(0, 32512)) ;记录系统当前的光标状态
$hCursor = _WinAPI_DuplicateCursor(_WinAPI_LoadCursorFromFile(@TempDir&"\mouse1.ani"));导入自定义的光标文件
While 1
Sleep(10)
WEnd
Func getcur()
if $mousehide = 1 then
_WinAPI_SetSystemCursor($hCursor, 32512);加载自定义的光标文件
$mousehide = 0
Elseif $mousehide = 0 then
_WinAPI_SetSystemCursor($hPrev, 32512) ;还原之前纪录的光标状态,操作这一步的时候,会把之前记录的状态清除,所以后面要重新再来一遍
$hPrev = _WinAPI_DuplicateCursor(_WinAPI_LoadCursor(0, 32512)) ;记录系统当前的光标状态
$hCursor = _WinAPI_DuplicateCursor(_WinAPI_LoadCursorFromFile(@TempDir&"\mouse1.ani"));;导入自定义的光标文件
$mousehide = 1
EndIf
EndFunc
Func exitt()
exit
EndFunc
;下面这些部分是我从winapiex.au3中提取出来的有关替换鼠标的函数
Func _WinAPI_LoadCursor($hInstance, $sName)
Local $TypeOfName = 'long'
If IsString($sName) Then
$TypeOfName = 'str'
EndIf
Local $Ret = DllCall('user32.dll', 'ptr', 'LoadCursor', 'ptr', $hInstance, $TypeOfName, $sName)
If (@error) Or ($Ret = 0) Then
Return SetError(1, 0, 0)
EndIf
Return $Ret
EndFunc ;==>_WinAPI_LoadCursor
Func _WinAPI_LoadCursorFromFile($sFile)
Local $Ret = DllCall('user32.dll', 'ptr', 'LoadCursorFromFileW', 'wstr', $sFile)
If (@error) Or ($Ret = 0) Then
Return SetError(1, 0, 0)
EndIf
Return $Ret
EndFunc ;==>_WinAPI_LoadCursorFromFile
Func _WinAPI_DuplicateCursor($hIcon)
Local $Ret = DllCall('user32.dll', 'ptr', 'CopyIcon', 'ptr', $hIcon)
If (@error) Or ($Ret = 0) Or ($Ret = Ptr(0)) Then
Return SetError(1, 0, 0)
EndIf
Return $Ret
EndFunc ;==>_WinAPI_DuplicateCursor
Func _WinAPI_SetSystemCursor($hCursor, $ID, $fDuplicate = 0)
If $fDuplicate Then
$hCursor = _WinAPI_DuplicateCursor($hCursor)
EndIf
Local $Ret = DllCall('user32.dll', 'int', 'SetSystemCursor', 'ptr', $hCursor, 'dword', $ID)
If (@error) Or ($Ret = 0) Then
Return SetError(1, 0, 0)
EndIf
Return 1
EndFunc ;==>_WinAPI_SetSystemCursor
单独的鼠标用_WinAPI_SetSystemCursor HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Control Panel\Cursors 楼主的费尽心思,目地是不是想为自己的窗口定义一个指针?
如果是的话,看看下面的代码。a.ani改成你的指针文件名称或路径
#include <WinAPI.au3>
$sCursorFile = "a.ani"
$hCursor = _LoadCursorFromFile($sCursorFile)
$hGUI = GUICreate("SetCursor", 400, 300)
$hGC = DllCallbackRegister("_SetCursorProc", "int", "hWnd;uint;wparam;lparam")
$hOGC = _WinAPI_SetWindowLong($hGUI, -4, DllCallbackGetPtr($hGC))
GUISetState()
While GUIGetMsg() <> -3
WEnd
GUIDelete($hGUI)
DllCallbackFree($hGC)
DllCall("User32.dll", "int", "DestroyCursor", "hWnd", $hCursor)
Func _SetCursorProc($hWnd, $iMsg, $iwParam, $ilParam)
DllCall("User32.dll", "hWnd", "SetCursor", "hWnd", $hCursor)
Return _WinAPI_CallWindowProc($hOGC, $hWnd, $iMsg, $iwParam, $ilParam)
EndFunc ;==>_SetCursorProc
Func _LoadCursorFromFile($sCursorFile)
Local $iResult
$iResult = DllCall("User32.dll", "hWnd", "LoadCursorFromFile", "str", $sCursorFile)
Return $iResult
EndFunc ;==>_LoadCursorFromFile
回复 3# xsjtxy
是让全屏的鼠标都更换掉,自己的程序是没有界面的。
我的目的是能够把系统的鼠标给隐藏掉,但是鼠标照样有效,仍然能够进行点击,进行操作,也能够获得鼠标当前的位置等信息,就和没隐藏的时候是一样的,只是看不到而已。
想这应该是很有难度的。
所以我奇思妙想,如果能快速更换鼠标方案,那换上一套我自己做的全透明的鼠标不就行了,程序退出时还原为原来的就好了。 要达到以上目的,如果是注册表操作的话,还需即时刷新注册表,但是我把论坛所有的刷新注册表的试验了一遍,就这个更换鼠标方案的不能刷新。
汗。。 难道是我操作的根本就不是控制鼠标方案的键? 回复 2# rikthhpgf2005
我的系统没有这个键值
Windows Registry Editor Version 5.00
@=""
"Scheme Source"=dword:00000000
"hand"="J:\\个人\\AU3\\截图框\\自定义鼠标图案\\mouse1.ani"
但是更换这里的内容,刷新注册表是没有效果的,说它不起作用也不对,你修改这里的内容的话,控制面板里面鼠标方案的选项会有显示的。 {:face (396):}
那就不知道了
我用sp3可以改注册表完成的{:face (270):} 本帖最后由 xsjtxy 于 2010-7-30 15:25 编辑
我能做到的也就这样了
run('C:\WINDOWS\system32\rundll32.exe C:\WINDOWS\system32\shell32.dll,Control_RunDLL "C:\WINDOWS\system32\main.cpl"',"",@SW_MINIMIZE)
if WinWait("鼠标 属性", "", 5) = 0 then exit
GUISetState(@SW_MINIMIZE, WinGetHandle("鼠标 属性"))
WinMove("鼠标 属性", "", 9999,9999)
WinActivate("鼠标 属性")
send("^{TAB}")
if WinWait("鼠标 属性", "", 5) = 0 then exit
ControlClick("鼠标 属性", "","Button13")
{:face (197):}你好强。。。仍然感谢。。。。 http://www.autoitx.com/forum.php?mod=viewthread&tid=17274&extra= SetSystemCursor 例子里面好像有,就是版主说的那个函数。。
页:
[1]
2