找回密码
 加入
搜索
查看: 17131|回复: 23

[系统综合] 求简单的更换系统鼠标方案的方法

 火.. [复制链接]
发表于 2010-7-30 11:14:55 | 显示全部楼层 |阅读模式
悬赏500金钱已解决
本帖最后由 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] = 0) Then
  Return SetError(1, 0, 0)
 EndIf
 Return $Ret[0]
EndFunc   ;==>_WinAPI_LoadCursor
Func _WinAPI_LoadCursorFromFile($sFile)
 Local $Ret = DllCall('user32.dll', 'ptr', 'LoadCursorFromFileW', 'wstr', $sFile)
 If (@error) Or ($Ret[0] = 0) Then
  Return SetError(1, 0, 0)
 EndIf
 Return $Ret[0]
EndFunc   ;==>_WinAPI_LoadCursorFromFile
Func _WinAPI_DuplicateCursor($hIcon)
 Local $Ret = DllCall('user32.dll', 'ptr', 'CopyIcon', 'ptr', $hIcon)
 If (@error) Or ($Ret[0] = 0) Or ($Ret[0] = Ptr(0)) Then
  Return SetError(1, 0, 0)
 EndIf
 Return $Ret[0]
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] = 0) Then
  Return SetError(1, 0, 0)
 EndIf
 Return 1
EndFunc   ;==>_WinAPI_SetSystemCursor
 
附件: 您需要 登录 才可以下载或查看,没有账号?加入

最佳答案

查看完整内容

单独的鼠标用_WinAPI_SetSystemCursor
发表于 2010-7-30 11:14:56 | 显示全部楼层
单独的鼠标用_WinAPI_SetSystemCursor
发表于 2010-7-30 11:42:17 | 显示全部楼层
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Control Panel\Cursors
发表于 2010-7-30 13:16:54 | 显示全部楼层
楼主的费尽心思,目地是不是想为自己的窗口定义一个指针?
如果是的话,看看下面的代码。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[0]
EndFunc        ;==>_LoadCursorFromFile
 楼主| 发表于 2010-7-30 13:35:02 | 显示全部楼层
回复 3# xsjtxy


是让全屏的鼠标都更换掉,自己的程序是没有界面的。

我的目的是能够把系统的鼠标给隐藏掉,但是鼠标照样有效,仍然能够进行点击,进行操作,也能够获得鼠标当前的位置等信息,就和没隐藏的时候是一样的,只是看不到而已。
想这应该是很有难度的。

所以我奇思妙想,如果能快速更换鼠标方案,那换上一套我自己做的全透明的鼠标不就行了,程序退出时还原为原来的就好了。
 楼主| 发表于 2010-7-30 13:37:06 | 显示全部楼层
要达到以上目的,如果是注册表操作的话,还需即时刷新注册表,但是我把论坛所有的刷新注册表的试验了一遍,就这个更换鼠标方案的不能刷新。
汗。。
 楼主| 发表于 2010-7-30 13:37:36 | 显示全部楼层
难道是我操作的根本就不是控制鼠标方案的键?
 楼主| 发表于 2010-7-30 13:40:21 | 显示全部楼层
回复 2# rikthhpgf2005


    我的系统没有这个键值
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Control Panel\Cursors]
@=""
"Scheme Source"=dword:00000000
"hand"="J:\\个人\\AU3\\截图框\\自定义鼠标图案\\mouse1.ani"

[HKEY_CURRENT_USER\Control Panel\Cursors\Schemes]
 楼主| 发表于 2010-7-30 13:41:39 | 显示全部楼层
但是更换这里的内容,刷新注册表是没有效果的,说它不起作用也不对,你修改这里的内容的话,控制面板里面鼠标方案的选项会有显示的。
发表于 2010-7-30 13:54:38 | 显示全部楼层

那就不知道了
我用sp3可以改注册表完成的
发表于 2010-7-30 15:03:43 | 显示全部楼层
本帖最后由 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")

评分

参与人数 1金钱 +20 收起 理由
sanmoking + 20

查看全部评分

 楼主| 发表于 2010-7-30 16:32:17 | 显示全部楼层
你好强。。。仍然感谢。。。。
发表于 2010-7-30 17:52:35 | 显示全部楼层
发表于 2010-7-30 18:23:00 | 显示全部楼层
SetSystemCursor
发表于 2010-7-30 18:59:54 | 显示全部楼层
例子里面好像有,就是版主说的那个函数。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-12 12:11 , Processed in 0.085657 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表