Buenas, sencillamente era para dejar la brillante
UIApp de Roman, que permite evitar que mas de una instancia de la misma aplicacion sea ejecutada. Esta es una adaptacion para la plataforma FMX. Creo que es medio chanchullo, pero no encontre otra forma de hacerlo (ver parte resaltada)
Código Delphi
[-]
unit UIApp_fmx;
interface
implementation
uses
Windows, SysUtils, FMX.Forms, FMX.Platform.Win;
const
sMutex = '10D73234-C9F7-4C2D-BC7E-39B5820AF456';
sActivar = '3F154732-CCDE-4BC7-9439-AFCD3BCFA84D';
var
mActivar : Cardinal;
Mutex : Cardinal;
PrevWndProc : TFarProc;
function AppWndProc(Handle: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LongInt; stdcall;
var
FgThreadId : DWORD;
AppThreadId : DWORD;
begin
if Msg = mActivar then
begin
if IsIconic(Handle) then
ShowWindow(Handle, SW_RESTORE)
else
begin
FgThreadId := GetWindowThreadProcessId(GetForegroundWindow, nil);
AppThreadId := GetWindowThreadProcessId(Handle, nil);
AttachThreadInput(AppThreadId, FgThreadId, true);
SetForegroundWindow(Handle);
AttachThreadInput(AppThreadId, FgThreadId, false);
end;
Result := 0;
end
else
Result := CallWindowProc(PrevWndProc, Handle, Msg, wParam, lParam);
end;
procedure Activar;
begin
SendMessage(HWND_BROADCAST, mActivar, 0, 0);
end;
procedure Registrar;
var _HWND: cardinal;
begin
mActivar := RegisterWindowMessage(sActivar);
Mutex := CreateMutex(nil, true, sMutex);
if GetLastError = ERROR_ALREADY_EXISTS then
begin
Mutex := 0;
abort;
end
else
begin
Application.MainForm:= TCommonCustomForm.Create(NIL);
_HWND := WindowHandleToPlatform(Application.MainForm.Handle).Wnd;
Application.MainForm.Free;
PrevWndProc := TFarProc(GetWindowLong(_HWND, GWL_WNDPROC));
SetWindowLong(_HWND, GWL_WNDPROC, LongWord(@AppWndProc));
end;
end;
initialization
try
Registrar;
except
Activar;
Halt;
end;
finalization
if Mutex <> 0 then ReleaseMutex(Mutex);
end.
En la unit original Roman obtenia el HWND de la ventana actual accediendo mediante
Código Delphi
[-]
_HWND := Application.Handle;
Propiedad inexistente en FMX. El "chanchullo" aqui, no se me ocurrio otra cosa que crear el MainForm de la aplicacion, obtener el handle, y luego liberar el form. Feo pero funcional
En fin, si a alguien se le enciende la
mejor por el bien de todos
Un saludo!