Uruchomienie aplikacji wewnątrz innej aplikacji

0

Witam
Czy istnieje mozliwosc w wlasnej aplikacji napisanej w delphi odpalic inna aplikacje i w jaki sposob to zrobic? efekt wizualny jaki chce uzyskac jest w zalaczniku!

program-w-programie02.png

0

To okienko wewnętrzne (z tytułem Arabic...) - na tym zrzucie który dałeś - to może być przesunięte (np. w prawo) - i wtedy wystaje poza okno (z tytułem Form1), które jest w tle?
Czy może chcesz tak, żeby to okno wewnętrzne było zawsze wewnątrz tego okna zewnętrznego?

0

To zwykłe MDI… :D

0

StefanN, oczywiscie iz zawszse wewnatrz okna Delphi, moznasie chyba domyslec ze w paincie zrobilem efekt na poczekaniu dla wyjasnienia efektu jaki chce uzyskac ;]

Innymi slowy zamiast na pulpicie windows'a, Forma w Delphi bedzie pulpitem tego programu. Podejrzewam iz trzeba beddzie kombinowac cos z uchwytami, lecz nie mam zielonego pojecia jak to wykonac.

0
Stefan_3N napisał(a):

Ten obrazek jest chyba zmontowany. Autor pyta o możliwość odpalenia innej aplikacji wewnątrz (czyli jakby przechwycenie obcej aplikacji i ciągniecie jej do swojego okna).

Dokladnie ta furious programming! dokladnie o to mi chodzi, cos jak MDI.

Byc moze gdybym usiadl na tym, sam to wykombinowalbym ale nie mam na to mocy przeborowych. Skoro tak namietnie wyjasnilismy sobie o co mi chodzi, b prosze o posty z gotowa informacja jak to wykonac lub wasze sugestie w jakim isc kierunku!

1

Odpal ten zew. program, pobierz uchwyt do jego okna i zmień mu parenta – zobacz co się stanie.

3
  1. Uruchamiasz apkę jakkolwiek funkcją, która zwróci uchwyt procesu
  2. Szukasz jego okna głównego okna za pomocą EnumWindows i sprawdzenia procesu GetWindowThreadProcessId dodatkowo czy to okno główne warunek GetWindow(handle, GW_OWNER) = 0
  3. Za pomocą Winapi.Windows.SetParent zmieniasz rodzina na okno w którym ma apka być dokowana oczywiście może to być kontrolka no. Panel.
  4. Teraz już tylko MoveWindow aby dostosować rozmiary i położenie okna uruchamianej aplikacji
  5. I dajmy ją na wierzch a więc SetForegroundWindow.
2

tu masz przykład Putty na formie

0
bronex napisał(a):

efekt wizualny jaki chce uzyskac jest w zalaczniku!

Ten program, to jest przecież przeglądarka...
Skoro tak, to osadź sobie TWebBrowser lub inne Chromium i do dzieła.
Jeśli to normalna apka Windows, to @kAzek napisał co i jak.

3

Z ciekawości sprawdziłem w Lazarusie czy to zadziała – wygląda na to, że tak. Okna osadzonych programów znajdują się wewnątrz okna naszej aplikacji, maksymalizacja ładnie dopasowuje je do rodzica, a minimalizacja tworzy miniaturki u dołu:

preview.png

Luźny kod testowy niżej (bez zabezpieczeń), a źródła i filmik poglądowy w załącznikach.

type
  PEnumData = ^TEnumData;
  TEnumData = record
    ProcessID: THandle;
    WindowHandle: THandle;
  end;


function EnumProc(AHandle: THandle; AEnumData: LongInt): LongBool; stdcall;
var
  EnumData: PEnumData absolute AEnumData;
  ProcessID: THandle;
begin
  Result := True;

  if GetWindow(AHandle, GW_OWNER) = 0 then
  begin
    GetWindowThreadProcessId(AHandle, @ProcessID);

    if ProcessID = EnumData^.ProcessID then
    begin
      EnumData^.WindowHandle := AHandle;
      Result := False;
    end;
  end;
end;


procedure TMainForm.EmbedApplication(const AAppName: String);
var
  Process: TProcess;
  EnumData: TEnumData;
begin
  Process := TProcess.Create(Self);
  Process.Executable := AAppName;
  Process.ShowWindow := swoHide;
  Process.Execute();

  Sleep(1000);

  EnumData.ProcessID := Process.ProcessID;
  EnumData.WindowHandle := 0;

  Windows.EnumWindows(@EnumProc, LongInt(@EnumData));

  Windows.SetParent(EnumData.WindowHandle, CWorkspacePanel.Handle);
  Windows.ShowWindow(EnumData.WindowHandle, SW_SHOW);
  Windows.SetForegroundWindow(EnumData.WindowHandle);

  Process.Free();
end;


procedure TMainForm.CNewPaintButtonClick(Sender: TObject);
begin
  EmbedApplication('mspaint');
end;


procedure TMainForm.CNewNotepadButtonClick(Sender: TObject);
begin
  EmbedApplication('notepad');
end;

Aby zrobić to dobrze, należy przede wszystkim zastąpić wywołanie Sleep czymś sensowniejszym. No i pasuje też uchwyty osadzonych programów (PID i uchwyt okna) gdzieś przechowywać, żeby nie narobić syfu w systemie i ładnie po sobie posprzątać. Albo te procesy ubijać, albo je odpinać od naszego programu, np. ustawiając im pulpit jako rodzica, albo wysyłać komunikaty do okien, aby same się zamknęły (np. postraszyć je komunikatem WM_QUERYENDSESSION ;) ).

Mimo wszystko z takim rozwiązaniem jest masa problemów. Pomijając już konieczność sprzątania po sobie, to problem stanowią okna dialogowe, otwierane przez osadzone aplikacje – te nie blokują okna-rodzica. Trzeba też zadbać o dopasowywanie okien osadzonych do okna-rodzica, kiedy to główne się rozciąga, a któreś osadzone jest zmaksymalizowane. Ogólnie to trzeba się narobić, aby takie rozwiązanie miało ręce i nogi i nie robiło bajzlu w systemie.

0

A takie zasadnicze pytanie do @bronex - po co Ci to jest? Jakieś realne wykorzystanie, czy raczej się bawisz/eksperymentujesz? Zdradź proszę sekret :)

1

Ja w tym rozwiązaniu widzę potencjał. Sam czasem mam otwartych kilkanaście programów, w tym kilka instancji systemowego eksploratora plików, kilka paintów, edytorów tekstowych, kalkulatorów itd. i ciągle przełączam się między tymi wszystkimi oknami. Momentami jest to dość denerwujące i zabiera niepotrzebnie czas, a systemowy pasek zadań nie pozwala na jakąkolwiek customizację, więc w niczym nie pomoże… :/

Korzystając z tego rozwiązania, mógłbym sobie stworzyć aplikację, która pozwoli dodawać zakładki w TPageControl i przypisać do nich to co potrzebuję, od razu grupując i rozmieszczając okna tych programów w taki sposób, aby wygodnie było się między nimi przełączać. A jakbym potrzebował zobaczyć pulpit to wystarczy tę główną zminimalizować, a później ją przywrócić – szybko i wygodnie.

Zastosowań jest masa, ale i pracy byłoby dużo, aby taki program był bezpieczny i funkcjonalny.

0

"A jakbym potrzebował zobaczyć pulpit" to wciśniesz przycisk "pokaż pulpit". W Windows XP była specjalna ikonka na pasku szybkiego uruchamiania, a od Vista/7 wzwyż jest dedykowany przycisk w okolicy zegara/w roku ekranu. O ile argument z porządkowaniem sobie okienek w takiej aplikacji jest sensowny, to pokazywanie pulpitu jest z czapy :P

Poza tym byłem ciekawy do czego konkretnie OP chce to rozwiązanie wykorzysta - czy właśnie porządkowania wielu okienek, czy jakiegoś osadzania innych narzędzi/aplikacji wewnątrz swojego programu.

