Oppure

Loading
16/12/14 22:13
pescarese77
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:
Imports System.Runtime.InteropServices
Public Class FrmAquisizioneNumero

    'Costante per mouse
    Private Const OCR_NORMAL = 32512&

    'Stato dei pulsanti
    <DllImport("user32.dll")> _
    Public Function GetAsyncKeyState(ByVal vKey As System.Windows.Forms.Keys) As Short
    End Function

    'Gestione Mouse con api per cambio icona mouse
    <DllImport("user32")> _
    Private Shared Function CopyIcon(ByVal hIcon As IntPtr) As IntPtr
    End Function


    <DllImport("user32")> _
    Private Shared Function SetCursor(ByVal hCursor As IntPtr) As IntPtr
    End Function

    <DllImport("user32")> _
    Private Shared Function LoadCursor(ByVal hInstance As IntPtr, ByVal lpCursorName As IntPtr) As IntPtr
    End Function

    <DllImport("user32")> _
    Private Shared Function SetSystemCursor(ByVal hcur As IntPtr, ByVal id As IntPtr) As Boolean
    End Function

    <DllImport("user32")> _
    Private Shared Function LoadCursorFromFile(ByVal lpFileName As String) As IntPtr
    End Function

    <DllImport("user32")> _
    Private Shared Function GetCursor() As IntPtr
    End Function


    Private currenthcurs As IntPtr
    Private tempcurs As IntPtr
    '
    Dim TastoSinistroPremutoeRilasciato As Boolean = False
    Private Sub BtnAvviaAquisizione_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAvviaAquisizione.Click
        'Cambiamento Mouse
        Dim hcursor As IntPtr
        Dim ret_val As Boolean
        currenthcurs = GetCursor()
        tempcurs = CopyIcon(currenthcurs)
        hcursor = LoadCursorFromFile("C:\Windows\Cursors\cross_rl.cur")
        ret_val = SetSystemCursor(hcursor, New IntPtr(OCR_NORMAL))
    End Sub

    Private Sub TmrAquisizioneNumero_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TmrAquisizioneNumero.Tick
        If GetAsyncKeyState(Keys.LButton) Then
            Label1.Text = "Sinistro Premuto"
            TextBox2.Text = MousePosition.X & "," & MousePosition.Y
        Else
            TastoSinistroPremutoeRilasciato = True
            Label1.Text = "Sinistro Non Premuto"
            If TastoSinistroPremutoeRilasciato Then
                TextBox3.Text = MousePosition.X & "," & MousePosition.Y
                'Ristabilire Mouse
                Dim ret_val As Boolean
                ret_val = SetSystemCursor(tempcurs, New IntPtr(OCR_NORMAL))
                TmrAquisizioneNumero.Stop()
            End If
        End If
    End Sub
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
aaa
17/12/14 8:21
Hai riletto quello che hai scritto? Non si capisce niente.
17/12/14 10:58
pescarese77
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
aaa
18/12/14 8:01
Snogar
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:
aaa
18/12/14 13:07
pescarese77
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ò.
aaa
18/12/14 14:16
Ma è la solita questione della roulette ?
18/12/14 22:40
pescarese77
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
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
aaa
19/12/14 9:33
La funzione restituisce un valore numerico quindi

= -32768

Le virgolette non hanno senso