PDA

View Full Version : [visualbasic] muovere mouse con la tastiera


thewebsurfer
12-01-2009, 19:58
salve, premetto che essendo ferrato in altri linguaggi non so neanche cosa sia visualbasic ..:)
spulciando un pò per la rete ho visto che con questo vb è possibile realizzare quello che cerco:
ossia un programma che mi permetta di scegliere i tasti da abbinare al movimento del mouse e regolarne la velocità (win xp).
Per un programmatore vb non dovrebbe essere difficile..credo...mi aiutate?:sofico:


Ps già provato varie utility come mouseemu e autokey..non vanno

MarcoGG
13-01-2009, 08:39
non so neanche cosa sia visualbasic ..:)


Beh, peggio per te... :D :D


spulciando un pò per la rete ho visto che con questo vb è possibile realizzare quello che cerco:
ossia un programma che mi permetta di scegliere i tasti da abbinare al movimento del mouse e regolarne la velocità (win xp).


Ammesso tu stia usando VB NET, la cosa si può fare in modo abbastanza agevole ( e in VB6, VBA il codice sarà molto simile, dettagliuzzi a parte... ).

1. Anzitutto le funzioni che ti permettono di leggere / impostare da codice le coordinate X ed Y del puntatore del mouse. Si può fare con l'uso di 2 semplici chiamate API e di un tipo "Punto" personalizzato :

'Tipo Punto:
Private Type PT
X As Long
Y As Long
End Type

'Leggi posizione puntatore :
Private Declare Function GetCursorPos Lib "User32" (lpPoint As PT) As Long

'Imposta posizione puntatore :
Private Declare Function SetCursorPos Lib "user32.dll" (ByVal X As Long, ByVal Y As Long) As Long

2. Fare in modo che l'Applicazione sia in ascolto sulla pressione dei tasti desiderati, ai quali dovrà essere assegnato il movimento del puntatore.
Tipicamente si possono usare gli 8 tasti freccia del tastierino numerico...
Sul codice che implementa questo "ascolto" ( in pratica un piccolo keylogger in VB... ;) ), vedi mio intervento - post #4 - in queso Thread :
:read: http://www.hwupgrade.it/forum/showthread.php?t=1865043

Metti insieme 1. e 2. e avrai la soluzione. ;)

thewebsurfer
13-01-2009, 13:35
bè l'unica cosa che ho capito è che sto visual basic sembra più pseudocodice che un linguaggio vero e proprio;)

cmq resta il fatto che non saprei scriverne una riga:fagiano:
non è che ti va di esercitarti per divertimento a fare questo programmino?:help: :D

gugoXX
13-01-2009, 14:16
bè l'unica cosa che ho capito è che sto visual basic sembra più pseudocodice che un linguaggio vero e proprio;)

Nono, e' un linguaggio di programmazione completo vero e proprio, anche se bistrattato da molti.
Comunque puoi farlo in quasi qualsiasi linguaggio di programmazione tu conosci.

Oppure puoi vedere se le accessibility options fanno al caso tuo.

thewebsurfer
13-01-2009, 14:27
Nono, e' un linguaggio di programmazione completo vero e proprio, anche se bistrattato da molti.
Comunque puoi farlo in quasi qualsiasi linguaggio di programmazione tu conosci.

Oppure puoi vedere se le accessibility options fanno al caso tuo.

era solo una battuta non disdegno niente:)

se conoscessi C o Java tanto da arrivare alla gestione del mouse non avrei aperto il thread:)
con java probabilmente si può fare in maniera abbastanza agevole, ma io odio java e java odia me, quindi apro eclipse solo quando è strettamente necessario:stordita:

nessuno allora vuole buttarsi a scrivere queste 10 righe?:(

MarcoGG
13-01-2009, 20:21
bè l'unica cosa che ho capito è che sto visual basic sembra più pseudocodice che un linguaggio vero e proprio;)

cmq resta il fatto che non saprei scriverne una riga:fagiano:
non è che ti va di esercitarti per divertimento a fare questo programmino?:help: :D


Allora l'unica cosa che hai capito era... sbagliata. :)

Comunque hai fatto davvero un bel complimento a VB.
Se esistesse un linguaggio capace di far eseguire alla macchina senza eccezioni le istruzioni passate in pseudo-codice, interpretando alla meglio le tue reali intenzioni, come lo classificheresti ? Linguaggio fiacco ? Non penso proprio.
Mai visto Star Trek ? Uno dice "Computer, fammi questo e quest'altro." e lui esegue... :D
Io non ho mai scritto una sola riga di Python ( e forse sarà proprio il prossimo linguaggio che mi imparerò ), ma non mi sogno di sminuirlo solo perchè non assomiglia al C.

Per il codice volentieri ( magari specifica quale VB usi ), appena ho un po' di tregua cerco di fare un esempio completo ( anche se veramente ti ho già dato praticamente tutto... ).
Causa arrivo notebook nuovo, sono parecchio intrippato ! :cool:

MarcoGG
14-01-2009, 07:32
OK. Più semplice del previsto. Ecco una soluzione :

Ho deciso di gestire per ora solo i 4 pulsanti freccia, niente tastierino numerico, anche perchè i codici dei pulsanti cambiano a seconda che sia o meno attivo il Bloc Num.
Tutto ciò che serve è una Windows Form e un oggetto Timer.
Il Timer deve essere già Enabled ed avere un intervallo molto breve, tipo 10 msec.

-> Soluzione per VB6, VBA :

Private Type PT
X As Long
Y As Long
End Type

Private Const shift As Integer = 5

Private Declare Function SetCursorPos Lib "user32.dll" (ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As PT) As Long
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private valoreRitorno As Integer

Private Sub Timer1_Timer()

Dim i As Integer
For i = 37 To 40
valoreRitorno = GetAsyncKeyState(i)
If valoreRitorno = -32767 Then
Dim Punto As PT
Dim R As Long
Dim Rx As Long
Dim Ry As Long
R = GetCursorPos(Punto)
Rx = Punto.X
Ry = Punto.Y
Select Case i
Case 37 'SIN
SetCursorPos Rx - shift, Ry

Case 38 'SU
SetCursorPos Rx, Ry - shift

Case 39 'DX
SetCursorPos Rx + shift, Ry

Case 40 'GIU'
SetCursorPos Rx, Ry + shift

Case Else
'...
End Select
End If
Next i

End Sub

-> Per VB NET è ancora meglio :

Public Class Form1

Private X As Integer
Private Y As Integer
Private shift As Integer = 5
Private valoreRitorno As Integer = 0

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Integer

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

Dim i As Integer = 0
For i = 37 To 40
valoreRitorno = GetAsyncKeyState(i)
If valoreRitorno = -32767 Then
X = Windows.Forms.Cursor.Position.X
Y = Windows.Forms.Cursor.Position.Y
Select Case i
Case 37 'SIN
Windows.Forms.Cursor.Position = New System.Drawing.Point(X - shift, Y)

Case 38 'SU
Windows.Forms.Cursor.Position = New System.Drawing.Point(X, Y - shift)

Case 39 'DX
Windows.Forms.Cursor.Position = New System.Drawing.Point(X + shift, Y)

Case 40 'GIU'
Windows.Forms.Cursor.Position = New System.Drawing.Point(X, Y + shift)

Case Else
'...
End Select
End If
Next i

End Sub

End Class

Mi sembra che ci sia tutto ! ;)

