Cita de: rigorvzla en 21 Noviembre 2017, 17:34 PM
yo necesito hacer click en un archivo y sobrearlo, en ese punto cuando corra esos parametros , me tome el click y haga lo q debe hacerCódigo [Seleccionar]string sourceName = "ExampleText.txt";
este parametro no me capta lo que yo tenga el objeto seleccionado en ese momento ya que requiere una direccion predestianda . mi pregunta es como puedo dejar ese valor en blanco y que me tome el objeto que tenga seleccionado con el click del raton, o que se cree un objeto con el clikck del raton para yo al tener ese valor capturado referenciarlo como archivo a comprimir.
Disculpa pero no se te entiende nada, no se que es "sobrear" un archivo, ni tampoco "que me tome el click y haga lo que debe hacer", ¿que es lo que debe hacer?. Intenta explicar todo con mejor detalle, sin prisa pero sin pausa lo que quieres hacer, por que así no vamos a ninguna parte...
Lo que has dicho se puede interpretar de mil formas, como por ejemplo no sé si te puedes estar refiriendo a crear una shell-extensión y registrarla en el S.O. para añadir una nueva opción/comando al menú contextual de archivos, para que aparezca un comando personalizado cuando haces click derecho sobre un archivo, y ahí ya estariamos hablando de programación avanzada (que además requiere conocimiento de C/C++) que no sería una tarea apta para alguien que acaba de empezar en C# / .NET, pero bueno, no voy a suponer nada ni a explicar más de la cuenta por que no se entiende lo que quieres hacer y a lo mejor no es eso.
De todas formas es que estás formulando preguntas de programación avanzada que no van acorde al nivel actual de aprendizaje que llevas, son cosas que en mi humilde opinión no creo que las vayas a poder entender ni llevar a cabo sin la suficiente experiencia y la práctica, pides que te digan como hacer las cosas como panes, pero no muestras nada acerca de tu supuesta investigación, ¿donde has buscado?, ¿qué has intentado hacer por ti mismo?, ¿donde está el código que demuestra lo que te has esforzado en intentar?. Recuerda que aquí no le hacemos el trabajo a nadie.
...Aun así, voy a ser bueno, y te ofreceré soluciones:
· 1-A
Si te estás refiriendo a lo de añadir una opción al menú contextual de archivos, una forma más o menos sencilla de hacerlo sería a través de la librería de terceros SharpShell:
...la librería basicamente contiene un montón de wrappers de varios miembros de C++, es una librería con ciertas limitaciones por eso, pero es una manera cómoda y viable para desarrollar una shell-extension con código administrado y así evitar todo el embrollo que tendriams que implementar con código nativo....
· 1-B
Una forma cutre pero todavía más sencilla (mucho, mucho más sencilla) de hacerlo sería mediante el registro de Windows, simplemente agregando un par de claves. Es una forma muy sencilla como digo, y estoy seguro que puedes encontrar miles de ejemplos en Google si buscas por "cómo agregar programa al menú contextual de archivos". Evidentemente esto ya no sería una extensión de la shell, es una opción muy limitada en comparación, pero igual te podría servir para cumplir el objetivo que tengas... dependiendo de cual sea este (si es algo básico como hacer click derecho sobre un archivo para "cargar" ese archivo en tu programa, entonces esta metodología te sirve de sobra sin necesidad de crear una shell-extension).
· 2-A
Si por lo contrario te estás refiriendo a detectar cuando un elemento (archivo o directorio) es seleccionado en la instancia/ventana activa del explorador de Windows, la manera correcta de llevar a cabo esta tarea sería aplicando un hook al Explorer (al objeto ExplorerWindow), para escuchar los eventos de selección de elementos. Esto es algo que requeriría mucha investigación, análisis en profundidad del proceso Explorer.exe, es decir, de las llamadas internas a APIs y los parámetros que se utilicen, y bastante ensayo y error. Pides cosas muy avanzadas (también son avanzadas para mi, no soy un experto en hooks ni API hooks), evidentemente no tengo un ejemplo que mostrar, y dudo que haya alguno por Internet... basicamente por que es un tema complicado donde cualquier trabajo suele hacerse para uno mismo, y también es una necesidad o duda muy específica. De todas formas puedo recomendarte una librería comercial para .NET muy util con la que he trabajado en el pasado para este tipo de inyecciones: Deviare API Hook
· 2-B
Una forma cutre (no tan eficiente) de hacerlo sería mediante un objeto Timer para determinar cada poco intervalo de tiempo (100 ms por ejemplo) si existe algún archivo/carpeta seleccionado en la ventana que esté activa. Sería una solución basada en el uso de los wrappers de interfaces nativas que expone el objeto Shell.
Esta metodología tendría un gran inconveniente y es que realmente no estariamos detectando o suscritos a ningún "evento de selección de archivos" en el Explorer, sino que estariamos asumiendo ciertas cosas con un margen de error aceptable.
He escrito el siguiente ejemplo para aplicar esta metodología. Aquí lo tienes:
Código (csharp) [Seleccionar]
using System;
using System.Runtime.InteropServices;
using System.Security;
[SuppressUnmanagedCodeSecurity]
public sealed class SafeNativeMethods {
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms633505%28v=vs.85%29.aspx
[DllImport("User32.dll", SetLastError = false)]
public static extern IntPtr GetForegroundWindow();
}
+
Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using Shell32;
using SHDocVw;
Código (csharp) [Seleccionar]
public static IEnumerable<FolderItem> GetSelectedItems() {
IntPtr hwnd = SafeNativeMethods.GetForegroundWindow();
// http://msdn.microsoft.com/en-us/library/windows/desktop/ff521731%28v=vs.85%29.aspx
Shell shell = new Shell();
ShellWindows windows = (ShellWindows)((IShellDispatch6)shell).Windows();
foreach (InternetExplorer window in windows) {
if (window.HWND == Convert.ToInt32(hwnd)) {
foreach (FolderItem item in ((IShellFolderViewDual3)window.Document).SelectedItems()) {
yield return item;
}
break;
}
}
}
+
Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using Shell32;
Código (csharp) [Seleccionar]
private void Timer1_Tick(object sender, EventArgs e) {
IEnumerable<FolderItem> items = GetSelectedItems();
if ( items.Any() ) {
IEnumerable<string> filepath = (from item in itemsitem.Path);
} else {
// No items selected, or none Explorer window has focus. (hard to debug)
}
}
El código de arriba requiere una referencia a las sigueintes librerías COM:
- Microsoft Internet Controls
- Microsoft shell Controls And Automation
Saludos!