brianbugh
asked on
SystemParametersInfo problem
I am attempting to enable/disable the ClickLock accessibility option using the SystemParametersInfo API function. The problem I am having is that no matter what I put in uiParam and pvParam, I it enables ClickLock (I test it with SPI_GETMOUSECLICKLOCK and by looking in the Mouse properties in Control Panel).
Here's an example; this is how I thought it should work based on MSDN:
retval = SystemParametersInfo(SPI_S ETMOUSECLI CKLOCK, False, 0, SPIF_SENDWININICHANGE Or SPIF_UPDATEINIFILE)
but that ENABLES it, which makes no sense. I made a huge function that would try every combination of 1, 0, true, false, boolean vars, integer vars, and every single one enables the feature. I hope that I'm just doing something wrong, and not that it is impossible to do because of a bug or something.
I am using Windows XP (the feature is supposed to work in XP and ME). Here is the MSDN page I have been using as a reference http://msdn.microsoft.com/library/en-us/sysinfo/base/systemparametersinfo.asp
Any help is very appreciated!
Here's an example; this is how I thought it should work based on MSDN:
retval = SystemParametersInfo(SPI_S
but that ENABLES it, which makes no sense. I made a huge function that would try every combination of 1, 0, true, false, boolean vars, integer vars, and every single one enables the feature. I hope that I'm just doing something wrong, and not that it is impossible to do because of a bug or something.
I am using Windows XP (the feature is supposed to work in XP and ME). Here is the MSDN page I have been using as a reference http://msdn.microsoft.com/library/en-us/sysinfo/base/systemparametersinfo.asp
Any help is very appreciated!
What are the constants for SPI_SETMOUSECLICKLOCK, SPIF_SENDWININICHANGE and SPIF_UPDATEINIFILE?
ASKER
Ah, sorry.
Private Const SPI_GETMOUSECLICKLOCK = 4126
Private Const SPI_GETMOUSECLICKLOCKTIME = 8200
Private Const SPI_SETMOUSECLICKLOCK = 4127
Private Const SPI_SETMOUSECLICKLOCKTIME = 8201
Private Const SPIF_SENDWININICHANGE = &H2
Private Const SPIF_UPDATEINIFILE = &H1
Private Const SPI_GETMOUSECLICKLOCK = 4126
Private Const SPI_GETMOUSECLICKLOCKTIME = 8200
Private Const SPI_SETMOUSECLICKLOCK = 4127
Private Const SPI_SETMOUSECLICKLOCKTIME = 8201
Private Const SPIF_SENDWININICHANGE = &H2
Private Const SPIF_UPDATEINIFILE = &H1
:)
Use this:
retVal = SystemParametersInfo(SPI_S ETMOUSECLI CKLOCK, False, ByVal &H0, SPIF_SENDWININICHANGE Or SPIF_UPDATEINIFILE)
Note the "little" change :)
Use this:
retVal = SystemParametersInfo(SPI_S
Note the "little" change :)
ASKER
Well, that disables it, but replacing "False" with "True" doesn't turn it back on. I need something I can put in a variable (from a checkbox) that will turn on/off.
Getting closer I think..
Getting closer I think..
ByVal &H0 is for Enabling/Disabling. Hex 0 = Disable, Hex 1 = Enable (Boolean values). Try &H1 to enable it
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Correct, however, I said I need something to put in a variable. I can easily make a switch statement that uses &H0 and &H1 but I don't want to do that, I want to do it right :)
I do have it working like this:
Select Case mbEnabled
Case True
retval = SystemParametersInfo(SPI_S ETMOUSECLI CKLOCK, 0, True, 0)
Case False
retval = SystemParametersInfo(SPI_S ETMOUSECLI CKLOCK, 0, ByVal 0&, 0)
Case Else
MsgBox "error in SetEnabled"
End Select
but if I put in "False" instead of the ByVal &H0 it will not work. I'm running into this problem with another API call - how do I send a variable ByVal when it expects ByRef? "ByVal myVar" doesn't work.
I do have it working like this:
Select Case mbEnabled
Case True
retval = SystemParametersInfo(SPI_S
Case False
retval = SystemParametersInfo(SPI_S
Case Else
MsgBox "error in SetEnabled"
End Select
but if I put in "False" instead of the ByVal &H0 it will not work. I'm running into this problem with another API call - how do I send a variable ByVal when it expects ByRef? "ByVal myVar" doesn't work.
You can change the function.. quick example:
Option Explicit
Private Declare Function SystemParametersInfoLong Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As Long, ByVal fuWinIni As Long) As Long
Private Const SPI_GETMOUSECLICKLOCK = 4126
Private Const SPI_GETMOUSECLICKLOCKTIME = 8200
Private Const SPI_SETMOUSECLICKLOCK = 4127
Private Const SPI_SETMOUSECLICKLOCKTIME = 8201
Private Const SPIF_SENDWININICHANGE = &H2
Private Const SPIF_UPDATEINIFILE = &H1
Private Sub MouseSetClickLock(ByVal bEnable As Boolean)
Call SystemParametersInfoLong(S PI_SETMOUS ECLICKLOCK , False, ByVal bEnable, SPIF_SENDWININICHANGE Or SPIF_UPDATEINIFILE)
End Sub
Private Sub Form_Load()
Call MouseSetClickLock(True)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call MouseSetClickLock(False)
End Sub
Option Explicit
Private Declare Function SystemParametersInfoLong Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As Long, ByVal fuWinIni As Long) As Long
Private Const SPI_GETMOUSECLICKLOCK = 4126
Private Const SPI_GETMOUSECLICKLOCKTIME = 8200
Private Const SPI_SETMOUSECLICKLOCK = 4127
Private Const SPI_SETMOUSECLICKLOCKTIME = 8201
Private Const SPIF_SENDWININICHANGE = &H2
Private Const SPIF_UPDATEINIFILE = &H1
Private Sub MouseSetClickLock(ByVal bEnable As Boolean)
Call SystemParametersInfoLong(S
End Sub
Private Sub Form_Load()
Call MouseSetClickLock(True)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call MouseSetClickLock(False)
End Sub
ASKER
XXX_X_XXX: OK, I got it now. For some reason when I did "ByVal variable" it was giving me an error. I guess that the two times I tried it, I must have left off "As Long" on my test variable. Always something stupid :)
Thanks a lot for the help, that clears up the current problem and a couple others.
Thanks a lot for the help, that clears up the current problem and a couple others.
Hah :)
Just use this:
Instead of Select Case with "Case True","Case False" and "Case Else" ?!?!??! use this:
' Suppose that you will pass to this subroutine/function boolean parameter named mbEnabled:
Dim lngOnOff As Long
Dim retVal As Long
lngOnOff=Clng(mbEnabled) AND &H1
retVal = SystemParametersInfo(SPI_S ETMOUSECLI CKLOCK, False, ByVal lngOnOff, SPIF_SENDWININICHANGE Or SPIF_UPDATEINIFILE
So, no need of these Select case statements.
Just use this:
Instead of Select Case with "Case True","Case False" and "Case Else" ?!?!??! use this:
' Suppose that you will pass to this subroutine/function boolean parameter named mbEnabled:
Dim lngOnOff As Long
Dim retVal As Long
lngOnOff=Clng(mbEnabled) AND &H1
retVal = SystemParametersInfo(SPI_S
So, no need of these Select case statements.