Delphi > Firemonkey

Firemonkey - umístění aplikace do popředí

(1/1)

age.new:
Vážená komunito,

narazil jsem na problém, který u VCL není, pouze u Firemonkey. Pomocí Mutex si hlídám, zda již aplikace běží (povoluji jen jednu instanci). Pokud ano, získám její handle a snažím se ji umístit do popředí. Z nějakého důvodu posunutí do popředí nefunguje. Zkoušel jsem více způsobů nalezených na netu (např. ShowWindow atd.), ale prostě nic nefunguje. Handl aplikace existuje. Napadá někoho proč?


--- Kód: Delphi ---var  Mutex: THandle;  H: HWND;begin  Mutex := CreateMutex(nil, true, PChar('MyApp'));  try    if (Mutex <> 0) and (GetLastError = 0) then    begin      Application.Initialize;      Application.CreateForm(TFormMain, FormMain);      Application.Run;    end    else    begin      H := FindWindow(nil, PChar('MyApp'));      if H <> 0 then      begin        BringWindowToTop(H);        SetForegroundWindow(H);      end      else TDialogService.MessageDialog('Application is already running!', TMsgDlgType.mtError, [TMsgDlgBtn.mbOK], TMsgDlgBtn.mbOK, 0, nil);    end;  finally    if Mutex <> 0 then CloseHandle(Mutex);  end; 

Děkuji.

KarelHorky:
Abych se seznámil s Firemonkey, tak jsem si někdy okolo roku 2014 v Delphi XE5 vytvořil aplikaci pro odpočet času. Po vypršení času se aplikace měla aktivovat a ukázat nastavené hlášení. Měl jsem stejný problém, aktivovat aplikaci do popředí. Podařilo se mi tehdy najít řešení, v podstatě šlo o to, zjistit handle aplikace, ne hlavního okna:


--- Kód: Delphi ---var  hAppHandle: hwnd; function EnumWindowCallback(hWnd: hWnd; lParam: lParam): BOOL; stdcall;  implementation {$R *.fmx} function EnumWindowCallback(hWnd: hWnd; lParam: lParam): BOOL; stdcall;const  FMXClassName = 'TFMAppClass';var  ProcessID: DWORD;  ClassName: string;  ClassNameLength: NativeInt;begin  // XE4 (possibly others) has a phantom TFMAppClass window  if (GetWindowThreadProcessId(hWnd, ProcessID) = GetCurrentThreadId) and    (ProcessID = GetCurrentProcessId) then  begin    // Thanks to the ubiquitous David Heffernan... http://stackoverflow.com/questions/7096542/collect-all-active-window-class-names    SetLength(ClassName, 256);    ClassNameLength := GetClassName(hWnd, PChar(ClassName), Length(ClassName));    if ClassNameLength = 0 then      RaiseLastOSError;    SetLength(ClassName, ClassNameLength);    if ClassName = FMXClassName then    begin      // Found. store and return false to stop enumerating      hAppHandle := hWnd;      Exit(False);    end;  end;  Result := True; // Fallthrough, keep iteratingend;  procedure TwndCasovac5.Blikni;begin  if IsIconic(hAppHandle) then begin    ShowWindow(hAppHandle, SW_SHOWNOACTIVATE);  end;  SetWindowPos(hAppHandle, HWND_TOPMOST, 0, 0, 0, 0,               SWP_NOMOVE or SWP_NOACTIVATE or SWP_NOSIZE);  SetWindowPos(hAppHandle, HWND_NOTOPMOST, 0, 0, 0, 0,               SWP_NOMOVE or SWP_NOACTIVATE or SWP_NOSIZE);end; procedure TwndCasovac5.FormCreate(Sender: TObject);begin    // find app handle  EnumWindows(@EnumWindowCallback, 0);end; Ve FormCreate se zjistí handle aplikace. Pak se nějak spustí časovač a až vyprší čas, zavolá se procedura Blikni a ta dostane okno do popředí.
Aplikace je funkční dodnes, ale nevím, jestli v aktuálních Delphi půjde zkompilovat a bude fungovat. Víc ti k tomu neřeknu, protože ve Firemonkey jsem už nic dalšího nedělal.
K.

age.new:
Áha ... to vyzkouším. Děkuji.

Navigace

[0] Seznam témat

Přejít na plnou verzi