Minimalizowanie do tray innej aplikacji

Minimalizowanie do tray innej aplikacji
0

Witam,
czy jest możliwość zminimalizowania do traya programem delphi innej, zewnętrznej aplikacji która nie ma możliwości minimalizowania do traya?
Jeżeli tak to proszę o wskazówki :)

m_Lesiu
  • Rejestracja:około 12 lat
  • Ostatnio:około 4 lata
  • Postów:138
0
Kopiuj
SendMessage(wnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);

0

OK, rozumiem,
ale jak minimalizowac i umieszczac ikone w tray?

a ta zmienna NotifRec
to co to jest?

KA
Poprawiłem trzeba do uses doadać shellapi a to TNotifyIconData taka struktura (w Delphi rekord) zawierająca różne informacje odsyłam do MSDN http://msdn.microsoft.com/en-us/library/windows/desktop/bb762159%28v=vs.85%29.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/bb773352%28v=vs.85%29.aspx
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Gorlice
1

2 parametr funkcji Shell_NotifyIcon to wskaźnik na rekord który zawiera między innymi uchwyt okna które chcesz zminimalizować (uwaga leniwy przykład zero obsługi komunikatów i usuwania ikony z traya)

Kopiuj
uses
  shellapi;

procedure TForm1.Button1Click(Sender: TObject);
const
  WINDOW_TITLE = 'Kalkulator';
var
  hWnd: THandle;
  TrayRec: TNotifyIconData;
begin
  hWnd:= FindWindow(nil, WINDOW_TITLE);
  ZeroMemory(@TrayRec, SizeOf(TrayRec));
  TrayRec.cbSize:= SizeOf(TrayRec);
  TrayRec.Wnd:= hWnd;
  TrayRec.uFlags:= NIF_ICON;
  TrayRec.hIcon:= Application.Icon.Handle;
  if Shell_NotifyIcon(NIM_ADD, @TrayRec) then
    SendMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
end;

Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: kAzek
0

dzięki, to wystarczy :)

olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
2

Pozwoiliłem sobie zatwierdzić odpowiedź @kAzek'a jako rozwiązanie. Jednak nie jest ono według mnie kompletne. Ponieważ między innymi będzie problem z ikonką i z obsługą menu. Nie da się niestety łatwo wedlug mojej wiedzy dostać do popup menu będącego pod TrayIconami obcych programów, do których kodu źródlowego nie mamy dostępu. Można wykombinować tak jak pokazuje w kodzie poniżej. Rozwiązanie tylko dla nazw plików Ansi. Widoczna będzie ikonka obcej aplikacji. Dwuklikiem na ikonkę przywrócimy aplikację. Przy zamykaniu aplikacji wywołującej aplikacja zostanie przywrócona.

Ponieważ sposób, ktory zaprezentował swoim kodem @kAzek może być wraz z dodaniem obslugi ikonki przeze mnie. Z tym, że niestety nadal pozostaje kwestia obsługi ikonki. Wiadomo, że nie "podczepimy" się pod obcy proces bez injekcji / wrappera dll. A ustawiając pole rekordu danych ikonki Wnd na Handle tego znalezionego okna, nie obsłużymy komunikatów. Natomiast ustawiając na Handle naszego okna ikonka zniknie nam po zamknięciu apki. Ot taki minus. Toteż ja w swoim pluginie dla WinAMP'a, który trochę inaczej realizuje minimalizowanie do TrayIkonki, symulowałem trzymanie Shift'a z małym Sleep'em. Ponieważ nie wyodrębniłem w żaden sposób parametrów dla komunikatu WM_COMMAND lub podobnego - do wysłania oknu głownemu aby to schowało się do TrayIkonki. Nie uzyskałem też podpowiedzi na ich forum supportu, wiec tak zostało.

Na szczęście pluginem można założyć hook na WH_CBT i uzyskać możliwość reakcji zanim zostanie dokonana minimalizacja. Jeżeli docelowy program, z którym tak chce kombinować przez minimalizacje do TrayIkonki posiada taką możłiwość i można go z jakimś combo zmimimalizować do traya z poprawnym menu i reagowaniem, to ja bym tak kombinował. Ewentualnie zawsze jeżeli bardzo chcesz udoskonalić jakiś program, żeby mógł się chować do ikonki w trayu, a nie do paska. To trzeba mozolnie napisać wrapper na którąś z systemowych dllek dla tego programu. W niej skorzystać z rzeczonego Hooka na okno programu i dorobić własną trayiconkę z reakcją na klawisze oraz menu.

Zaraz @babubabu mi zarzuci, że ciągle ostatnio musi czytać o technice wrappowania dllek, ale to na prawdę potężna możliowść. Może machne o tym artykuł jak znajdę trochę czasu i będzie zainteresowanie. A korzystająć z faktu, żę większość dllek systemowych i w ogółe przez LoadLibrary czy statycznie najpierw jest wyszukiwana z katalogu programu, to można taką dllkę z własnym kodem tam wrzucić, a do oryginalnych funkcji jakie należy exportować można się odwołać do systemowej dllki. Takie kombinacje przydają się nie tylko w starszych grach żeby dobrze się wyświetlały pod Windowsami od Visty wzwyż. Można również zrobić proste poprawki i próbowac udoskonalić zachowanie programu, jeżeli nie wszystkie jego zachowania nam odpowiadają. Tyle. Sorry za rozpisanie się ;)

Kopiuj
//...
uses
  ShellApi, PSApi;

const
  Window_Title = 'Kalkulator';
  WM_TOOLTRAYICON = WM_USER + 1;

