Autor Téma: Titulek aplikace ve Windows taskbaru  (Přečteno 1859 krát)

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 184
  • Karma: 8
    • Verze Delphi: 7, XE6
Titulek aplikace ve Windows taskbaru
« kdy: 25-10-2013, 15:53:54 »
Víte někdo, jak se dá ve Firemonkey aplikaci pro Windows změnit titulek na tlačítku ve Windows taskbaru ?
Hledal jsem to všude možně, ale nedokážu jej změnit, je tam trvale jméno projektu. Potřebuju to měnit jako ve VCL aplikaci, kde se to mění přes Application.Title, i programem za běhu aplikace.
Delphi XE5, Windows 8

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2285
  • Karma: 101
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Titulek aplikace ve Windows taskbaru
« Odpověď #1 kdy: 26-10-2013, 00:03:12 »
Hmm, myslel jsem si ze to jde pres FMX.Platform.Win, ale handle je ukryt v private sekci TPlatformWin, ktera je navic nedostupna / resp. jedna se o TPlatformServices.Current, ale nejde jednoduse pretypovat k  vuli pristupnosti, takze pres hack:

Kód: Delphi [Vybrat]
  1. implementation
  2. uses
  3.   Winapi.Windows, FMX.Platform.Win;
  4. var
  5.   hAppHandle: hwnd;
  6.  
  7. {$R *.fmx}
  8.  
  9. function EnumWindowCallback(hWnd: hWnd; lParam: lParam): BOOL; stdcall;
  10. const
  11.   FMXClassName = 'TFMAppClass';
  12. var
  13.   ProcessID: DWORD;
  14.   ClassName: string;
  15.   ClassNameLength: NativeInt;
  16. begin
  17.   // XE4 (possibly others) has a phantom TFMAppClass window
  18.   if (GetWindowThreadProcessId(hWnd, ProcessID) = GetCurrentThreadId) and
  19.     (ProcessID = GetCurrentProcessId) then
  20.   begin
  21.     // Thanks to the ubiquitous David Heffernan... http://stackoverflow.com/questions/7096542/collect-all-active-window-class-names
  22.     SetLength(ClassName, 256);
  23.     ClassNameLength := GetClassName(hWnd, PChar(ClassName), Length(ClassName));
  24.     if ClassNameLength = 0 then
  25.       RaiseLastOSError;
  26.     SetLength(ClassName, ClassNameLength);
  27.     if ClassName = FMXClassName then
  28.     begin
  29.       // Found. store and return false to stop enumerating
  30.       hAppHandle := hWnd;
  31.       Exit(False);
  32.     end;
  33.   end;
  34.   Result := True; // Fallthrough, keep iterating
  35. end;
  36.  
  37. procedure TForm12.Button1Click(Sender: TObject);
  38. var
  39.   h: hwnd;
  40. begin
  41.   // find app handle
  42.   EnumWindows(@EnumWindowCallback, 0);
  43.  
  44.   //hAppHandle je handle Application
  45.   SetWindowText(hAppHandle, 'Delphi.cz');
  46. end;
  47.  
  48.  
« Poslední změna: 26-10-2013, 00:04:43 od Radek Červinka »
Embarcadero MVP - Czech republic

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 184
  • Karma: 8
    • Verze Delphi: 7, XE6
Re:Titulek aplikace ve Windows taskbaru
« Odpověď #2 kdy: 29-10-2013, 09:53:22 »
Díky moc, pomocí handlu aplikace to funguje přesně podle očekávání, jako Application.Title, titulek na taskbaru lze měnit i za běhu programu. Navíc se mi také podařilo odstranit jakési vizuální problémy s opakovanou minimalizací a zobrazováním programu.
Ale proč to tak důkladně skryli ??? Kdyby se to používalo jen pro mobily, tak je to OK, ale když cílová platforma je i Windows 32/64 ...