Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
26/08/08 20:09
roberto82
Salve a tutti, sto realizzando un programma in VB6 che permetta di effettuare una teleassistenza tipo remote desktop.
Il programma è diviso in due parti: un client ed un server.
Utilizzando alcune API di windows sono riuscito ad effettuare il controllo del mouse, ciò che mi manca è poter visualizzare nel programma server ciò che succede nello schermo del programma client, per fare ciò ho ho utilizzato l'API Keydb_event per simulare il PrintScreen dello schermo ed avere un'immagine da poter trasferire al programma server. Inizialmente ho seguito questa pista: Ho salvato su file l'immagine catturata con il PrintScreen; ho inviato il file al programma server che ricevuto lo stesso lo salva su disco per poterlo poi caricare in un controllo image. Essendo però, la funzione, all'interno di un timer con intervallo settato ad 1 mSec tutti i salvataggi e gli accessi a disco rigido mi "inchiodano" il programma!

Vorrei sapere se esiste un modo per poter inviare il file dal programma client al programma server senza dover per forza salvare lo stesso su disco prima di poterlo caricare su un controllo image.

Grazie Anticipatamente!
aaa
27/08/08 9:41
GrG
mi spiace ma penso che tu debba per forza salvare prima l'immagine su HD e poi caricarla nel controllo image o picturebox.
aaa
27/08/08 14:24
Overflow
non so se è possibile inviare il contenuto della clipboard tramite winsock.

winsock1.senddata clipboard.getdata(vbcfbitmap)


ma non so come ricevere dall'altra parte.
aaa
27/08/08 18:18
roberto82
Grazie mille! l'idea Winsock1.SendData (vbcfBitmap) è buona! ora cercherò di creare la controparte per ricevere il file poichè se vado sull'evento data_arrival del server per ora mi restituisce un numero tipo: -958754754.
Grazie ancora a tutti, vi farò sapere...

aaa
01/09/08 18:21
roberto82
Salve a Tutti! credo di aver risolto in parte il mio problema, ho utilizzato 3 API per trasformare l'immagine in un array dove sono memorizzati i pixel dell'immagine con i rispettivi colori da 0 a 255. Le API in questione sono: GetObject, GetBitmapBits e SetBtmapBits. Il problema che ho ora è un'altro: Credo, correggetemi se sbaglio, che la funzione Winsock1.SendData, o il controllo Winsock, permettano di spedire massimo 4096 KB di dati alla volta, infatti l'mmagine che ricevo nel programma server è dimezzata. Qualcuno sa indicarmi, sempre che la mia supposizione sia giusta, se esiste un modo per aumentare la capienza dei dati da inviare???

Grazie ancora a tutti!
aaa
01/09/08 19:11
GrG
bè un limite c'è (ora nn ricordo se è cm quello ke dici tu)...

Cmq devi "spezzare" il file e mandarlo in più pacchetti...

In pratica devi utilizzare qualche ciclo...

Farebbe comodo se posti il codice che usi...
aaa
02/09/08 17:48
roberto82
Ti posto il codice che ho utilizzato:


‘’’’ LATO CLIENT ‘’’’


Private Sub InviaDesktop()

If teleassistenza = True And SockMain.State = sckConnected Then

‘ posiziona il cursore in base alle coordinate ricevute

SetCursorPos Val(Text1.Text), Val(Text2.Text)
On Error Resume Next

‘ esegue il print dello schermo

PrintScreen (False)

‘carica l’immagine nel controllo picture

Picture1.Picture = Clipboard.GetData(vbCFBitmap)
GetObject Picture1.Picture, Len(PicInfo), PicInfo
BytesPerLine = (PicInfo.bmWidth * 3 + 3) And &HFFFFFFFC

'questo array (picbits) è molto grande
' dell'ordine PicBits(7000000) as byte
ReDim PicBits(1 To BytesPerLine * PicInfo.bmHeight * 3) As Byte

'Copia i bit dell’immagine in un array

GetBitmapBits Picture1.Image, UBound(PicBits), PicBits(1)

‘ invia l’array di bits

SockTele.SendData (PicBits)
DoEvents

End If
End Sub



‘’’’ LATO SERVER ‘’’’



Private Sub SockMain_DataArrival(ByVal bytesTotal As Long)
Dim dati As String

SockMain.GetData dati
If dati = "disconnetti" Then
txtLog.Text = txtLog.Text & "@ DISCONNESSIONE @ {HOST: " & SockMain.RemoteHostIP & " - PORTA: " & SockMain.RemotePort & "}" & vbCrLf
Else
‘ recupera i bits dell’array inviato dal client e li imposta nel controllo picture
SetBitmapBits Picture1.Image, UBound(dati), dati(1)
Refresh
Picture1.Refresh
End If

End sub

Grazie ancora una volta del tempo che mi dedichi!
Ultima modifica effettuata da roberto82 02/09/08 17:51
aaa
02/09/08 17:55
GrG
Bè prima di tutto ti devi assicurare che il client invia tutti i dati....

io metterei un ciclo qui:

‘ invia l’array di bits

SockTele.SendData (PicBits)
DoEvents

End If
End Sub


trasformandolo in:
dim i as integer
‘ invia l’array di bits
for i = 0 to Ubound(PicBits)
SockTele.SendData PicBits(i)
next i
DoEvents

End If
End Sub

Così il client invierà tutti i dati nell'arrai...

e dovresti fare anche un ciclo quando ricevi i dati...
aaa