Solved

SystemParametersInfo problem

Posted on 2004-03-22
10
542 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
ID: 10652042
What are the constants for SPI_SETMOUSECLICKLOCK, SPIF_SENDWININICHANGE and SPIF_UPDATEINIFILE?
0
 

Author Comment

by:brianbugh
ID: 10652114
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___
ID: 10652267
:)
Use this:

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

Note the "little" change :)
0
 

Author Comment

by:brianbugh
ID: 10652338
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
ID: 10652397
ByVal &H0 is for Enabling/Disabling. Hex 0 = Disable, Hex 1 = Enable (Boolean values). Try &H1 to enable it
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 6

Accepted Solution

by:
___XXX_X_XXX___ earned 125 total points
ID: 10652418
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
ID: 10652431
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
ID: 10652473
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
ID: 10652478
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___
ID: 10652481
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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction I needed to skip over some file processing within a For...Next loop in some old production code and wished that VB (classic) had a statement that would drop down to the end of the current iteration, bypassing the statements that were c…
Since upgrading to Office 2013 or higher installing the Smart Indenter addin will fail. This article will explain how to install it so it will work regardless of the Office version installed.
As developers, we are not limited to the functions provided by the VBA language. In addition, we can call the functions that are part of the Windows operating system. These functions are part of the Windows API (Application Programming Interface). U…
Get people started with the process of using Access VBA to control Outlook using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Microsoft Outlook. Using automation, an Access applic…

896 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

15 Experts available now in Live!

Get 1:1 Help Now