RE:quitar mi programa de la lista de tareas
{Copio y pego de la página del truco}
Primero, debemos registar el tipo de la funcion que queremos registrar, para que Delphi controle bien sus parámetros.
Lo haremos en el interface de la form:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
{Esta linea/This Line}
type
TRegisterService = function (dwProcessID, dwType:DWord):Dword;stdcall;
Ahora, necesitamos una variable global a la form para guardar la direccion de la procedure.
Por ejemplo, la incluiremos en la parte private de la form:
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
RegisterServiceProcess: TRegisterService;
public
{ Public declarations }
end;
Ahora, necesitamos asignar la direccion a la procedure antes de poder usarla.
Lo haremos en el evento OnCreate de la form. Fijate que usaremos una función que comprueba si la procedure existe o no, generando una excepcion (que podemos capturar o dejarla pasar) si la procedure no existiese...:
procedure TForm1.FormCreate(Sender: TObject);
function AsignaProcedure(EnQueDll,Procedimiento: string):TFarProc;
var
MangoProc,
MangoLib : THandle;
begin
Result:=nil;
MangoLib:=GetModuleHandle(Pchar(EnQueDll));
if MangoLib <> 0 then
Result:=GetProcAddress(MangoLib,Pchar(Procedimiento));
{Si la DLL o la procedure no esta disponible... error}
if (MangoLib=0) or (Result=nil) then
raise Exception.create( Procedimiento+
' en '+
EnQueDll+
' no encontrado.');
end;
begin
try
@RegisterServiceProcess:=AsignaProcedure( 'KERNEL32.DLL',
'RegisterServiceProcess');
except
ShowMessage('Error, funcion RegisterServiceProcess no encontrada...');
end;
end;
Si te fijas, en este ejemplo capturo la excepcion, dando el mensaje que a mi me da la gana. Si quitase el 'ShowMessage' podria hacerla silenciosa... es decir, que el usuario ni se enteraría de que existe ese problema. Tu mismo.
Es conveniente que nos vayamos acostumbrando a la manipulación de errores con excepciones, al final te quitan mucho trabajo.
Finalmente... nos queda el truco en sí, es decir... llamar a la funcion que tanto currelo nos ha dado declarar:
procedure TForm1.Button1Click(Sender: TObject);
begin
{Ocultar la aplicacion.../Hide the application...}
if Assigned(RegisterServiceProcess) then
RegisterServiceProcess(GetCurrentProcessID,1);
end;
Si te fijas, utilizo el If Assigned para asegurarme de que fué declarada, para evitar sorpresitas...