Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - VB.NET (Problema nella realizzazione per acquisizione coordinate Mouse)
Forum - C# / VB.NET - VB.NET (Problema nella realizzazione per acquisizione coordinate Mouse)

Avatar
pescarese77 (Normal User)
Newbie


Messaggi: 17
Iscritto: 02/02/2012

Segnala al moderatore
Postato alle 23:13
Martedì, 16/12/2014
Salve
Allora ho il problema di un'acquisizione di coordinate del puntatore, vi spiego meglio come si trova il puntatore lo so vorrei tanto per capirci fare questo pressione un pulsante che fa partire la acquisizione al click cambio il puntatore e fin li tutto bene uso un timer dove metto l'api GetAsyncKeyState per osservare il comportamento del tasto del mouse in quando con il tasto qui mette la coordinata in una text box eseguo tipo la selezione e al rilascio del pulsante del mouse su una seconda textbox mette la coordinata finale del mouse vi posto il codice:
Codice sorgente - presumibilmente VB.NET

  1. Imports System.Runtime.InteropServices
  2. Public Class FrmAquisizioneNumero
  3.  
  4.     'Costante per mouse
  5.     Private Const OCR_NORMAL = 32512&
  6.  
  7.     'Stato dei pulsanti
  8.     <DllImport("user32.dll")> _
  9.     Public Function GetAsyncKeyState(ByVal vKey As System.Windows.Forms.Keys) As Short
  10.     End Function
  11.  
  12.     'Gestione Mouse con api per cambio icona mouse
  13.     <DllImport("user32")> _
  14.     Private Shared Function CopyIcon(ByVal hIcon As IntPtr) As IntPtr
  15.     End Function
  16.  
  17.  
  18.     <DllImport("user32")> _
  19.     Private Shared Function SetCursor(ByVal hCursor As IntPtr) As IntPtr
  20.     End Function
  21.  
  22.     <DllImport("user32")> _
  23.     Private Shared Function LoadCursor(ByVal hInstance As IntPtr, ByVal lpCursorName As IntPtr) As IntPtr
  24.     End Function
  25.  
  26.     <DllImport("user32")> _
  27.     Private Shared Function SetSystemCursor(ByVal hcur As IntPtr, ByVal id As IntPtr) As Boolean
  28.     End Function
  29.  
  30.     <DllImport("user32")> _
  31.     Private Shared Function LoadCursorFromFile(ByVal lpFileName As String) As IntPtr
  32.     End Function
  33.  
  34.     <DllImport("user32")> _
  35.     Private Shared Function GetCursor() As IntPtr
  36.     End Function
  37.  
  38.  
  39.     Private currenthcurs As IntPtr
  40.     Private tempcurs As IntPtr
  41.     '
  42.     Dim TastoSinistroPremutoeRilasciato As Boolean = False
  43.     Private Sub BtnAvviaAquisizione_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAvviaAquisizione.Click
  44.         'Cambiamento Mouse
  45.         Dim hcursor As IntPtr
  46.         Dim ret_val As Boolean
  47.         currenthcurs = GetCursor()
  48.         tempcurs = CopyIcon(currenthcurs)
  49.         hcursor = LoadCursorFromFile("C:\Windows\Cursors\cross_rl.cur")
  50.         ret_val = SetSystemCursor(hcursor, New IntPtr(OCR_NORMAL))
  51.     End Sub
  52.  
  53.     Private Sub TmrAquisizioneNumero_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TmrAquisizioneNumero.Tick
  54.         If GetAsyncKeyState(Keys.LButton) Then
  55.             Label1.Text = "Sinistro Premuto"
  56.             TextBox2.Text = MousePosition.X & "," & MousePosition.Y
  57.         Else
  58.             TastoSinistroPremutoeRilasciato = True
  59.             Label1.Text = "Sinistro Non Premuto"
  60.             If TastoSinistroPremutoeRilasciato Then
  61.                 TextBox3.Text = MousePosition.X & "," & MousePosition.Y
  62.                 'Ristabilire Mouse
  63.                 Dim ret_val As Boolean
  64.                 ret_val = SetSystemCursor(tempcurs, New IntPtr(OCR_NORMAL))
  65.                 TmrAquisizioneNumero.Stop()
  66.             End If
  67.         End If
  68.     End Sub
  69. End Class



non capisco perché GetAsyncKeyState parte subito al click del pulsante
spero di esser stato chiaro su cosa vorrei provare a fare, mi serve che parta dopo scelta da pulsante se faccio un e non da un nuovo form dopo evento load che sarebbe buon metodo per aggirare la cosa Grazie


Fabio
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 9:21
Mercoledì, 17/12/2014
Hai riletto quello che hai scritto? Non si capisce niente.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
pescarese77 (Normal User)
Newbie


Messaggi: 17
Iscritto: 02/02/2012

Segnala al moderatore
Postato alle 11:58
Mercoledì, 17/12/2014
si e che è complicato spiegarlo meglio allora in pratica:
vediamo come farmi capire meglio, solitamente sul desktop di Windows si può selezionare le icone con il mouse facendo il quadrato di selezione. non so se sia più chiaro così metto un immagine come in questa figura sempre che ci veda bene per essere tranquillo ne ho fatto una anche da paint di immagine

praticamente per creare la selezione rettangolare si fa click sul mouse lo si trascina mantenendo il pulsante premuto alla grandenza a piacimento e si rilascia, in pratica si forma un rettangolo di selezione con x,y punto angolo superiore e x,y angolo inferiore quindi e voglio recuperare le coordinate spero di essere stato chiaro questa volta poi c'è tutto il codice sopra indicato


pescarese77 ha allegato un file: selezione.jpg (153208 bytes)
Clicca qui per guardare l'immagine


Fabio
PM Quote
Avatar
Snogar (Normal User)
Pro


Messaggi: 130
Iscritto: 09/01/2012

Segnala al moderatore
Postato alle 9:01
Giovedì, 18/12/2014
Ma vuoi prendere degli screen tramite la selezione rettangolare con il mouse?


Se si non fai prima a crearti una form in fullscreen che ha il background preso dal desktop e da li ritagliarti un'immagine con la selezione rettangolare  .....tutto questo fattibile tramite GDI+ senza scomodare le api e quindi mantenendo anche la portabilità dell'applicazione. :k:


PM Quote
Avatar
pescarese77 (Normal User)
Newbie


Messaggi: 17
Iscritto: 02/02/2012

Segnala al moderatore
Postato alle 14:07
Giovedì, 18/12/2014
Praticamente si devo fare qualcosa del genere in realtà devo prendere il contenuto di una finestra di un altro programma esterno per prendergli i dati e dato che e fatto in flash player devo prendere la parte che mi serve la lavoro con ocr che funziona già provato, il casino di fare la selezione serve solo per configurare il programma in pratica facendo cosi poi calcolo la posizione della finestra l'angolo superiore per intenderci con getwindinfo cosi anche se la finestra mi cambia posizione non importa.
Non so se raccogliere l'intero desktop come detto da te. comunque forse credo di aver risolto ora lo devo provare ma non son sicuro ancora che funzioni devo ancora scrivere il nuovo pezzo per far ciò.


Fabio
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:16
Giovedì, 18/12/2014
Ma è la solita questione della roulette ?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
pescarese77 (Normal User)
Newbie


Messaggi: 17
Iscritto: 02/02/2012

Segnala al moderatore
Postato alle 23:40
Giovedì, 18/12/2014
Si anche se la cosa mi incuriosiva anche per altre applicazioni comunque risolto il problema era che partiva subito la pressione del tasto del mouse appena si cliccava sul bottone anche se l'evento timer partiva sul evento click il fatto era dovuto che mancava una cosa molto importante che può servire anche per altri problemi. il problema era dato dalla funzione GetAsyncKeyState che non ancora avevo capito bene legendo qui e la ho scoperto che tale funzione puo restiture praticamente 3 risultati anche se a me ne da 2 in prova praticamente restituisce uno short ma ha 2 valori 0 per non premuto e -32768 in esadecimale &H8000 praticamente ho letto da una parte che dovrebbe dare anche -32767 i valori dovrebbero essere così:

0 non è premuto
-32768 E ancora premuto
-32767 E stato premuto

non so se sia vero il il 3 valore non lo notato nelle prove comunque risolto diciamo la cosa nel mio programma mancava che la condizione if andava cambiata
in questo modo
Codice sorgente - presumibilmente C# / VB.NET

  1. If GetAsyncKeyState(Keys.LButton) = "-32768" Then



io avevo scritto senza fare l'uguale e allora partiva non appena il timer entrava in funzione tutto qui il mio errore e quella che doveva essere una risposta semplice


Fabio
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 10:33
Venerdì, 19/12/2014
La funzione restituisce un valore numerico quindi

= -32768

Le virgolette non hanno senso


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
pescarese77 (Normal User)
Newbie


Messaggi: 17
Iscritto: 02/02/2012

Segnala al moderatore
Postato alle 12:21
Venerdì, 19/12/2014
Grazie non avevo fatto caso giusto non è una stringa lo short è un numero tolte ma comunque quando ho provato funziona anche con le virgolette.
E sul fatto che ho trovato scritto che ha 3 valori? ora lo provato levando le virgolette e cosi il programma:
Codice sorgente - presumibilmente VB.NET

  1. Public Class ProvaMouse2
  2.  
  3.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  4.         Timer1.Start()
  5.     End Sub
  6.  
  7.     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
  8.         If GetAsyncKeyState(Keys.LButton) = -32768 Then
  9.             Label1.Text = "E Stato Premuto"
  10.             TextBox1.Text = GetAsyncKeyState(Keys.LButton)
  11.         ElseIf GetAsyncKeyState(Keys.LButton) = -32767 Then
  12.             Label1.Text = "E Ancora Premuto"
  13.             TextBox1.Text = GetAsyncKeyState(Keys.LButton)
  14.         Else
  15.             Label1.Text = "Non è Premuto"
  16.             TextBox1.Text = GetAsyncKeyState(Keys.LButton)
  17.         End If
  18.     End Sub
  19. End Class



Il form contiene solo 2 textbox, un pulsante e un timer come dicevo girando qui e la su internet ho trovato che tale funzione dovrebbe dare 3 risultati quelli che ho scritto io li ripeto qui sotto

0 non è premuto
-32768 E ancora premuto
-32767 E stato premuto

ma ne vedo solo 2:
0 e -32768
va be che se volessi sapere se e stato premuto basta che aggiunga una variabile non è quello il problema far distinzione sarebbe semplice controllo se da -32768 va a 0 il valore che sto verificando per sapere con una variabile booleana che e stato premuto.
ma mi chiedevo se qualcuno più esperto di me sa se sia vero che esiste questi 3 valori e se si perché ne vedo restitutiti solo 2, per il resto ripeto ho risolto ora con la modifica del numero sia con virgolette e sia senza funziona, e credo che funzioni in quando fara la funzione di casting automatica e quindi credo che converta la stringa in numero.
Ora solo per curiosità se i valori che ho letto della funzione GetAsyncKeyState sono 3 vorrei sapere come averli tutti e 3.


Fabio
PM Quote