Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Eleкtro

#1531
.NET (C#, VB.NET, ASP) / Re: 7-ZIp
21 Noviembre 2017, 20:33 PM
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 hacer 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!
#1532
Cita de: alkalo en 21 Noviembre 2017, 19:15 PMComo puedo hacer para que se ejecute pero en el mismo directorio? Que no tenga que buscar C.....

Sencillamente coloca el executable en el directorio de compilación de tu programa (es decir, "al lado" de tu executable compilado). Por defecto se usará ese directorio como directorio de trabajo... de todas formas puedes especificar el directorio de trabajo:


O simplemente puedes escribir el nombre del executable en la propiedad StartInfo.FileName, solo el nombre del executable, la ruta absoluta se resolverá por si sola...
Código (csharp) [Seleccionar]
p.StartInfo.FileName = @"Program.exe";

O también puedes escribir una ruta relativa tal que así:
Código (csharp) [Seleccionar]
p.StartInfo.FileName = @".\Program.exe";

Saludos.
#1533
@Slava_TZD

Muchas gracias compi !

Pues el nombre de la canción ya se ha dicho. La banda (de Rock) que interpreta el tema se llama Against The Current, y el nombre de la vocalista es Chrissy Constanza con 22 años.

Dejo por aquí el videoclip oficial y algo de material adicional:

 

[youtube=480,270]https://www.youtube.com/watch?v=r6zIGXun57U[/youtube]   [youtube=480,270]https://www.youtube.com/watch?v=jrr7e6RLqag[/youtube]
#1534
Estoy buscando info al respecto, pero no encuentro. ¿alguien sabe como se llama la muchacha y la canción épica del minuto 7:33?:

[youtube=640,360]P8FYlrXr82k[/youtube]

( creo que el video es de un campeonato del League Of Legends )

PD: Si veis a partir del minuto 9:20 vais a flipar un poco con la realidad aumentada... ;)