var
  DestH : THandle;
  OldWindowProc : Pointer;
  IconData : TNotifyIconData;

function GetIconFromHandle(WindowHandle : HWND) : HICON;

  function ProcessFullPath(Pid : DWORD) : string;
  var
    AHandle : THandle;
  begin
    Result := '';
    AHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, Pid);
    if AHandle <> 0 then
    begin
      try
        SetLength(Result, MAX_PATH);
        if GetModuleFileNameEx(AHandle, 0, PChar(Result), MAX_PATH) > 0 then
        begin
          SetLength(Result, StrLen(PChar(Result)));
        end
        else
        begin
          Result := '';
        end;
      finally
        CloseHandle(AHandle);
      end;
    end;
  end;

  function ProcessFullPath64Bit(Pid : DWORD) : string;
  const
    PROCESS_QUERY_LIMITED_INFORMATION = $1000;
  var
    Len : DWord;
    AHandle, DllHandle : THandle;
    QueryFullProcessImageNameA : function(HProcess : THandle; dwFlags : DWord; lpExeName : PAnsiChar; lpdwSize : PDWord) : Bool; stdcall;
  begin
    Result := '';
    DllHandle := LoadLibrary('kernel32.dll');
    if DllHandle > 0 then
    begin
      QueryFullProcessImageNameA := GetProcAddress(DllHandle, 'QueryFullProcessImageNameA');
      if Assigned(QueryFullProcessImageNameA) then
      begin
        AHandle := OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, False, Pid);
        if AHandle <> 0 then
        begin
          Len := MAX_PATH;
          SetLength(Result, Len - 1);
          QueryFullProcessImageNameA(AHandle, 0, PAnsiChar(Result), @len);
          SetLength(Result, Len);
          CloseHandle(AHandle);
        end;
      end;
      FreeLibrary(DllHandle);
    end;
  end;

var
  Pid : DWORD;
  ProcesPath : string;
  FileInfo : SHFILEINFO;
begin
  Result := 0;
  if ISWindow(WindowHandle) then
  begin
    GetWindowThreadProcessId(WindowHandle, Pid);
    ProcesPath := ProcessFullPath(Pid);
    if ProcesPath = '' then
    begin
      ProcesPath := ProcessFullPath64Bit(Pid)
    end;
    SHGetFileInfo(PChar(ProcesPath), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON or SHGFI_LARGEICON);
    Result := FileInfo.hIcon;
  end;
end;

procedure RestoreApp;
begin
  if (IsWindow(DestH)) and (ISIconic(DestH)) then
  begin
    ShowWindow(DestH, SW_SHOW);
    ShowWindow(DestH, SW_RESTORE);
    Shell_NotifyIcon(NIM_DELETE, @IconData);
  end;
end;

function NewWindowProc(WindowHandle : hWnd; TheMessage : Longint; ParamW : Longint; ParamL : Longint) : Longint stdcall;
begin
  case TheMessage of
    WM_TOOLTRAYICON :
      begin
        case ParamL of
          WM_LBUTTONDBLCLK :
            begin
              RestoreApp;
            end;
        end;
        Result := 0;
        Exit;
      end;
    WM_DESTROY :
      begin
        RestoreApp;
      end;
  end;
  Result := CallWindowProc(OldWindowProc, WindowHandle, TheMessage, ParamW, ParamL);
end;

procedure TForm1.Button1Click(Sender : TObject);
begin
  DestH := FindWindow(nil, Window_Title);
  if DestH > 0 then
  begin
    if OldWindowProc = nil then
    begin
      OldWindowProc := Pointer(SetWindowLong(Self.Handle, GWL_WNDPROC, Longint(@NewWindowProc)));
    end;
    ZeroMemory(@IconData, SizeOf(IconData));
    with IconData do
    begin
      cbSize := SizeOf(IconData);
      Wnd := Self.Handle;
      uFlags := NIF_MESSAGE + NIF_ICON;
      hIcon := GetIconFromHandle(DestH);
      uCallbackMessage := WM_TOOLTRAYICON;
    end;
    if Shell_NotifyIcon(NIM_ADD, @IconData) then
    begin
      SendMessage(DestH, WM_SYSCOMMAND, SC_MINIMIZE, 0);
      ShowWindow(DestH, SW_HIDE);
    end;
  end;
end;

Pozdrawiam.
edytowany 2x, ostatnio: olesio
babubabu
O.o Czemu mam Ci wypominać, że napisałeś coś co wnosi więcej do tematu??
flowCRANE
@olesio - akcja ENTER się już skończyła..? ;)
olesio
@babubabu: informacja o pisaniu z tabletu też wnosiła coś do tematu, ponieważ informowała że aktualnie nie mam dostępu do swoich źródeł i wygodniejszej metody pisania. Ale kto Cie tam wie :/ @furious programming: normalnie drugi ten co to mnie zgnoi jak sie odpisze w komentarzu, a pierwszy zaćzął mnie stresować z tymi enterami. Nicka nie wymienie, chociaż On ma jakieś tajemnicze powiadomienia i nawet jak o nim tylko pomyślisz to już wie ;)
flowCRANE
Nawet znam tego pierwszego i niebawem się tutaj pojawi ;) No cóż, broń Boże nie "gnoję Cię" bo nie mam takiego zamiaru... O.o Fakt faktem jeden blok tekstu niezbyt dobrze się czyta, stąd mój komentarz...
olesio
Spoko, za to teraz mam nadzieję będzie czytelniej.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)