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
public
end;
const
FileName : Array[0..3] of String = ('Nelson.txt', 'Nelson.xlsx', 'Nelson.pdf', 'Nelson.jpg');
var
Form1: TForm1;
implementation
{$R *.dfm}
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;
procedure TForm1.FormCreate(Sender: TObject);
var
i : Integer;
begin
for i := Low(FileName) to High(FileName) do
ListBox1.Items.Add(FileName[i]);
end;
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.