Ir al contenido


Foto

[RESUELTO] Detectar los archivos seleccionados en Windows Explorer


  • Por favor identifícate para responder
6 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 23 enero 2010 - 02:02

Pues eso, necesito detectar los archivos seleccionados en Windows Explorer, ¿para qué?, bueno, sucede lo siguiente, tengo un menú contextual que he creado la cual se llama desde el Registro de Güindos desde delphi cuyo valor es:



delphi
  1. "C:\Archivos de programa\Project\Project1.exe" "%1"



De modo que en Delphi el valor de "%1" (Que es el archivo seleccionado) la obtengo con ParamStr(1), hasta ahí todo bien, pero si selecciono dos archivos me abre el proyecto dos veces, o sea, se abre con cada uno de los archivos selecionados y quisiera evitar eso, por eso el motivo de contar los archivos seleccionados para realizar un ciclo for y realizar las acciones correspondientes. ¿Alguna idea?.

Saludos.
  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 23 enero 2010 - 09:07

Bueno conseguí esta información pero aún no me funciona, ya que me abre una instancia por cada archivo seleccionado en vez de todos en una sóla :(
  • 0

#3 Al González

Al González

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 99 mensajes

Escrito 24 enero 2010 - 01:23

Hola Fernando.

Leyendo tu planteamiento y el artículo que enlazas, me parece que el problema reside en que el Explorador de Windows ejecuta rápida y simultáneamente una instancia de tu programa por cada archivo seleccionado (lo cual es razonable), pero de tal manera que la función FindWindow empleada para validar la existencia de otras instancias no encuentra la ventana de las demás instancias, puesto que apenas se está iniciando la aplicación de esas otras instancias.

Una solución podría ser el emplear un tipo de semáforo más preciso, como un mutex.  Llamar a la función CreateMutex al inicio del programa es un recurso muy socorrido en casos como este.  Sin embargo, sin desatender el mecanismo de transferencia de parámetro que ilustra el artículo, adicionalmente tendrías que realizar un ciclo de espera para darle oportunidad a la primera instancia de crear la ventana a la cual se le envía el mensaje wm_CopyData.

Acorde a lo anterior, hice los siguientes cambios al código del ejemplo (no los he probado):



delphi
  1. function CanStart: Boolean;
  2. var
  3.   Wdw: HWND;
  4. begin
  5.   CreateMutex (Nil, True, 'Enecumene.ProgramaTal');
  6.  
  7.   // Si otra instancia ya creó el mutex
  8.   If GetLastError = Error_Already_Exists Then
  9.   Begin
  10.     Wdw := 0;
  11.  
  12.     // Esperamos hasta que esa primera instancia cree el formulario principal
  13.     While Wdw = 0 Do
  14.       Wdw := FindDuplicateMainWdw;
  15.  
  16.     // instance running: try to pass command line to it
  17.     // terminate this instance if this succeeds
  18.     // (routine explained later)
  19.     Result := not SwitchToPrevInst(Wdw);
  20.   End
  21.   Else
  22.     // no instance running: we can start our app
  23.     Result := True;
  24. end;
  25.  
  26. begin
  27.   If CanStart Then
  28.   Begin
  29.     Application.Initialize;
  30.     Application.CreateForm(TForm1, Form1);
  31.     Application.Run;
  32.   End;
  33.  
  34.   // El mutex es cerrado / destruido automáticamente al finalizar la aplicación
  35. end.



Espero te sirva.  Seguimos en contacto.

Al González. :)
  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 24 enero 2010 - 01:36

Muchas gracias amigo Al, en un rato lo pruebo y comento mis resultados, de nuevo gracias (y).

Saludos.
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 25 enero 2010 - 03:09

Hola de nuevo, amigo me ha funcionado de perlas lo que me has colocado, ¡Muchas Gracias!

Saludos.
  • 0

#6 Al González

Al González

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 99 mensajes

Escrito 25 enero 2010 - 03:14

Hola de nuevo, amigo me ha funcionado de perlas lo que me has colocado, ¡Muchas Gracias!

Me alegras la tarde con esto que leo. :)

Que padre se ve eso de "Los siguientes miembros le han agradecido". :p :o :$  :D
  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 25 enero 2010 - 03:16


Hola de nuevo, amigo me ha funcionado de perlas lo que me has colocado, ¡Muchas Gracias!

Me alegras la tarde con esto que leo. :)

Que padre se ve eso de "Los siguientes miembros le han agradecido". :p :o :$  :D


Por supuesto amigo, no está de más ser agradecidos :) y que sepan quien y porque se les agradece. ;)

Un gusto verte de vez en cuando.

Salud OS
  • 0




IP.Board spam blocked by CleanTalk.