elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Formatear sin usar SHFormatDrive
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Formatear sin usar SHFormatDrive  (Leído 2,828 veces)
Fabricio

Desconectado Desconectado

Mensajes: 115


Ver Perfil
Formatear sin usar SHFormatDrive
« en: 5 Febrero 2009, 14:14 pm »

Hola a todos tengo una pregunta estoy buscando la forma de formatear un pendrive con VB 6 sin usar SHFormatDrive que lo unico que hace es abrir la ventana de Windows "Dar Formato"... a ver si me explico se puede formatear un pendrive por codigo sin abrir la ventana de Windows "Dar Formato"

Alguna pista????
Gracias por su ayuda


En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: Formatear sin usar SHFormatDrive
« Respuesta #1 en: 5 Febrero 2009, 18:45 pm »

Que tal si utilizas el comando Format de CMD?

Seria de este modo:
Código
  1. Shell "format X: /Q /X"

Saludos ;D


En línea

Fabricio

Desconectado Desconectado

Mensajes: 115


Ver Perfil
Re: Formatear sin usar SHFormatDrive
« Respuesta #2 en: 6 Febrero 2009, 13:45 pm »

Hola Karcrack  gracias por responder probe tu ejemplo
Código:
 Dim a As Double
a = Shell("format A: /Q /X", 0)

pero me tira el siguiente error "Error 532 no se ha encontrado el archivo"
busque en la ayuda de VB 6 y me parace q la sentencia esta bien
 :huh: que hice mal por que no logro darme cuenta

saludos
En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: Formatear sin usar SHFormatDrive
« Respuesta #3 en: 6 Febrero 2009, 14:37 pm »

Prueba asi:
Código
  1. Dim a As Double
  2. a = Shell("cmd.exe /C Format A: /Q /X", 0)
Y asegurate de tener un disquete que pueda ser formateado ;)

Saludos ;D
En línea

Fabricio

Desconectado Desconectado

Mensajes: 115


Ver Perfil
Re: Formatear sin usar SHFormatDrive
« Respuesta #4 en: 6 Febrero 2009, 15:53 pm »

Hola de nuevo Karcrack de verdad te agradezco que me contestes veo q tambien lo hiciste en otro foror planteado por mi
Te cuento q ya descubri el error
Código:
a = Shell("format.com A: /Q /X ")
similar es similar a lo q me dijiste
funcione pero abre una ventana de DOS y espera q presione enter para continuar..

quisas yo me exprese mal al plantear el preblema yo deseo formatear en forma directa por codigo sin tener q confirmar.. mi jefe me dijo que pruebe esto
Código:
a = Shell("format.com A: /Q /X < " & App.Path & "\y.txt", 0)
y en el archivo y.txt ponga la letra Y (de yes) o un enter me dijo que de esta forma tendria q funcionar pero no lo hace???

 :huh:
saludos
En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: Formatear sin usar SHFormatDrive
« Respuesta #5 en: 6 Febrero 2009, 18:21 pm »

Bueno, me he hartado de este tema y he hecho este modulo ;)

Es un poco complicado, y esta medio chapuza, pero no consegui hacerlo de otra forma :¬¬