Saludos!
#1535
.NET (C#, VB.NET, ASP) / Re: 7-ZIp
21 Noviembre 2017, 13:56 PM
Lo más apropiado para obtener un control absoluto y eficiente sobre el procedimiento de compresión y descompresión de 7-Zip sería que implementases las funciones exportadas en la librería 7za.dll mediante Platform Invoking, puedes ver un ejemplo ya hecho aquí:

....entiendo que esto es mucho pedir ya que estás empezando en .NET y desconoces muchos conceptos todavía, así que descartamos esa opción, pero sería preferible que en lugar de lo que estás haciendo actualmente llamando al executable 7za.exe sin más, en lugar de eso al menos utilizases la librería SevenZipSharp (a pesar de que esté bastante desactualizada), ya que al menos proporciona un modo mucho más seguro y sofisticado de control mediante su estructuración de código orientado a eventos, esto te permimtiría controlar facilmente el progreso de compresión/descompresión y cualquier error suscribiéndote al evento correspondiente, además de ofrecer la gran ventaja de poder usar enumeraciones y tipos/clases que representan las diversas funcionalidades de 7-Zip y todos esos parámetros que le pasas por command-line al executable 7za.exe.

Pero bueno, ya que en lugar de eso te has decidido por simplemente iniciar un executable externo sin más, entonces intenta hacerlo lo mejor posible, yo te sugiero crear un simple (muy simple) wrapper de 7za.exe a modo de función que se encargue de ejecutar el executable 7za.exe y al menos devolver el código de salida del proceso.

Aquí abajo te dejo un ejemplo que escribí. Nótese que el código lleva hard-coded la ubicación del executable 7za.exe y los parámetros command-line ("a -t7z -mx=9" etc) ...y más cosas. Se puede extender y perfeccionar el código para hacerlo todo más accesible a través de una clase que exponga propiedades para configurar el nivel de compresión, tipo de compresión, tamaño de diccionario, etcétera, pero eso requeriría definir toda clase de miembros entre enumeraciones, métodos/funciones y tipos, todo ello con su respectiva documentación XML lo que en general agrandaría mucho el código (miles de lineas, así son a veces los códigos que suelo publicar por el foro xD), pero no es plan ni de ponerme a reinventar la rueda (me refiero, existiendo la implementación de SevenZipSharp) ni tampoco es plan de extender más de lo necesario un sencillo ejemplo de código que simplemente funcione para resolverte una duda.

También cabe mencionar que al código le faltaría la capacidad de capturar e imprimir el búfer estándar de salida y el de error para así poder controlar el progreso/porcentaje de compresión y posibles errores por parte de (7za.exe), pero bueno, lo dejo así ya que el hecho de implementar el análisis de datos de los streams (el data parsing del std-out y std-err del proceso) sería mucho trabajo de más, y con esto ya considero más que suficiente para que puedas solucionar el problema que tienes...

En fin, aquí lo tienes:
Código (csharp) [Seleccionar]
// int result = CompressFile(@"C:\Filename.ext");
static public int CompressFile(string srcFilePath) {

   if (!File.Exists(srcFilePath)) {
       throw new FileNotFoundException(new FileNotFoundException().Message, srcFilePath);
   }

   string dstFilePath = Path.Combine(Path.GetDirectoryName(srcFilePath), Path.GetFileName(srcFilePath) + ".7z");
   if (File.Exists(dstFilePath)) {
       // Ignore and let 7za.exe replace/update the target file, or handle the file conflict scenario...
       // throw new NotImplementedException("File conflict error-handling not implemented.");
   }

   ProcessStartInfo startinfo = new ProcessStartInfo {
       FileName = "7za.exe",
       WorkingDirectory = @".\",
       Arguments = string.Format("a -t7z -mx=9 -mmt=on -ms=on \"{0}\" \"{1}\"", dstFilePath, srcFilePath),
       CreateNoWindow = true,
       ErrorDialog = true,
       ErrorDialogParentHandle = IntPtr.Zero,
       RedirectStandardError = false,
       RedirectStandardInput = false,
       RedirectStandardOutput = false,
       UseShellExecute = false,
       WindowStyle = ProcessWindowStyle.Hidden
   };

   string full7zPath = Path.Combine(startinfo.WorkingDirectory, startinfo.FileName);
   if (!File.Exists(full7zPath)) {
       throw new FileNotFoundException(new FileNotFoundException().Message, full7zPath);
   }

   using (Process p = new Process()) {
       p.StartInfo = startinfo;
       p.EnableRaisingEvents = false;

       p.Start();
       p.PriorityClass = ProcessPriorityClass.AboveNormal;
       p.WaitForExit(Timeout.Infinite);

       return p.ExitCode;
   }

}


Código (csharp) [Seleccionar]
// int result = await CompressFileAsync(@"C:\Filename.ext");
static public async Task<int> CompressFileAsync(string srcFilePath) {
   Task<int> t = Task.Factory.StartNew<int>(() => Compress(srcFilePath));
   return await t;
}


Modo de empleo sincrónico:
Código (csharp) [Seleccionar]
int result = CompressFile(@"C:\Filename.ext");

Modo de empleo asincrónico:
Código (csharp) [Seleccionar]
int result = await CompressFileAsync(@"C:\Filename.ext");

Si no entiendes algo del código, pregunta sin problemas. Si no entiendes los comentarios que puse en Inglés (como ya dijiste en otro comentario no te llevas bien con el Inglés)... bueno, lo siento pero yo no programo en Castellano, el Inglés es un requisito fundamental de la programación nos guste o no.

Saludos.
#1536
Buenas.

En el foro no se piden tareas, se ayuda a resolver dudas específicas...

Según lo que dices, ya tenías todo hecho en VB.NET pero perdiste el código fuente, en ese caso podrías intentar la migración de código a VB6 con lo que recuerdes... y volver aquí con una duda específica y mostrando tus progresos.

Saludos.
#1537
Cita de: rigorvzla en 20 Noviembre 2017, 18:14 PMno se como hacer que lea el portapapeles luego de tner los datos, me darias un ejemplo aplicable a c#

Te daré algo mejor, la documentación oficial (para WindowsForms):
( ahí tienes un ejemplo en C#. )

...Supongo que además querrás implementar un monitor de actividad del portapapeles. Aquí tienes toda la información necesaria, deberías leerla ( también para prevenirte de utilizar la metodología obsoleta con la función SetClipboardViewer )

Ejemplo en C#:

Saludos.
#1538
Cita de: #!drvy en 20 Noviembre 2017, 16:07 PM
tengo un movil con Android 5.1 y el TTS suena exactamente igual.

Gracias por la ayuda, tenía a Google como segunda opción en mis pensamientos xD.

Doy el tema por solucionado.




Si hay algún interesado como yo, aquí os dejo un video que demuestra que se trata de la misma voz, aunque la voz no parece la misma por que a parte de estar grabada con micrófono suena como algo robótica, y con "cortes", pero si que es la misma voz. Hay que tener en cuenta que el video es de hace unos años (2013) y seguramente Google habrá ido perfeccionando la síntesis hasta el dia de hoy...

[youtube=640,360]https://www.youtube.com/watch?v=761xRdrbZQs[/youtube]

Este video es más reciente (2017) y se puede escuchar mucho mejor la voz, con mejor fluidez en la síntesis:

[youtube=640,360]https://www.youtube.com/watch?v=QDNoWqydD0M[/youtube]
( minuto 2:32 )

Saludos.
#1539
Cita de: rigorvzla en 20 Noviembre 2017, 11:52 AM
me refiero a que el computador "lea literalemnte" con el speechrecognizion
selecciono un texto le ordeno leer y el , lee el objeto y lo habla por las cornetas, lo que no se es el comando para que pueda leer el texto seleccionado

Es decir, eso que no sabes hacer, te refieres a que al seleccionar con el ratón una cadena de texto DE CUALQUIER APLICACIÓN / VENTANA ABIERTA, ¿quieres saber como capturar ese texto desde tu programa? (para luego "leerlo").

Cita de: okik en 20 Noviembre 2017, 01:19 AMCuando dices "leer" ¿te refieres a copiar al portapapeles?

De cualquier aplicación o de la misma

Deberías responder a la pregunta del compañero @Okik para aclarar mejor lo que pretendes hacer, por que no es tan simple si estamos hablando de la instancia de tu propio programa, o de capturar el texto de una ventana externa...

...para esto último se me ocurren al menos 3 alternativas, cada una con sus ventajas y desventajas:

1. API de Windows (funciones de ventana y procesado de mensajes de ventana)
    - Requiere la implementación, el uso y el control de errores de código no administrado.
    - El desarrollo de un algoritmo exitoso podría convertirse en una auténtica pesadilla y llevar mucho tiempo de desarollo con fases de ensayo y error, ya que por necesidad se requiere la implementación de diferentes metodologías para ubicar ventanas en diferentes tipos de ventanas (vease por ejemplo: ChildWindowFromPoint y RealChildWindowFromPoint). Todo depende de lo que realmente necesite hacer tu algoritmo, cómo mínimo vas a tener que deliverar el mensaje de ventana WM_GETTEXT a la ventana del control activo de la ventana principal activa (la cual puedes obtener con la función GetForegroundWindow).
    - Ejecución rápida.

2. Microsoft UI Automation
    - Solución guiada y facil mediante código administrado que simplifica la tediosa implementación equivalente con la API de Windows y le abstrae de cierta dificultad.
    - Solo aplicable a programas que soporten la API de UI Automation ( UIA TextPattern ).
    - Ejecución lenta (muy lenta en comparación con unas simples llamadas a las funciones de la API de Windows).
   
3. Captura del portapapeles de Windows
    - Requiere el uso inevitable y la "escucha" de la combinación de teclas "CTRL+C".
    - Solución intrusiva para el usuario, ya que se reemplazaría el contenido del portapapeles. Por otro lado, se puede llevar a cabo una copia del contenido para restaurarla despues.
    - No funcionaría en todo tipo de ventanas, sobre todo en controles que tengan bloqueado el copiado de texto mediante "CTRL+C".

Luego me dejo la alternativa más avanzada pero que probablemente sería la más eficiente a efectos prácicos: el API Hooking, pero no me hago una idea del todo clara de como se podría implementar a cabo para el objetivo de esta tarea en particular.

Como ves tienes varias opciones, pero desde luego esto no sería cuestion de que te digan "un comando para hacerlo", por favor dejemos de pensar en "comandos" y de pedir "comandos", aquí no hay tales "comandos". La programación requiere de un estudio con un mínimo de conocimiento y/o investigación previa, y del esfuerzo personal/individual para el desarrollo de algoritmos así...

Saludos.
#1540
Cita de: tincopasan en 20 Noviembre 2017, 13:00 PMpues en ese enlace no están todas las voces en español, si bien seguramente en su momento no lo baje de un sitio oficial, venia la voz de conchita (para algunos sonará gracioso el nombre) y de mónica además de las clásicas y conocidas.

Perdón, me confundí en el nombre, todo este tiempo por "Mónica" me estaba refiriendo en realidad a la voz SAPI de Helena (de Microsoft), que está integrada en Windows.

De todas formas es que tengo el Ivona, Loquendo, TextAloud, Balabolka y Nuance (Dragon Naturally speaking / Dragon Dictation) más que vistos y conocidos desde hace años... estoy convencido de que esta voz que estoy buscando no forma parte de ningún tipico programa de esos, por que además en el pasado tuve esta misma duda pero con otras dos voces diferentes y acabé descargándome una infinidad de programas y voces de todo tipo de diferentes voces para investigar (además de esos típicos packs de Ivona o Loquendo con voces que puedes encontrar en Youtube o en páginas de Warez)...


Por eso...tengo mis esperanzas en que la voz debe ser de Microsoft... aunque no puedo estar seguro claro está, pero la experiencia pasada me lleva a concluir mi hipótesis, por que creo que es una voz demasiado currada como para ser de compañías como Ivona o similares. Lo malo es que no encuentro ninguna pista al respecto...

De todas formas me revisaré todas las voces y los comentarios de esos threads que publiqué hace años, a ver si con suerte... pero es que no, si hubiese escuchado esta voz, no la estaría buscando hoy por hoy, por que sin duda es la voz más sofisticada del resto, y con gran diferencia...

Saludos!