Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    197

    [Vb.net] Leggere e modificare la velocità del mouse

    salve a tutti ho un problema relativo ad un programma devo riuscire a leggere la velocita del mouse e poi settare a piacere il parametro velocita del mouse sto lavorando in visual studio 2010.
    Vi posto il codice che sto utilizzando dato che fino ad adesso riesco a settare la velocità del mouse l'unica parte che nn lavora è quella di leggere la velocità corrente


    Nel modulo
    codice:
    Module Module1
        Public Declare Auto Function SystemParametersInfo Lib "user32.dll" (ByVal uiAction As Integer, ByVal uiParam As Integer, ByVal pvParam As IntPtr, ByVal WinIni As Integer) As Boolean
    
        Public Const SPI_GETMOUSESPEED = &H70
        Public Const SPI_SETMOUSESPEED = 113
          
    End Module
    Nel Form.load
    codice:
            Dim Speed As Integer
            SystemParametersInfo(SPI_GETMOUSESPEED, 0, Speed, 0)  ' questa parte non funziona 
            MsgBox("Velocita del mouse:" & Speed)
            Speed = 10
            SystemParametersInfo(SPI_SETMOUSESPEED, 0, Speed, 0)
            MsgBox("Velocita del mouse:" & Speed)
    Grazie a tutti ragazzi e buona domenica

  2. #2
    Il problema è che la SystemParametersInfo quando usata con SPI_SETMOUSESPEED si aspetta nel penultimo parametro un intero, mentre quando è usata con SPI_GETMOUSESPEED si aspetta un puntatore ad un intero. Puoi risolvere così:
    codice:
    Module SPI
        Private Declare Ansi Function SystemParametersInfoVal Lib "user32.dll" Alias "SystemParametersInfoA" (ByVal uiAction As Integer, ByVal uiParam As Integer, ByVal pvParam As Integer, ByVal WinIni As Integer) As Boolean
    
        Private Declare Ansi Function SystemParametersInfoRef Lib "user32.dll" Alias "SystemParametersInfoA" (ByVal uiAction As Integer, ByVal uiParam As Integer, ByRef pvParam As Integer, ByVal WinIni As Integer) As Boolean
    
        Private Const SPI_GETMOUSESPEED = &H70
        Private Const SPI_SETMOUSESPEED = 113
    
        Public Property MouseSpeed() As Integer
            Get
                Dim ret As Integer
                If Not SystemParametersInfoRef(SPI_GETMOUSESPEED, 0, ret, 0) Then
                    Throw New System.ComponentModel.Win32Exception("SystemParametersInfo failed.")
                End If
                Return ret
            End Get
    
            Set (ByVal Value As Integer)
                If Not SystemParametersInfoVal(SPI_GETMOUSESPEED, 0, Value, 0) Then
                    Throw New System.ComponentModel.Win32Exception("SystemParametersInfo failed.")
                End If
            End Set
        End Property     
    End Module
    A questo punto per leggere e scrivere l'impostazione in questione ti basterà usare la property SPI.MouseSpeed. Ti consiglio tuttavia di lasciare stare le impostazioni in questione: se l'utente vuole modificarle, lo farà da sé nel pannello di controllo.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    197
    questo è un programma per me dato che voglio espandere le funzionalità del mouse che ho rifacendomi ad una shotcurt per poter modificare i profili di velocita senza accedere al pannello
    la lettura funziona correttamente grazie per la scrittura del valore ho usato il mio vecchio codice riportato di seguito

    codice:
            Dim Speed As Integer
            Speed = SPI.MouseSpeed
    
            MsgBox("ciao" & Speed)
    
            Speed = 20
    
            SystemParametersInfo(SPI_SETMOUSESPEED, 0, Speed, 0)
            MsgBox("Velocita del mouse:" & Speed)
    
        End Sub
    codice:
    Module SPI
        Public Declare Ansi Function SystemParametersInfoVal Lib "user32.dll" Alias "SystemParametersInfoA" (ByVal uiAction As Integer, ByVal uiParam As Integer, ByVal pvParam As Integer, ByVal WinIni As Integer) As Boolean
        Public Declare Auto Function SystemParametersInfo Lib "user32.dll" (ByVal uiAction As Integer, ByVal uiParam As Integer, ByVal pvParam As IntPtr, ByVal WinIni As Integer) As Boolean
        Public Declare Ansi Function SystemParametersInfoRef Lib "user32.dll" Alias "SystemParametersInfoA" (ByVal uiAction As Integer, ByVal uiParam As Integer, ByRef pvParam As Integer, ByVal WinIni As Integer) As Boolean
    
        Public Const SPI_GETMOUSESPEED = &H70
        Public Const SPI_SETMOUSESPEED = 113
    
        Public Property MouseSpeed() As Integer
            Get
                Dim ret As Integer
                If Not SystemParametersInfoRef(SPI_GETMOUSESPEED, 0, ret, 0) Then
                    Throw New System.ComponentModel.Win32Exception("SystemParametersInfo failed.")
                End If
                Return ret
            End Get
    
            Set(ByVal Value As Integer)
                If Not SystemParametersInfoVal(SPI_GETMOUSESPEED, 0, Value, 0) Then
                    Throw New System.ComponentModel.Win32Exception("SystemParametersInfo failed.")
                End If
            End Set
        End Property
    End Module

    Ciao scusami un altra domanda sto da scamattina a girare su msdn e bla bla bla dove posso reperire informazioni come queste dato che in nessun manuale le ho trovate grazie caro per la risposta

  4. #4
    Originariamente inviato da nandoar
    la lettura funziona correttamente grazie per la scrittura del valore ho usato il mio vecchio codice riportato di seguito
    Secondo me invece ti conviene usare il mio codice anche per la scrittura, in modo da incapsulare tutto l'uso delle API nel modulo SPI, evitando così di usarle direttamente dal resto del codice. Il risultato che si ottiene è del codice molto più pulito: confronta la tua versione (con API in giro nel codice "normale" dell'applicazione) con questa.
    codice:
            MessageBox.Show("Velocità mouse corrente: " + SPI.MouseSpeed.ToString())
            SPI.MouseSpeed=20
            MessageBox.Show("Velocità mouse corrente: " + SPI.MouseSpeed.ToString())
    codice:
    Module SPI
        Private Declare Ansi Function SystemParametersInfoVal Lib "user32.dll" Alias "SystemParametersInfoA" (ByVal uiAction As Integer, ByVal uiParam As Integer, ByVal pvParam As IntPtr, ByVal WinIni As Integer) As Boolean
        Private Declare Ansi Function SystemParametersInfoRef Lib "user32.dll" Alias "SystemParametersInfoA" (ByVal uiAction As Integer, ByVal uiParam As Integer, ByRef pvParam As Integer, ByVal WinIni As Integer) As Boolean
    
        Private Const SPI_GETMOUSESPEED = &H70
        Private Const SPI_SETMOUSESPEED = 113
    
        Public Property MouseSpeed() As Integer
            Get
                Dim ret As Integer
                If Not SystemParametersInfoRef(SPI_GETMOUSESPEED, 0, ret, 0) Then
                    Throw New System.ComponentModel.Win32Exception("SystemParametersInfo failed.")
                End If
                Return ret
            End Get
    
            Set(ByVal Value As Integer)
                If Not SystemParametersInfoVal(SPI_GETMOUSESPEED, 0, Value, 0) Then
                    Throw New System.ComponentModel.Win32Exception("SystemParametersInfo failed.")
                End If
            End Set
        End Property
    End Module
    (occhio che ho fatto una correzione nella prima dichiarazione, altrimenti su piattaforme a 64 bit si potrebbero verificare problemi)
    Nel tuo caso ci sono chiamate ad API sparpagliate per il codice dell'applicazione, e non c'è nemmeno un controllo per verificare se si sono verificati errori; in questa versione, invece, il controllo degli errori è effettuato dalla property (che si occupa tra l'altro di trasformare la segnalazione di errore come valore restituito in un'eccezione, che difficilmente passa inosservata), lo scopo del codice risulta subito evidente, e l'utilizzo della property è decisamente più semplice rispetto alle stramberie che bisogna fare con l'uso diretto della API.
    Ciao scusami un altra domanda sto da scamattina a girare su msdn e bla bla bla dove posso reperire informazioni come queste dato che in nessun manuale le ho trovate grazie caro per la risposta
    Dalla MSDN:
    SPI_GETMOUSESPEED
    Retrieves the current mouse speed. The mouse speed determines how far the pointer will move based on the distance the mouse moves. The pvParam parameter must point to an integer that receives a value which ranges between 1 (slowest) and 20 (fastest). A value of 10 is the default. The value can be set by an end-user using the mouse control panel application or by an application using SPI_SETMOUSESPEED.
    da cui risulta evidente che qui pvParam è inteso come un puntatore, che va quindi gestito come ByRef in VB.NET; al contrario,
    SPI_SETMOUSESPEED
    Sets the current mouse speed. The pvParam parameter is an integer between 1 (slowest) and 20 (fastest). A value of 10 is the default. This value is typically set using the mouse control panel application.
    per cui in questo caso pvParam è inteso come semplice intero. Questo è possibile in C dato che i puntatori e gli interi possono essere castati tra loro senza problemi, ma in .NET non è possibile, dato che il sistema dei tipi è più rigido e, soprattutto, non è possibile usare direttamente i puntatori.

    Una soluzione a questo problema (che è quella che ho impiegato) è dichiarare due volte la stessa API (ovviamente con due nomi .NET differenti, onde evitare conflitti di nomi), usando però due firme differenti: una con il ByRef (per l'uso del parametro come puntatore) e una con il ByVal (per l'uso del parametro come normale intero a 32/64 bit).
    Insomma, non ci sono guide particolari da seguire, semplicemente devi mettere insieme i pezzi e trovare una soluzione in base alle conoscenze che hai (o che ti devi costruire di volta in volta).
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    197
    grazie mille per la risposta cosi esaustiva

  6. #6
    Di niente, ciao!
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.