Asi que aqui va: (En un modulo)
Código
  1. '---------------------------------------------------------------------------------------
  2. ' Modulo    : mFormat
  3. ' Autor     : Karcrack
  4. ' Fecha-Hora: 06/02/2009  17:45
  5. ' Finalidad : Formatear una unidad sin interaccion del usuario
  6. ' Referencia: MSDN
  7. '---------------------------------------------------------------------------------------
  8.  
  9. Option Explicit
  10. '--------------
  11. Private Declare Function SHFormatDrive Lib "shell32.dll" (ByVal hwnd As Long, ByVal drive As Integer, ByVal fmtID As Long, ByVal options As Integer) As Long
  12. Private Const SHFMT_OPT_FULL        As Long = 1
  13. Private Const SHFMT_OPT_SYSONLY     As Long = 2
  14. Private Const SHFMT_ID_DEFAULT      As Long = 65535
  15. '--------------
  16. Private Declare Function KillTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
  17. Private Declare Function SetTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
  18. '--------------
  19. Private Declare Function EnumChildWindows Lib "user32.dll" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
  20. Private Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
  21. Private Declare Function IsWindowVisible Lib "user32.dll" (ByVal hwnd As Long) As Long
  22. Private Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
  23. Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
  24. Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
  25. Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  26. Private Const BM_CLICK              As Long = &HF5&
  27.  
  28. Private bDone                       As Boolean
  29.  
  30. Public Function Format_Hide(ByVal hwnd As Long, ByVal sDrive As String, Optional ByVal tOpt As Long) As Long
  31.    Dim lRet        As Long
  32.    Dim lDrive      As Long
  33.  
  34.    'Obtenemos un numero valido para nuestra API
  35.    lDrive = Asc(UCase$(Left$(sDrive, 1))) - Asc("A")
  36.    'Establecemos el timer que automaticamente aceptara
  37.    Call SetTimer(0&, 1, 10, AddressOf TimerProc)
  38.    'Llamamos al API
  39.    Format_Hide = SHFormatDrive(hwnd, lDrive, SHFMT_ID_DEFAULT, tOpt)
  40. End Function
  41.  
  42. Private Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
  43.    If bDone = False Then
  44.        'Enumeramos todas las ventanas
  45.        Call EnumWindows(AddressOf EnumWindowsProc, 0&)
  46.    End If
  47. End Sub
  48.  
  49. Private Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
  50.    'Si es visible...
  51.    If IsWindowVisible(hwnd) <> 0 Then
  52.        'Si contiene el caracter ½, que sale en el texto de la ventana del formato...
  53.        If InStr(1, GetWinText(hwnd), "½", vbTextCompare) > 0 Then
  54.            'Enumeramos sus controles...
  55.            Call EnumChildWindows(hwnd, AddressOf EnumChildProc, 0&)
  56.            'Escondemos la ventana...
  57.            Call ShowWindow(hwnd, 0)
  58.            'Matamos a nuestro timer
  59.            Call KillTimer(0&, 1)
  60.            'Dejamos de listar
  61.            EnumWindowsProc = False
  62.            Exit Function
  63.        End If
  64.    End If
  65.    EnumWindowsProc = True
  66. End Function
  67.  
  68. Private Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
  69.    'Si es el boton iniciar... v- Solo funciona con versiones en Español del Windows
  70.    If GetWinText(hwnd) = "&Iniciar" And GetWinClassName(hwnd) = "Button" Then
  71.        'Avisamos de que ya esta hecho
  72.        bDone = True
  73.        'Apretamos el boton
  74.        Call PostMessage(hwnd, BM_CLICK, 0&, 0&)
  75.        'Apretamos Aceptar
  76.        Call SendKeys("{ENTER}", 100)
  77.        'Dejamos de listar
  78.        EnumChildProc = False
  79.        Exit Function
  80.    End If
  81.    EnumChildProc = True
  82. End Function
  83.  
  84. Private Function GetWinText(ByVal hwnd As Long) As String
  85.    'Creamos el buffer
  86.    GetWinText = String$(260, Chr$(0))
  87.    'Recortamos el buffer y Llamamos al API
  88.    GetWinText = Left$(GetWinText, GetWindowText(hwnd, GetWinText, Len(GetWinText)))
  89. End Function
  90.  
  91. Private Function GetWinClassName(ByVal hwnd As Long) As String
  92.    'Creamos el buffer
  93.    GetWinClassName = String$(260, Chr$(0))
  94.    'Recortamos el buffer y Llamamos al API
  95.    GetWinClassName = Left$(GetWinClassName, GetClassName(hwnd, GetWinClassName, Len(GetWinClassName)))
  96. End Function

Lo he comentado cuanto he podido para que lo entendieras, si no entiendes algo solo has de preguntar ;D

Tiene un par de BUGs, pero no tengo tiempo para repararlos... el bug es que nunca vuelve al VB, porque no se cierra al acabar el formateo.. seria facil de solucionar.. pero no tengo tiempo.. cuando lo tenga intentare solucionarlo :rolleyes:

Saludos ;D
En línea

Fabricio

Desconectado Desconectado

Mensajes: 115


Ver Perfil
Re: Formatear sin usar SHFormatDrive
« Respuesta #6 en: 9 Febrero 2009, 18:00 pm »

Mil Gracias!!!!!!!!!!!!!!!!! lo leo pruebo y te comento como me funciono
un gran saludo  ;)
En línea

Fabricio

Desconectado Desconectado

Mensajes: 115


Ver Perfil
Re: Formatear sin usar SHFormatDrive
« Respuesta #7 en: 12 Febrero 2009, 14:54 pm »

Hola Karcrack  probe tu codigo pero no me funciona trate de hacerle un par de cambios pero tampoco dio resultado

