Ver Mensaje Individual
  #8  
Antiguo 02-04-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Reputación: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
jplj

Cita:
Empezado por jplj
¿El standard de título de una ventana es NombreFichero + ' - ' + NombreAplicación?
Si es correcto

Cita:
Empezado por jplj
¿Sería posible conocer en tiempo de ejecución cuál es la aplicación predeterminada para abrir un tipo determinado de archivo?
Si es posible, sin embargo lo que se requiere en tu caso es el nombre de la ventana en el formato NombreFichero + ' - ' + NombreAplicación, por lo cual el nombre de la aplicación por default (Ejecutable en Disco), no corresponderá necesariamente con el nombre de la aplicación en la ventana de la misma en el formato anteriormente mencionado.

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellAPI, ComCtrls, ExtCtrls, Registry;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
   FileName : Array[0..3] of String = ('Nelson.txt', 'Nelson.xlsx', 'Nelson.pdf', 'Nelson.jpg');

var
   Form1: TForm1;

implementation

{$R *.dfm}

// Obtiene la lista de Ventanas Activas
function EnumWndProc(Handle: HWND; LP: TStrings): BOOL; stdcall;
var
   WindowName: array[0..128] of Char;
   AuxStr: string;

begin

   Result := True;

   SendMessage(Handle, WM_GETTEXT, Sizeof(WindowName), integer(@WindowName));

   SetString(AuxStr ,PChar(@WindowName[0]), Length(WindowName));

   AuxStr := LowerCase(AuxStr);

   if (AnsiPos('.txt', AuxStr) > 0)
   or (AnsiPos('.xlsx', AuxStr) > 0)
   or (AnsiPos('.pdf', AuxStr) > 0)
   or (AnsiPos('.jpg', AuxStr) > 0)
   then
      LP.Add(WindowName);

end;

// Inicializa un TListBox con archivos de Windows
procedure TForm1.FormCreate(Sender: TObject);
var
   i : Integer;
begin
   for i  := Low(FileName) to High(FileName) do
      ListBox1.Items.Add(FileName[i]);
end;

// Abre una sola ventana de un archivo con su aplicación por default en Windows
procedure TForm1.Button1Click(Sender: TObject);
var
   WindowHandle : THandle;
   WindowName : String;
   ListPrg : TStringList;
   i : Integer;

begin

   ListPrg := TStringList.Create;

   EnumWindows(@EnumWndProc, LPARAM(ListPrg));

   WindowName := EmptyStr;

   for i := 0 to ListPrg.Count - 1 do
      if AnsiPos(FileName[ListBox1.ItemIndex],ListPrg.Strings[i]) > 0 then
      begin
         WindowName := ListPrg[i];
         Break;
      end;

   if WindowName = EmptyStr then
      ShellExecute(0, nil, PChar(FileName[ListBox1.ItemIndex]),'', '',SW_SHOWNORMAL)
   else
   begin
      WindowHandle := FindWindow(nil,PChar(WindowName));

      if SetForegroundWindow(WindowHandle) then
         ShowWindow(WindowHandle, SW_SHOWNORMAL);
   end;

   ListPrg.Free

end;

end.
El código anterior (Versión 2 del código del Msg #5) en Delphi 7 bajo Windows 7 Professional x32, permite abrir de forma automática los archivos contenidos en el TListBox con su aplicación por default en Windows por medio de ShellExecute y en caso de ser seleccionados nuevamente, colocar la ventana de la aplicación en el tope del Z-Order si esta activa por medio de las APIs EnumWindows, FindWindow y SetForegroundWindow o abrirla nuevamente si esta fue previamente cerrada, en resumen: Se abre una sola ventana por archivo seleccionado.

Nota: El nombre de la ventana (Segundo parámetro de la funcion FinWindow), debe estar en el formato "DocumentName - ApplicationName" el cual es obtenido de forma automática por medio de la función EnumWindows.

Revisa esta información:
Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 02-04-2014 a las 15:49:27.
Responder Con Cita