Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Hacer una aplicación sin form (https://www.clubdelphi.com/foros/showthread.php?t=7573)

DarkByte 19-02-2004 20:18:26

Hacer una aplicación sin form
 
Parecerá una pregunta tonta, pero ¿cómo puedo hacer una aplicación sin ningún form?, es porque quiero hacer una aplicación que evite abrir ciertas aplicaciones y no quiero comerme el coco con APIs para que no salga el form en ningún lado....

Otra cosa... ¿cómo crearía los componentes?, digo... quiero poner un TTimer para que me escanee en busca de los Handles de las aplicaciones..., ¿cómo creo el componente?¿cómo me la tengo que montar para poner lo que quiera en OnTimer?

Utilizo Delphi 7

delphi.com.ar 19-02-2004 20:24:04

Ok... te vas a tener que "romper el coco" manejando una ventana que no sea un TForm... Lo que tienes que hacer es crear un proyecto nuevo, y quitar el formulario, escribir el código directamente en el DPR o parte en el DPR y parte en units.
Te recomiendo buscar info sobre las funciones AllocateHWnd y DeallocateHWnd, en estas funciones tienes el código de como crear una ventana en Windows.

Saludos!

DarkByte 19-02-2004 20:27:31

Gracias por tu ayuda, buscaré info sobre eso, si me tropiezo o no encuentro nada, doy un toque

marcoszorrilla 19-02-2004 21:09:57

Yo tengo un pequeño ejemplo por aquí lo voy a pegar para que te sirva de punto de partida.
Código:

function WindowProc(hWnd, uMsg, wParam, lParam: Integer): Integer; stdcall; // Definimos la variable encargada de procesar los mensajes.
begin
 Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
 If (uMsg = WM_DESTROY) then Halt; // Si damos al boton de la X, la aplicacion termina

 If (lParam = Buton2) And (uMsg = WM_COMMAND) then begin // Si el mensaje viene del boton y es la pulsacion de este . . .
  Halt; // Cerramos la Aplicacion.
 end;
 If (lParam = Buton1) And (uMsg = WM_COMMAND) then begin // Si el mensaje viene del boton y es la pulsacion de este . . .
  Longitud := GetWindowTextLength(Edit1); // Averiguamos cual es la longitud del texto de la primera edit
  GetMem(Sumando1,Longitud+1); // Cogemos memoria para el texto.
  GetWindowText(Edit1,Sumando1,Longitud+1); // COgemos el texto que hay en el edit y lo almacenamos en la variable Sumando1
  Longitud := GetWindowTextLength(Edit2); // Averiguamos cual es la longitud del texto de la segunda edit
  GetMem(Sumando2,Longitud+1); // Cogemos memoria para el texto.
  GetWindowText(Edit2,Sumando2,Longitud+1); // Cogemos el texto que hay en el edit y lo almacenamos en la variable Sumando2
  Valor := StrToInt(Sumando1) + StrToInt(Sumando2); // Realizamos la suma.
  SetWindowText(Edit3,Pchar(IntToStr(Valor))); // Ponemos el texto en el edit3
 end;
end;

begin
 Instancia := hInstance;
 { Damos a la variable instance, el handle que aplicara windows
  a nuestro programa }

 Fuente := CreateFont (-1, 0, 0, 0, 400, 0, 0, 0, DEFAULT_CHARSET,
                      OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
                      DEFAULT_QUALITY, DEFAULT_PITCH + FF_DONTCARE,
                      'MS Sans Serif');
    { Creamos la fuente que usaremos en nuestra aplicacion }

 with Clase do begin // Comenzamos a definir la clase de nuestro programa
  Style := CS_CLASSDC or CS_PARENTDC; // Definimos el estilo
  lpfnWndProc := @WindowProc; // La funcion que manejara los mensajes
  hInstance := Instancia; // La handle de nuestra aplicacion
  hbrBackGround := Color_btnFace+1; // El color de fondo
  lpszClassName := 'MrRidk'; // El nombre de la class
  hCursor := LoadCursor(0, IDC_ARROW); // El cursor que usara nuestra aplicacion
 end; // Fin

 RegisterClassA(Clase); // Registramos la clase en windows.

 Handle := CreateWindowEx(0,      'MrRidk','Ejemplo de Programa Con Api', WS_SYSMENU + WS_VISIBLE, 150,  150,  280,    140,  0,  0,  Instancia, Nil);
      {Creamos la ventana, Estilo, Clase,  Titulo,                        Estilo,                  Posicion,    Tamaño,      , El Padre de la ventana, El menu,  La hInstance, El lParam.}
{ ************************************************************************************************************ }

 Edit1 := CreateWindowEx(WS_EX_CLIENTEDGE,'Edit','3',WS_VISIBLE+WS_CHILD+BS_TEXT,90,10,175,20,Handle,0,Instancia,Nil);
      {Creamos la ventana, Estilo,        Tipo, Texto, Estilo,                  Posicion,Tamaño,Padre,Menu,hInstance,El lparam}
{ ************************************************************************************************************ }

 Edit2 := CreateWindowEx(WS_EX_CLIENTEDGE,'Edit','2',WS_VISIBLE+WS_CHILD+BS_TEXT,90,31,175,20,Handle,0,Instancia,Nil);
      {Creamos la ventana, Estilo,        Tipo, Texto, Estilo,                  Posicion,Tamaño,Padre,Menu,hInstance,El lparam}
{ ************************************************************************************************************ }

 Edit3 := CreateWindowEx(WS_EX_CLIENTEDGE,'Edit','5',WS_VISIBLE+WS_CHILD+BS_TEXT,90,52,175,20,Handle,0,Instancia,Nil);
      {Creamos la ventana, Estilo,        Tipo, Texto, Estilo,                  Posicion,Tamaño,Padre,Menu,hInstance,El lparam}
{ ************************************************************************************************************ }
 
 Label1 := CreateWindow('Static','Sumando 1:',WS_VISIBLE + WS_CHILD, 10, 16,75,20,Handle,0,Instancia,Nil);
      {Creamos la ventana, Tipo, Texto,    Estilo,              Posicion,Tamaño,Padre,Menu,hInstance,El lparam}
{ ************************************************************************************************************ }

 Label2 := CreateWindow('Static','Sumando 2:',WS_VISIBLE + WS_CHILD, 10, 37,75,20,Handle,0,Instancia,Nil);
      {Creamos la ventana, Tipo, Texto,    Estilo,              Posicion,Tamaño,Padre,Menu,hInstance,El lparam}
{ ************************************************************************************************************ }

 Label3 := CreateWindow('Static','Resultado:',WS_VISIBLE + WS_CHILD, 10, 57,75,20,Handle,0,Instancia,Nil);
      {Creamos la ventana, Tipo, Texto,    Estilo,              Posicion,Tamaño,Padre,Menu,hInstance,El lparam}
{ ************************************************************************************************************ }

 Buton1 := CreateWindow('Button','Sumar', WS_VISIBLE + WS_CHILD, 65, 85, 60, 20, Handle,0,Instancia,Nil);
      {Creamos la ventana, Tipo, Texto,    Estilo,              Posicion,Tamaño,Padre,Menu,hInstance,El lparam}
{ ************************************************************************************************************ }

 Buton2 := CreateWindow('Button','Salir', WS_VISIBLE + WS_CHILD, 150, 85, 60, 20, Handle,0,Instancia,Nil);
    {Creamos la ventana, Tipo, Texto,    Estilo,              Posicion,Tamaño,Padre,Menu,hInstance,El lparam}
{ ************************************************************************************************************ }

 SendMessage(Label1,WM_SETFONT,Fuente,Label1); // Ponemos la fuente que antes hemos definido
 SendMessage(Label2,WM_SETFONT,Fuente,Label1); // Ponemos la fuente que antes hemos definido
 SendMessage(Label3,WM_SETFONT,Fuente,Label1); // Ponemos la fuente que antes hemos definido
 SendMessage(Buton1,WM_SETFONT,Fuente,Buton1); // Ponemos la fuente que antes hemos definido
 SendMessage(Buton2,WM_SETFONT,Fuente,Buton2); // Ponemos la fuente que antes hemos definido
 SendMessage(Edit1,WM_SETFONT,Fuente,Edit1); // Ponemos la fuente que antes hemos definido
 SendMessage(Edit2,WM_SETFONT,Fuente,Edit2); // Ponemos la fuente que antes hemos definido
 SendMessage(Edit3,WM_SETFONT,Fuente,Edit3); // Ponemos la fuente que antes hemos definido

 while (GetMessage(Mensaje, Handle, 0, 0)) do // Vamos tratando los mensajes.
  begin
  TranslateMessage(Mensaje);
  DispatchMessage(Mensaje);
  end;

end.

Un Saludo

marcoszorrilla 19-02-2004 21:17:06

Esto debiera de ir al principio, pero lo añado aquí porque al pegar el texto me ha desaparecido el botón de editar el mensaje aún configurando la pantalla a la máxima resolución.
Código:

{Bueno, este ejemplo tratara de mostraros como elaborar una aplicacion sencilla utilizando
 llamadas a API, para crearla debereis hacer una Console Application y quitar la directiva
 (*$APPTYPE CONSOLE*) despues añadir a uses Windows y Messages, y el resto lo esplico paso
 a paso a lo largo del programa. Si bien escribir aplicacion con API es mas complicado tiene
 la gran ventaja de que los programas son pequeñisimos, Este por ejemplo sin APi serian unos
 300 Kb, con API 40 kb ;-)}

 {Copyright ® MrRidk 2000-2001 All rights reserved}
 {[email protected] -- http://www.mrridk.cjb.net}
program Ejemplo_Api;

uses
  Windows,
  Messages,
  SysUtils;

var
 Clase: TWndClassA; // Definimos Variables.
 Mensaje : tmsg; // Definimos la variable del mensaje de windows
 Label1, Label2, Label3, Edit1, Edit2, Edit3 : Integer; // Definimos variables
 Buton1, Buton2, Fuente, Handle, Instancia : Integer; // Definimos variables.
 Sumando1, Sumando2 : Pchar; // Definimos variables.
 Valor, Longitud : Integer; // Definimos Variables

Un Saludo.

roman 19-02-2004 21:17:19

Pues creo que te será más sencillo romperte la cabeza para ocultar el form. A fin de cuentas son 2 o tres líneas de código.

// Saludos

eduarcol 19-02-2004 21:30:28

Pues Bien yo poco un granito de arena:

Si haces un solo TFOrm y este TFOrm lo pones como Visible := False; la aplicacion desaparece de la barra de tareas. ya lo unico que te faltaria seria quitarlo del ctr-alt-supr, este tema ya se ha trataado en ell club asi que tienes como investigar.

Nota: Si quieres que te aparezca en la bandeja del sistema, puedes utilizar un componente RX.

Suerte

DarkByte 20-02-2004 21:38:46

eduarcol, en Delphi5 yo ponía mi aplicación como Visible := False y me aparecía un rectángulo de unos 2 cm de ancho y 6 de largo...

eduarcol 20-02-2004 21:43:50

en donde aparecia ese rectangulo??, y no es la aplicacion es el formulario unico y principal. te aseguro que si funciona por qe yo lo tengo asi precisamente en delphi 5

DarkByte 20-02-2004 21:56:43

Jeje, pues a mí no me iba. Al referirme a aplicación he querido decir Form. Pero bueno... tampoco es que me vaya a comer mucho la cabeza con el visible. Por cierto... he buscado lo de cambiar lo de Registered User y ahora no se dónde está... me parece que han cambiado la localización...

Gracias marcoszorrilla por tu código... aunque para esta aplicación voy a ocultar el form ( :d ), voy a examinar mientras tanto tu código... a ver si aprendo algo más.

eduarcol 20-02-2004 22:15:41

Cita:

Empezado por DarkByte
Jeje, pues a mí no me iba.

Y Ahora si te va???


Cita:

Empezado por DarkByte
tampoco es que me vaya a comer mucho la cabeza con el visible.

Y Ahora no te va???

por fin en que queda sirvio o no :confused:

DarkByte 21-02-2004 11:34:15

Dije iba porque no lo he vuelto a probar (estaba en linux... y no tengo kylix... aún...), pero ahora ya estoy en Gate's OS y voy a probarlo

DarkByte 21-02-2004 11:36:44

Gracias eduarcol, no me funcionaba porque ponía el visible := false en el Object Inspector, pero ahora he colado el código en un botón y tira perfectamente ;) ashias

delphi.com.ar 23-02-2004 00:10:14

Agrego algo:
Una pequeña ventaja, al crear una aplicación sin la unit Forms, es que el EXE final será mucho mas pequeño que si la incluyes.

Saludos!


La franja horaria es GMT +2. Ahora son las 18:07:04.

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