Solved

SystemParametersInfo problem

Posted on 2004-03-22
10
534 Views
Last Modified: 2007-12-19
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_SETMOUSECLICKLOCK, 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!
0
Comment
Question by:brianbugh
  • 4
  • 3
  • 3
10 Comments
 
LVL 17

Expert Comment

by:zzzzzooc
Comment Utility
What are the constants for SPI_SETMOUSECLICKLOCK, SPIF_SENDWININICHANGE and SPIF_UPDATEINIFILE?
0
 

Author Comment

by:brianbugh
Comment Utility
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
0
 
LVL 6

Expert Comment

by:___XXX_X_XXX___
Comment Utility
:)
Use this:

retVal = SystemParametersInfo(SPI_SETMOUSECLICKLOCK, False, ByVal &H0, SPIF_SENDWININICHANGE Or SPIF_UPDATEINIFILE)

Note the "little" change :)
0
 

Author Comment

by:brianbugh
Comment Utility
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..
0
 
LVL 17

Expert Comment

by:zzzzzooc
Comment Utility
ByVal &H0 is for Enabling/Disabling. Hex 0 = Disable, Hex 1 = Enable (Boolean values). Try &H1 to enable it
0
Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

 
LVL 6

Accepted Solution

by:
___XXX_X_XXX___ earned 125 total points
Comment Utility
But you must change not False,True parameter. You must change ByVal parameter ! Like this:

Dim retVal As Long
Dim lngOnOff As Long

lngOnOff = CLng(Check1.Value) ' Suppose that you have Check1 check box
retVal = SystemParametersInfo(SPI_SETMOUSECLICKLOCK, False, ByVal lngOnOff, SPIF_SENDWININICHANGE Or SPIF_UPDATEINIFILE)
0
 

Author Comment

by:brianbugh
Comment Utility
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_SETMOUSECLICKLOCK, 0, True, 0)
        Case False
            retval = SystemParametersInfo(SPI_SETMOUSECLICKLOCK, 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.
0
 
LVL 17

Expert Comment

by:zzzzzooc
Comment Utility
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(SPI_SETMOUSECLICKLOCK, 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
0
 

Author Comment

by:brianbugh
Comment Utility
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.
0
 
LVL 6

Expert Comment

by:___XXX_X_XXX___
Comment Utility
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_SETMOUSECLICKLOCK, False, ByVal lngOnOff, SPIF_SENDWININICHANGE Or SPIF_UPDATEINIFILE




So, no need of these Select case statements.
0

Featured Post

What Security Threats Are You Missing?

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

Have you ever wanted to restrict the users input in a textbox to numbers, and while doing that make sure that they can't 'cheat' by pasting in non-numeric text? Of course you can do that with code you write yourself but it's tedious and error-prone …
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
Get people started with the process of using Access VBA to control Excel using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Excel. Using automation, an Access application can laun…
Get people started with the utilization of class modules. Class modules can be a powerful tool in Microsoft Access. They allow you to create self-contained objects that encapsulate functionality. They can easily hide the complexity of a process from…

763 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now