0
cerrato napisał(a):

O ile argument z porządkowaniem sobie okienek w takiej aplikacji jest sensowny, to pokazywanie pulpitu jest z czapy :P

Pisałem o pokazaniu pulpitu, nie o ukrywaniu wszystkich okien. Mój pulpit rozciągnięty jest na dwa ekrany – obszar pulpitu na monitorze jest pusty (z reguły przykryty przez przeglądarkę), a na laptopie zawiera kilkadziesiąt skrótów do różnych aplikacji i miejsc w systemie. Czasem potrzebuję dostać się do ikonek na pulpicie znajdujących się na ekranie laptopa, bez minimalizowania/ukrywania okien widocznych na monitorze – do tego by mi się przydała możliwość szybkiego zminimalizowania mojego hipotetycznego organizera.

A tak nawiasem pisząc, w każdym systemie z rodziny Windows istnieje skrót Win+D do pokazania pulpitu (ponowne wciśnięcie do przywrócenia wszystkich okien) oraz Win+M do minimalizowania okien wszystkich otwartych programów. I ta funkcja wspierana jest w WinXP, a nawet w starszych systemach.

3

Stosuję to rozwiązanie w kilku miejscach w różnych wariantach w swoim pakiecie.
Chciałem wczoraj opisać jak to robię, ale Furious był pierwszy :-), więc już nie powielałem informacji.
U mnie tę technika zacząłem wykorzystywać w zastosowaniu do programu WinHlp32.exe.
W starszych systemach to był program odpowiedzialny za wyświetlanie plików pomocy.
Pomoc w programie zorganizowałem tak, jak Eksplorator Windows:

screenshot-20190225200657.png

W lewej części jest drzewo, a w prawej - odpowiednie formy pomocy, w zależności od tego, co jest wybrane w drzewie. I jedną z gałęzi były właśnie standardowe pliki pomocy. Ale one otwierały się w nowym oknie (jako samodzielny plik pomocy). I to mi nie pasowało i dlatego właśnie szukałem takiego rozwiązania, o którym dyskutujemy. I to działa. Poszedłem za ciosem i teraz w prawej części tego okna osadzam również np. odtwarzacz video, a przez jakiś czas osadzałem też Acrobat Readera.

Wariant z pulpitem też wykorzystuję :-). Ale tu zrobiłem tak, że okno odpalanego programu nie "wtapia" się jak okno MDI. Pulpit służy bardziej jako "przechowalnia" różnych plików i skrótów związanych z programem.

screenshot-20190225195121.png

1

Kazek - bardzo Dziekuje za pomoc! Jestes naprawde swietnym i genialnym programista, zreszta juz nie pierwszy raz mi bardzo pomogles :) Dokladnie o to mi chodzilo! Pozostalym osobom rowniez za chec pomocy i udzial w dyskusji. Troche wkurzaja mnie uwagi "po co Ci to , postaw sobie chromium, TWebBrowser...."... Niewazne.

Ktos tu ladnie zapytal "po co mi to - zdradz sekret:". Faktycznie ma to zwiazek z przegladarka k-meleon ktora wkleilem w screenie. Napisalem skrypt dla niej skrypt/parser do pozyskiwania nr telefonow z olx. Niby moge uzyc TWebBrowser lub Chromium, aczkolwiek uwazam ze wbudowany tam jezyk MacroLanguage jest o wiele szybszy i wygodniejszy la mnie(zreszta mam takze skonstruowany oddzielny edytor. Chcialem aby to wszsytko wygladalo wizualnie jak "oddzielna aplikacja" a nie jak jakis skrypt gdy sprzedaje swoim klientom :) (kazdy z czegos musi zyc) :) defakto byc moze wykorzystam do notatnika, mspainta lub innych programow bo to fajna sprawa. dziwie sie iz przez cale istniene forum nikt nie zalozyl podobnego tematu(no chyba ze cos przeoczylem, aczkolwiek uzywalem wysuzkiwarki)..

Jeszcze raz dzieki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1