Aca te paso un codigo que arme tengo dos problemas
1) el codigo solo funciona cuando la ventana Dar Formato.. esta visible.. yo necesito cargar la ventana y luego manejarla  (probe con SHFormatDrive para cargarla pero el codigo cargo la ventana y nada mas)

2) si la ventana esta visible solo logro hacer click en el boton Iniciar luego no se como manejar la ventana de ADVERTENCIA que aparece

te paso el codigo para ver si te surge una idea es solo un formulario con un boton
la ventana Dar Fomato de Windows debe estar abierta
mil gracias
Código:
Option Explicit
   
' Funciòn APi para buscar Ventanas de Windows
Private Declare Function FindWindow _
    Lib "user32" _
    Alias "FindWindowA" ( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long
       
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer

Private Declare Function ShowWindow _
        Lib "user32" _
       (ByVal hwnd As Long, _
        ByVal nCmdShow As Long) As Long
       
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
    ByVal hwnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    lParam As Any) As Long
       
     
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, _
    ByVal bScan As Byte, _
    ByVal dwFlags As Long, _
    ByVal dwExtraInfo As Long)
   
'constantes para SHFormatDrive
Const SHFMT_ID_DEFAULT As Long = 65535

' constantes para las teclas
'Const keyeventf_keyup = &H2
Const KEYEVENTF_KEYUP = &H2
'Const keyeventf_extendedkey = &H1
Const KEYEVENTF_EXTENDEDKEY = &H1
Const VK_RETURN = &HD

Const NOMBRE_VENTANA = "Dar Formato Disco de 3½ (A:)"
       
'constantes para ShowWindow
Const SW_HIDE = 0
Const SW_SHOWNORMAL = 1
Const SW_SHOWMINIMIZED = 2
Const SW_MAXIMIZE = 3
Const SW_SHOWMAXIMIZED = 3
Const SW_SHOWNOACTIVATE = 4
Const SW_SHOW = 5
Const SW_MINIMIZE = 6
Const SW_SHOWMINNOACTIVE = 7
Const SW_SHOWNA = 8
Const SW_RESTORE = 9
Const SW_SHOWDEFAULT = 10
Const SW_MAX = 10

'constantes para SendMessage
Const BM_SETSTATE = &HF3
Const WM_LBUTTONDOWN = &H201 ' botón izquierdo abajo
Const WM_LBUTTONUP = &H202 ' izquierdo arriba
Const BM_CLICK = &HF5


Private Sub Comprobar(ventana As String)
 
    Dim retorno As Long
    Dim boton_iniciar As Long
    Dim boton_cerrar As Long
    Dim boton_aceptar As Long
    Dim retorno2 As Long
       
   
    ' busca la ventana y retorna el Handle
    retorno = FindWindow(vbNullString, ventana) ' aca detecta por el nombre de la ventana
    boton_iniciar = FindWindowEx(retorno, 0, vbNullString, "&Iniciar") 'identifico el boton iniciar
    boton_cerrar = FindWindowEx(retorno, 0, vbNullString, "&Cerrar") 'identifico boton cerrar
       
    ' simulo el click al boton
    Call SendMessage(boton_iniciar, BM_CLICK, 0, 0)
    Call SendMessage(boton_iniciar, BM_CLICK, 0, 0)
    Call SendMessage(boton_iniciar, BM_SETSTATE, 0, ByVal 0&)
             
        'esta parte del codigo no funciona
    boton_aceptar = FindWindowEx(retorno, 0, vbNullString, "Aceptar") 'identifico boton aceptar
    If boton_aceptar <> 0 Then
        Call SendMessage(boton_aceptar, BM_CLICK, 0, 0)
        Call SendMessage(boton_aceptar, BM_CLICK, 0, 0)
        Call SendMessage(boton_aceptar, BM_SETSTATE, 0, ByVal 0&)
    End If
   
       
End Sub
 
Private Sub Command1_Click()
    ' Para comprobar si está abierto el Internet explorer
    Comprobar NOMBRE_VENTANA
End Sub
 


En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: Formatear sin usar SHFormatDrive
« Respuesta #8 en: 12 Febrero 2009, 17:08 pm »

Dame un poco de tiempo, este fin de semana (Si dios quiere y tengo tiempo libre :() Te hago un code 100% funcional, usando PIPES y el comando FORMAT ;)

Siento no poderte ayudarte antes, pero no me da el tiempo para todo :-[

Saludos ;)
En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: Formatear sin usar SHFormatDrive
« Respuesta #9 en: 13 Febrero 2009, 17:06 pm »

Lo prometido es deuda:
Citar

Saludos :¬¬
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines