pescarese77 (Normal User)
Newbie
Messaggi: 17
Iscritto: 02/02/2012
|
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 |
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
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Hai riletto quello che hai scritto? Non si capisce niente.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
pescarese77 (Normal User)
Newbie
Messaggi: 17
Iscritto: 02/02/2012
|
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
|
|
Snogar (Normal User)
Pro
Messaggi: 145
Iscritto: 09/01/2012
|
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.
|
|
pescarese77 (Normal User)
Newbie
Messaggi: 17
Iscritto: 02/02/2012
|
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ò.
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Ma è la solita questione della roulette ?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
pescarese77 (Normal User)
Newbie
Messaggi: 17
Iscritto: 02/02/2012
|
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 |
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
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
La funzione restituisce un valore numerico quindi
= -32768
Le virgolette non hanno senso
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
pescarese77 (Normal User)
Newbie
Messaggi: 17
Iscritto: 02/02/2012
|
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 |
Public Class ProvaMouse2 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Timer1.Start() End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick If GetAsyncKeyState(Keys.LButton) = -32768 Then Label1.Text = "E Stato Premuto" TextBox1.Text = GetAsyncKeyState(Keys.LButton) ElseIf GetAsyncKeyState(Keys.LButton) = -32767 Then Label1.Text = "E Ancora Premuto" TextBox1.Text = GetAsyncKeyState(Keys.LButton) Else Label1.Text = "Non è Premuto" TextBox1.Text = GetAsyncKeyState(Keys.LButton) End If End Sub 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.
|
|