thewebsurfer
14-01-2009, 13:55
grazie veramente:D

piccola modifica se possibile:stordita:
mi sta bene l'uso delle frecce direzionali, xò è possibile disattivare e attivare "l'ascolto" del programma con una shortcut?
praticamente ho pensato di mettere il programma in esecuzione automatica all'avvio di win, ma se è sempre in ascolto perdo l'uso delle frecce direzionali e muovo solo il mouse..
l'ideale sarebbe una scorciatoia tipo ctrl-alt-qualcosa che disattivi e attivi l'ascolto



ps: se dici che è meglio il vb net uso quello....mi linki il compilatore?:stordita:
pps: ora se ti serve un aiuto in C/assembler/java/html/css/php/javascript/ajax e forse qualcos'altro che ho dimenticato ptvizzami pure:)

gugoXX
14-01-2009, 14:06
Ma l'opzione gia' integrata in Windows per gestire il mouse con le frecce non andava bene?

thewebsurfer
14-01-2009, 14:16
Ma l'opzione gia' integrata in Windows per gestire il mouse con le frecce non andava bene?

si se non fosse per il fatto che per andare da una parte all'altra di un monitor 1920x1200 impiega 15min e 30sec

ps: perdiù non capisco perchè non funziona assegnando al telecomando i tasti del tastierino

gugoXX
14-01-2009, 14:19
si se non fosse per il fatto che per andare da una parte all'altra di un monitor 1920x1200 impiega 15min e 30sec

In realta' e' configurabile, e con la dovuta configurazione puo' arrivare a metterci 2-3 secondi.

thewebsurfer
14-01-2009, 14:23
In realta' e' configurabile, e con la dovuta configurazione puo' arrivare a metterci 2-3 secondi.

vedi PS:)
praticamente win accetta SOLO i segnali derivanti dal tastierino numerico della tastiera, se assegno ad un pulsante del telecomando, ad esempio, 4(tn) il puntatore non si muove

thewebsurfer
17-01-2009, 22:52
mi hai abbandonato nel progetto?:cry:

;)

MarcoGG
19-01-2009, 17:48
grazie veramente:D

piccola modifica se possibile:stordita:
mi sta bene l'uso delle frecce direzionali, xò è possibile disattivare e attivare "l'ascolto" del programma con una shortcut?
praticamente ho pensato di mettere il programma in esecuzione automatica all'avvio di win, ma se è sempre in ascolto perdo l'uso delle frecce direzionali e muovo solo il mouse..
l'ideale sarebbe una scorciatoia tipo ctrl-alt-qualcosa che disattivi e attivi l'ascolto

ps: se dici che è meglio il vb net uso quello....mi linki il compilatore?:stordita:


Semplicissimo, sia in VB6 che VB NET.
Dato che abbiamo già a disposizione la nostra bella chiamata API GetAsyncKeyState, la risolverei così :

1. Aggiungo un nuovo oggetto Timer, uguale a Timer1 come impostazioni ( enabled e interval ).

2. Il nuovo Timer2 ascolterà solo la pressione delle combinazioni tasti utili ad attivare/disattivare l'ascolto di Timer1, perciò nel suo evento Tick :

'CTRL + ALT + A = Attiva Ascolto su Timer1
'CTRL + ALT + D = Disattiva Ascolto su Timer1

If GetAsyncKeyState(17) Then
If GetAsyncKeyState(18) Then
If GetAsyncKeyState(65) Then
Timer1.Enabled = True
End If
If GetAsyncKeyState(68) Then
Timer1.Enabled = False
End If
End If
End If

E il gioco è fatto. ;)

Per quanto riguarda la tua scelta di optare per VB 2008, non posso che essere d'accordo.
Trovi la Express gratuita qui :
http://www.microsoft.com/Express/VB/
;)

thewebsurfer
19-01-2009, 18:24
quindi ricapitolando..qual è il codice completo?:fagiano:
ti ripeto che in vb proprio non riesco a raccapezzarmici:)

ps: sto installando il file che mi hai linkato...non è che microsoft sql va in conflitto con mysql?:doh: