Título: Navegar por carpetas mediante código
Publicado por: Yoghurt en 11 Noviembre 2012, 18:38 pm
Hola, quizás hay alguien que sepa como navegar por las carpetas del explorer o "administradores de archivos" mediante código. O sea, cuando el usuario vaya a "Mi PC" y navege por sus archivos usando "C:\windows\explorer.exe", hacer que navege por él mediante código.
Título: Re: Navegar por carpetas mediante código
Publicado por: raul338 en 11 Noviembre 2012, 23:02 pm
Que queres lograr? Abrir un explorador en una carpeta especifica? "Espiar" donde va el usuario?
Título: Re: Navegar por carpetas mediante código
Publicado por: Yoghurt en 12 Noviembre 2012, 00:03 am
Que queres lograr? Abrir un explorador en una carpeta especifica? "Espiar" donde va el usuario?
No, nada de eso además eso ya sé como hacerlo.
Título: Re: Navegar por carpetas mediante código
Publicado por: Danyfirex en 12 Noviembre 2012, 00:48 am
Quizás con FindFirstFile y FindNextFile consigas lo que quieras ;D
Título: Re: Navegar por carpetas mediante código
Publicado por: Yoghurt en 12 Noviembre 2012, 04:52 am
Quizás con FindFirstFile y FindNextFile consigas lo que quieras ;D
Gracias por responder pero ese no es el tema ^^ ...Creo que plantearé mi problema de otra forma para que me entiendan mejor.
Título: Re: Navegar por carpetas mediante código
Publicado por: cyberboom! en 12 Noviembre 2012, 05:07 am
:o aqui hay muchas personalidades que seguramente saben de que hablas, tal vez no te has explicado bien?
Título: Re: Navegar por carpetas mediante código
Publicado por: 79137913 en 12 Noviembre 2012, 13:27 pm
HOLA!!! Si no te malinterprete esta es tu respuesta: Private Sub Form_Load() Shell "explorer.exe ""C:\Carpeta donde guardas el PORNO\""" End End Sub
GRACIAS POR LEER!!!
Título: Re: Navegar por carpetas mediante código
Publicado por: raul338 en 12 Noviembre 2012, 14:03 pm
y si lo reemplazas para inyectarte de alguna forma para ver la memoria del proceso, me parece que vb mucho no te servirá. Pero mirá esto
How to make the feature 'Replace Task Manager' of Process Explorer? (http://stackoverflow.com/questions/7416594/how-to-make-the-feature-replace-task-manager-of-process-explorer)
Título: Re: Navegar por carpetas mediante código
Publicado por: Danyfirex en 12 Noviembre 2012, 14:11 pm
A mi me parece que primero tienes que saber que hace dicha aplicación que tienes en D:\Acceso porque realmente no sabemos si oculta carpeta, o la cifra o cambia de propietario.
Título: Re: Navegar por carpetas mediante código
Publicado por: Yoghurt en 12 Noviembre 2012, 19:28 pm
Gracias por sus respuestas pero por ahí no vá ^^ creo que no me explico bien asi que les dejo un ejemplo de lo que quiero hacer más compatible.
Es un comprimido con 3 carpetas y 3 ejecutables (el mismo copiado 3 veces ^^) con el mismo nombre de la carpeta que al ejecutar el programa navega a la carpeta (mediante SendMessage()) ojalá me entiendan con esto y me ayuden ^^ (probado usando el explorer.exe en Windows XP PELoader modificado)
[link eliminado por el autor]
Título: Re: Navegar por carpetas mediante código
Publicado por: BlackZeroX en 12 Noviembre 2012, 19:35 pm
y ¿El código fuente? me da un poco de cosquillas ejecutar un exe!¡.
Dulces Lunas!¡.
Título: Re: Navegar por carpetas mediante código
Publicado por: Yoghurt en 12 Noviembre 2012, 19:53 pm
y ¿El código fuente? me da un poco de cosquillas ejecutar un exe!¡. Dulces Lunas!¡.
Bueno, ya agregé el source code para los desconfiados ^^ Gracias por sus atenciones.
Título: Re: Navegar por carpetas mediante código
Publicado por: MCKSys Argentina en 12 Noviembre 2012, 20:43 pm
Bueno, modificando un poco el código, obtengo lo mismo con lo siguiente (solo he copiado una parte del code, para no hacer todo mas largo): 'hwnd = GetActiveWindow() 'If (hwnd = 0) Then hwnd = GetForegroundWindow() If (hwnd = 0) Then hwnd = FindWindow(vbNullString, App.Path) SetForegroundWindow hwnd SendKeys "{F4}", True SendKeys "/" + CStr(App.EXEName) + "{ENTER}", True Exit Sub
Este code funciona en Win 7 x64, pero no en XP. Para que funcione en XP hay que quitarle el string "/" al SendKeys. Creo que esto es lo que quieres hacer, no?
Título: Re: Navegar por carpetas mediante código
Publicado por: Yoghurt en 13 Noviembre 2012, 03:41 am
Bueno, modificando un poco el código, obtengo lo mismo con lo siguiente (solo he copiado una parte del code, para no hacer todo mas largo): 'hwnd = GetActiveWindow() 'If (hwnd = 0) Then hwnd = GetForegroundWindow() If (hwnd = 0) Then hwnd = FindWindow(vbNullString, App.Path) SetForegroundWindow hwnd SendKeys "{F4}", True SendKeys "/" + CStr(App.EXEName) + "{ENTER}", True Exit Sub
Este code funciona en Win 7 x64, pero no en XP. Para que funcione en XP hay que quitarle el string "/" al SendKeys. Creo que esto es lo que quieres hacer, no? En mi XP me funciona como dijiste, aunque me gustó más esto: SendKeys "{TAB}{RIGHT}" & "\" & App.EXEName & "{ENTER}", True
Gracias por los que intentaron aportar más datos y entenderme ^^ Haré las cosas como lo tenía pensado, haciendolo compatible uno a uno cada explorador mediante SendMessage(). Gracias MCKSys y ya pude hacerlo con el XYplorer (mediante SendMessage) y es sumamente silencioso igual que con el explorer de windows.
Título: Re: Navegar por carpetas mediante código
Publicado por: MCKSys Argentina en 13 Noviembre 2012, 06:28 am
No funciona ese codigo (al menos no en Win7x64).
Por el código mio: En la pruebas que hice, no se veia desplegarse el list (Si usas F4 a mano si se ve).
Será, quizás, que se ve en maquinas lentas?
En resumen: Quizas se vea el depliegue del list, pero funciona... ;)
Si hago tiempo veré de buscar otro método (quizas por DDE?)
Saludos!
Título: Re: Navegar por carpetas mediante código
Publicado por: BlackZeroX en 13 Noviembre 2012, 06:49 am
No uses SendKeys() Usa la API: Virtual Key http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx Private Declare Sub keybd_event Lib "user32" _ (ByVal bVk As Byte, _ ByVal bScan As Byte, _ ByVal dwflags As Long, ByVal dwExtraInfo As Long) Private Declare Function GetKeyboardState Lib "user32" _ (pbKeyState As Byte) As Long Private Declare Function SetKeyboardState Lib "user32" _ (lppbKeyState As Byte) As Long
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646304(v=vs.85).aspx Un ejemplo de la MSDN (en C, pero al ser algo muy simple te puedes dar una idea muy clara como si fuera vb6 no difiere en prácticamente nada solo el array BYTE). #include <windows.h> void SetNumLock( BOOL bState ) { BYTE keyState[256]; GetKeyboardState((LPBYTE)&keyState); if( (bState && !(keyState[VK_NUMLOCK] & 1)) || (!bState && (keyState[VK_NUMLOCK] & 1)) ) { // Simulate a key press keybd_event( VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0 ); // Simulate a key release keybd_event( VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); } } void main() { SetNumLock( TRUE ); }
DDE o también algo mas nuevo OLE, COM u OLE Automation Dulces Lunas!¡.
Título: Re: Navegar por carpetas mediante código
Publicado por: BlackZeroX en 13 Noviembre 2012, 06:58 am
estuve leyendo las Notas de las anteriores API y bueno esta también esta API
SendInput() http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx
Dilces Lunas!¡.
Título: Re: Navegar por carpetas mediante código
Publicado por: Yoghurt en 13 Noviembre 2012, 18:16 pm
Si, mi notebook corre en slow-motion por eso se vé la Lista. Desconozco el mundo del DDE.
Estoy pensando seguir como lo tenia pensado, usar SendMessage para soportar a la mayoria de los Administradores de Archivos. Pero que dirán los AVs si utilizo "FindWindowEx" y "SendMessage" para buscar un proceso ej. explorer.exe y enviarle texto (WM_SETTEXT)?
Si hay problemas con los AVs puedo hacer lo que dice BlackZero con SendInput ya que es vastante compatible (Key_event esta obsoleta segun MSDN). A alguien le ha dado problemas éstas funciones con los AVs?
FindWindowEx, SendMessage, SendInput y SetFocus.
P.D.: No sirven los SendKeys o SendMessage o SendInput para Total Commander. Usa una barra de direcciones oculta que se demora sobre 1 segundo en aparecer y así no me sirve.
Título: Re: Navegar por carpetas mediante código
Publicado por: Yoghurt en 19 Noviembre 2012, 19:00 pm
OK, gracias por sus aportes ^^ esto es lo que llevo hasta ahora espero prueben y me digan si algo anda mal. Administradores de archivos añadidos: - Explorer XP (solo con barra de direcciones) - Explorer W7 (sin probar) - XYplorer (con o sin barra de direcciones) - AcBrowser (la barra esta siempre) - CubicExplorer (con o sin barra de direcciones) - A43 (solo con barra de direcciones) - TotalCommander (solo primer bloque de carpetas) (Para probarlo creen un par de carpetas y ponganle el mismo nombre que el ejecutable a compilar)' ' mExplore ' Araon - 19/11/2012 ' Option Explicit 'declares para buscar ventanas y enviar mensajes Declare Function GetActiveWindow Lib "user32" () As Long Declare Function GetForegroundWindow Lib "user32" () As Long Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hwnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 'declares para enviar texto y teclas Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Declare Function SendMessageByNum Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 'declares para ejecutar el explorador en caso de no poder navegar Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long 'para esperar hasta que aparezca la barra de dirección (W7) Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'declare para Ac Browser ¬¬ Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long Const VK_F2 = &H71 Const VK_MENU = &H12 Const KEYEVENTF_KEYUP = &H2 'sendKeys "%({F2})" no funciona Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) ' ' La constante: Const WM_CHAR = &H102 'Const WM_SYSCHAR = &H106 Const WM_COMMAND = &H111 'Const WM_SYSCOMMAND = &H112 Const WM_KEYUP = &H101 'Const WM_SYSKEYUP = &H105 Const WM_KEYDOWN = &H100 'Const WM_SYSKEYDOWN = &H104 Const WM_SETTEXT = &HC Const WM_LBUTTONDOWN = &H201 Const WM_LBUTTONUP = &H202 'Const WM_RBUTTONDOWN = &H204 'Const WM_RBUTTONUP = &H205 ' lParam para WM_SYSCOMMAND 'Const SC_CLOSE = &HF060& 'Const SC_MAXIMIZE = &HF030& 'Const SC_MINIMIZE = &HF020& 'Const SC_RESTORE = &HF120&
Private hwnd As Long
Sub Main() Dim sPath As String sPath = App.Path If (Right$(sPath, 1) <> "\") Then sPath = sPath & "\" Call go(sPath & App.EXEName) End Sub
Public Sub go(ByVal sPath As String) 'NOTA: Cuidado con SendKeys puede interferir en otra ventana ' no relacionada con un explorer. Asegurarse primero de ' que se envia a la ventana correcta. If goExplorerXP(sPath) Then Exit Sub 'solo con barra de direcciones If goExplorerW7(sPath) Then Exit Sub If goXYplorer(sPath) Then Exit Sub 'con o sin barra de direcciones OK If goAcBrowser(sPath) Then Exit Sub 'no se puede desactivar la barra OK If goCubicExplorer(sPath) Then Exit Sub 'con o sin barra de direcciones OK If goA43(sPath) Then Exit Sub 'solo con barra de direcciones If goTotalCommander(sPath) Then Exit Sub 'solo primer bloque de carpetas 'default Call ShellExecute(0&, "open", "explorer", sPath, App.Path, vbNormalFocus) End Sub
Function gethWnd() As Long 'obtiene el hWnd de la ventana que tiene el foco 'o la que tiene en el titulo el texto App.Path 'NOTA: Si se ejecuta en un Form usar GetParent()?? hwnd = 0 hwnd = GetActiveWindow() If (hwnd = 0) Then hwnd = GetForegroundWindow() 'If (hwnd = 0) Then hwnd = FindWindow(vbNullString, App.Path) 'If (hwnd = 0) Then hwnd = FindWindow(vbNullString, Mid$(App.Path, InStrRev(App.Path, "\") + 1)) gethWnd = hwnd End Function
'------------------------------------------------------------------------------- ' EXPLORER FUNCTIONS TO USE ACTUAL WINDOW EXPLORER '-------------------------------------------------------------------------------
Function goExplorerXP(ByVal sPath As String) As Boolean 'explorer XP Dim lRet As Long hwnd = gethWnd() If (hwnd <> 0) Then lRet = FindWindowEx(hwnd, 0, "WorkerW", vbNullString) If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "ReBarWindow32", vbNullString) Else Exit Function If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "ComboBoxEx32", vbNullString) Else Exit Function If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "ComboBox", vbNullString) Else Exit Function If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "Edit", vbNullString) Else Exit Function If (lRet <> 0) Then Call SendMessage(lRet, WM_SETTEXT, 0, ByVal sPath) Call PostMessage(lRet, WM_KEYDOWN, &HD&, ByVal &H1C0001) SendKeys "{TAB}", True 'enviar el foco al "FolderView" goExplorerXP = True End If End If End Function
Function goExplorerW7(ByVal sPath As String) As Boolean 'explorer W7 Dim lRet As Long hwnd = gethWnd() If (hwnd <> 0) Then lRet = FindWindowEx(hwnd, 0, "WorkerW", vbNullString) If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "ReBarWindow32", vbNullString) Else Exit Function If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "Address Band Root", vbNullString) Else Exit Function 'abrir la barra de direcciones If (lRet <> 0) Then Call SendKeys("{F4}{F4}", True) Else Exit Function If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "msctls_progress32", vbNullString) Else Exit Function If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "ComboBoxEx32", vbNullString) Else Exit Function If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "ComboBox", vbNullString) If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "Edit", vbNullString) Else Exit Function If (lRet <> 0) Then Call SendMessage(lRet, WM_SETTEXT, 0, ByVal sPath) Call PostMessage(lRet, WM_KEYDOWN, &HD&, ByVal &H1C0001) goExplorerW7 = True End If End If End If End Function
Function goXYplorer(ByVal sPath As String) As Boolean 'XYplorer v11.70.0100 Dim lRet As Long hwnd = gethWnd() If (hwnd <> 0) Then lRet = FindWindowEx(hwnd, 0, "ThunderRT6PictureBoxDC", vbNullString) If (lRet <> 0) Then 'XYplorer (debe buscar el edit) Dim hwnd2 As Long Do While (lRet <> 0) lRet = FindWindowEx(lRet, 0, "Edit", vbNullString) If (lRet <> 0) Then Call SendMessage(lRet, WM_SETTEXT, 0, ByVal sPath) Call PostMessage(lRet, WM_KEYDOWN, &HD&, ByVal &H1C0001) goXYplorer = True Else lRet = FindWindowEx(hwnd, hwnd2, "ThunderRT6PictureBoxDC", vbNullString) If (lRet <> 0) Then hwnd2 = lRet End If Loop End If End If End Function
Function goAcBrowser(ByVal sPath As String) As Boolean 'AcBrowser Plus v4.13 sub version "a" Dim lRet As Long, buff As String hwnd = gethWnd() 'hwnd = GetForegroundWindow() 'AcBrowser usa MDI, obtener hWnd maestro If (hwnd <> 0) Then buff = String$(150, " ") lRet = GetClassName(hwnd, buff, Len(buff)) buff = Left$(buff, lRet) buff = Mid$(buff, 1, 13) & "b" & Mid$(buff, 15) buff = Mid$(buff, 1, 31) & "6" & Mid$(buff, 33) lRet = FindWindowEx(hwnd, 0, "MDIClient", vbNullString) If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, buff, vbNullString) Else Exit Function 'hay que enviarle ALT+F2 para que aparezca le barra de direcciones If (lRet <> 0) Then 'con SendKeys no funciona "%({F2})" keybd_event VK_MENU, 0, 0, 0 keybd_event VK_F2, 0, 0, 0 keybd_event VK_F2, 0, KEYEVENTF_KEYUP, 0 keybd_event VK_MENU, 0, KEYEVENTF_KEYUP, 0 Else Exit Function End If If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "#32770", vbNullString) Else Exit Function If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "#32770", vbNullString) Else Exit Function If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "ComboBoxEx32", vbNullString) Else Exit Function If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "ComboBox", vbNullString) Else Exit Function If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "Edit", vbNullString) Else Exit Function If (lRet <> 0) Then Call SendMessage(lRet, WM_SETTEXT, 0, ByVal sPath) Call PostMessage(lRet, WM_KEYDOWN, &HD&, ByVal &H1C0001) Call PostMessage(lRet, WM_KEYUP, &HD&, ByVal &H1C0001) goAcBrowser = True End If End If End Function
Function goTotalCommander(ByVal sPath As String) As Boolean 'TotalCommander v8.01 ' * solo soporta un lado de las carpetas (IZQ). Mal uso de Sleep ' una fea forma de acceder. Dim lRet As Long hwnd = gethWnd() If (hwnd <> 0) Then lRet = FindWindowEx(hwnd, 0, "TMyPanel", vbNullString) If (lRet <> 0) Then 'TotalCommander (debe buscar el edit) Dim hwnd2 As Long Do While (lRet <> 0) lRet = FindWindowEx(lRet, 0, "TPathPanel", vbNullString) If (lRet <> 0) Then Call PostMessage(lRet, WM_LBUTTONDOWN, &H1&, ByVal &H80166) Call PostMessage(lRet, WM_LBUTTONUP, &H0&, ByVal &H80166) Sleep 1000& lRet = FindWindowEx(lRet, 0, "TInEdit", vbNullString) If (lRet <> 0) Then Call SendMessage(lRet, WM_SETTEXT, 0, ByVal sPath) Call PostMessage(lRet, WM_KEYDOWN, &HD&, ByVal &H1C0001) goTotalCommander = True Exit Function End If Else lRet = FindWindowEx(hwnd, hwnd2, "TMyPanel", vbNullString) If (lRet <> 0) Then hwnd2 = lRet End If Loop End If End If End Function
Function goA43(ByVal sPath As String) As Boolean 'A43 v3.30 Dim lRet As Long hwnd = gethWnd() If (hwnd <> 0) Then lRet = FindWindowEx(hwnd, 0, "TPanel", vbNullString) If (lRet <> 0) Then lRet = FindWindowEx(hwnd, lRet, "TPanel", vbNullString) Else Exit Function If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "TPTSplitter", vbNullString) Else Exit Function If (lRet <> 0) Then 'A43 Explorer lRet = FindWindowEx(lRet, 0, "TPTPane", vbNullString) If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "TJamShellCombo", vbNullString) Else Exit Function If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "TEdit", vbNullString) Else Exit Function If (lRet <> 0) Then Call SendMessage(lRet, WM_SETTEXT, 0, ByVal sPath) Call PostMessage(lRet, WM_KEYDOWN, &HD&, ByVal &H1C0001) goA43 = True Else 'A43 sin barra de direcciones 'activar barra 'SendKeys "%(V{DOWN}~)", True 'SenKeys y keybd_event FALLAN End If End If End If End Function
Function goCubicExplorer(ByVal sPath As String) As Boolean 'CubicExplorer v0.95.1.1494 Dim lRet As Long hwnd = gethWnd() If (hwnd <> 0) Then lRet = FindWindowEx(hwnd, 0, "TSpTBXDock", vbNullString) If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "TCEAddressBarToolbar.UnicodeClass", vbNullString) Else Exit Function If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "TCEAddressBar", vbNullString) Else Exit Function If (lRet <> 0) Then lRet = FindWindowEx(lRet, 0, "TCE_AMemo.UnicodeClass", vbNullString) Else Exit Function If (lRet <> 0) Then Call SendMessage(lRet, WM_SETTEXT, 0, ByVal sPath) Call PostMessage(lRet, WM_KEYDOWN, &HD&, ByVal &H1C0001) goCubicExplorer = True End If End If End Function
Dependo mucho de la barra de direcciones me gustaría mejorar eso.
|