Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ver mi aplicación dentro de otra (https://www.clubdelphi.com/foros/showthread.php?t=91734)

deliriun 09-04-2017 07:19:47

Ver mi aplicación dentro de otra
 
Buen día a todos

Tengo la duda de que si es posible visualizar
Mi programa dentro de una aplicación externa

Estaba pensando en poner mi form adelante de
Todos los demás programas, justo en el momento
En que la otra aplicación esté activa en pantalla

Claro que esto daría el efecto siempre y cuando la otra aplicación se muestre maximizada, pero si no es así no daría el efecto esperado.

Por eso quería saber si hay algún método más acertado para esto.

Espero se haya entendido mi pregunta, de antemano​ muchas gracias.

escafandra 09-04-2017 13:50:06

Quizás debas explicar mejor lo que pretendes. Para colocar tu ventana delante de todas cuando determinada App está activa, no hace falta nada más que detectar que dicha app se está ejecutando. Sobre como detectar si una app se ejecuta hay ejemplos en el foro. Aquí una forma de saberlo:
Código Delphi [-]
function IsRuning(FileName: PAnsiChar): boolean;
var
  PE: TPROCESSENTRY32;
  ProcessHandle: THandle;
begin
  Result:= false;
  PE.dwSize:= sizeof(TPROCESSENTRY32);
  ProcessHandle:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if Process32First(ProcessHandle, PE) then
    repeat
      if lstrcmpi(PE.szExeFile, FileName) = 0 then
      begin
        Result:= true;
        break;
      end;
    until not Process32Next(ProcessHandle, PE);
  CloseHandle(ProcessHandle);
end;
Seguidamente con la API SetWindowPos aplicada a tu ventana, en el parámetro hWndInsertAfter pones HWND_TOPMOST


Saludos.

deliriun 10-04-2017 03:07:57

Gracias por tu respuesta Escafandra

Me intentaba referir a que el Form de mi aplicación se vea delante del programa externo, y sí había pensado en lo que comentas
hacer que mi Form se ponga en Top justo cuando la otra aplicación se encuentra en primer plano, Claro sería una buena solución
pero me parece que esto solo se cumpliría si la aplicación externa se muestra en pantalla completa, no creo que de el efecto
cuando la Aplicación externa se muestre en solo una parte de la pantalla no?

Tal vez para esto sería útil buscar las coordenadas en la aplicación externa, Y luego hacer que el Form mío solo se pueda
mostrar en las coordenadas de la otra aplicación, algo así como aplicar un limite.

Pero, Mi duda es si no hay un método más eficiente para realizar esto, Espero que ahora si se haya entendido lo que trato de conseguir

Gracias por la ayuda

escafandra 10-04-2017 12:15:58

El siguiente código usa un Timer para encontrar la ventana activa, si se trata del notepad se colocará el formulario sobre él:

Código Delphi [-]
function GetExeNameByWnd(Wnd: HWND): String;
var
  snp: THANDLE;
  lppe: TPROCESSENTRY32;
  dwProcessId: DWORD;
begin
  Result:= '';
  GetWindowThreadProcessId(Wnd, dwProcessId);
  snp:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  try
  begin
    lppe.dwSize:= sizeof(lppe);
    if Process32First(snp, lppe) then
      repeat
        if lppe.th32ProcessID = dwProcessId then
        begin
           Result:= AnsiString(lppe.szExeFile);
           break;
        end;
      until not Process32Next(snp, lppe);
  end;
  finally
     CloseHandle(snp);
  end;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label1.Caption:= 'Me pongo sobre el notepad';
  if GetExeNameByWnd(GetForegroundWindow) = 'notepad.exe' then
  begin
    Application.Restore();
    SetWindowPos(Handle, HWND_TOPMOST,0,0,0,0, SWP_NOSIZE or SWP_NOMOVE);
  end;
end;


Saludos.


La franja horaria es GMT +2. Ahora son las 06:45:56.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi