Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: josh en 4 Abril 2018, 08:26 am



Título: Cerrar "Carpetas" en C#
Publicado por: josh en 4 Abril 2018, 08:26 am
Buenas, no se si alguien sabrá como cerrar una carpeta especifica abierta,como el administrador de tareas de windows, en la que seleccionas una carpeta abierta
y finalizas la tarea; Lo he intentando con Process.GetProcesses(),
 para que me de todos los procesos abiertos
y después ver sus nombres con process.ProcessName,
 pero no me sale las CARPETAS abiertas solo me sale "explorer" y cuando cierro
 el explorer con kill() se me cierran todas las carpetas,
Lo que yo quiero es cerrar una carpeta especifica.
 No se si me pueden ayudar.


Título: Re: Cerrar "Carpetas" en C#
Publicado por: Eleкtro en 4 Abril 2018, 13:05 pm
Lo que comentas es normal y obvio; la función Process.GetProcesses() como su nombre indica por si mismo tiene el propósito de devolver una colección de procesos en ejecución, no una colección de ventanas creadas por "X" proceso...

Aquí abajo te comparto un código de mi librería comercial ElektroKit para obtener las ventanas abiertas del explorador de Windows:

Código
  1. ''' ----------------------------------------------------------------------------------------------------
  2. ''' <summary>
  3. ''' Gets a <see cref="IEnumerable(Of ShellBrowserWindow)"/> containing the opened windows explorer instances.
  4. ''' </summary>
  5. ''' ----------------------------------------------------------------------------------------------------
  6. ''' <returns>
  7. ''' A <see cref="IEnumerable(Of ShellBrowserWindow)"/> containing the opened windows explorer instances.
  8. ''' </returns>
  9. ''' ----------------------------------------------------------------------------------------------------
  10. <DebuggerStepThrough>
  11. Public Shared Iterator Function GetExplorerWindows() As IEnumerable(Of ShellBrowserWindow)
  12.  
  13.    Dim shell As New Shell32.Shell
  14.  
  15.    Try
  16.        For Each window As ShellBrowserWindow In DirectCast(shell.Windows, IShellWindows)
  17.  
  18.            Select Case window.Document.GetType().Name
  19.  
  20.                Case "__ComObject" ' Explorer Window. ShellWindowTypeConstants.SWC_EXPLORER
  21.                    Yield window
  22.  
  23.               ' Case "HTMLDocumentClass" ' Internet Explorer Window. ShellWindowTypeConstants.SWC_BROWSER
  24.               '     ' Do Nothing.
  25.  
  26.                Case Else ' Other type of window.
  27.                    ' Do Nothing.
  28.  
  29.            End Select
  30.  
  31.        Next window
  32.  
  33.    Catch ex As Exception
  34.        Throw ex
  35.  
  36.    Finally
  37.        Marshal.FinalReleaseComObject(shell)
  38.  
  39.    End Try
  40.  
  41. End Function

En C# el equivalente sería practicamente igual, pero con la sintaxis de C# claro está:
Código
  1. /// ----------------------------------------------------------------------------------------------------
  2. /// <summary>
  3. /// Gets a <see cref="IEnumerable{ShellBrowserWindow}"/> containing the opened windows explorer instances.
  4. /// </summary>
  5. /// ----------------------------------------------------------------------------------------------------
  6. /// <returns>
  7. /// A <see cref="IEnumerable{ShellBrowserWindow}"/> containing the opened windows explorer instances.
  8. /// </returns>
  9. /// ----------------------------------------------------------------------------------------------------
  10. [DebuggerStepThrough]
  11. public static IEnumerable<ShellBrowserWindow> GetExplorerWindows() {
  12.  
  13.    Shell32.Shell shell = new Shell32.Shell();
  14.  
  15.    try {
  16.        foreach (ShellBrowserWindow window in (IShellWindows)shell.Windows()) {
  17.  
  18.            switch (window.Document.GetType().Name) {
  19.  
  20.                case "__ComObject":  // Explorer Window. ShellWindowTypeConstants.SWC_EXPLORER
  21.                    yield return window;
  22.                    break;
  23.  
  24.                // case "HTMLDocumentClass": // Internet Explorer Window. ShellWindowTypeConstants.SWC_BROWSER
  25.                //    break;
  26.  
  27.                default: // Other type of window.
  28.                    break;
  29.            }
  30.        }
  31.    } finally {
  32.        Marshal.FinalReleaseComObject(shell);
  33.    }
  34. }
  35.  

La colección enumerable devuelta podrías iterarla de la siguiente forma que muestro aquí abajo. En este ejemplo busco la primera coincidencia de una ventana cuya ruta especificada en la barra de navegación sea "C:\", y cierro dicha ventana...

Código
  1. [STAThread]
  2. static void Main(string[] args) {
  3.  
  4.    IEnumerable<ShellBrowserWindow> explorerWindows = GetExplorerWindows();
  5.  
  6.    foreach (ShellBrowserWindow Window in explorerWindows) {
  7.        ShellFolderView view = (ShellFolderView)Window.Document;
  8.        Folder2 folder = (Folder2)view.Folder;
  9.        string path = folder.Self.Path;
  10.  
  11.        // Si la ruta en la barra de navegación es "C:\", cerramos esta ventana y salimos del búcle.
  12.        if (path.Equals(@"C:\", StringComparison.OrdinalIgnoreCase)) {
  13.            Window.Quit();
  14.            break;
  15.        }
  16.    }
  17.  

Nótese que necesitas referenciar las librerías Shell32.dll y SHDocv.dll para poder utilizar el código mostrado. Y aparte, no te olvides de especificar la clase de atributo STAThread como en el ejemplo, de lo contrario en C# tendrás errores de casting/conversión de tipos en tiempo de ejecución con las interfaces COM de Shell32 / SHDocVw.

Saludos.