Hola,
Mi problema es el siguiente:
Estaba viendo una pagina donde ponian un codigo para minimizar la aplicacion en la bandeja del sistema, pero no pude hacerlo funcionar.aqui les dejo el codigo. si alguien lo hace funcionar lo dice.
El texto dice lo siguiente:
Voy a mostraros como modificar el formulario principal de vuestra aplicación para que se minimize en la bandeja del sistema y una vez minimizado cuando se pulse sobre el icono se restaure. También vamos a añadir la posibilidad de pulsar dicho icono con el botón derecho del ratón y que muestre un menú contextual (popup) con la opción Mostrar.
Lo primero de todo es añadir un menú contextual a nuestro formulario principal (PopupMenu) con el nombre MenuBandeja. Añadimos una sola opción llamada Mostrar. A continuación añadimos en la sección uses del formulario principal la unidad ShellAPI:
Código Delphi
[-]uses
Windows, Messages, ...., ShellAPI;
Después en la sección private insertamos la variable:
Código Delphi
[-] IconData: TNotifyIconData;
En la misma sección private añadimos los procedimientos:
Código Delphi
[-] procedure WMSysCommand( var Msg: TWMSysCommand ); message WM_SYSCOMMAND;
procedure Restaurar( var Msg: TMessage ); message WM_USER+1;
Cuya implementación sería la siguiente:
Código Delphi
[-]procedure TFPrincipal.WMSysCommand( var Msg: TWMSysCommand );
begin
if Msg.CmdType = SC_MINIMIZE then
Minimizar
else
DefaultHandler( Msg );
end;
procedure TFPrincipal.Restaurar( var Msg: TMessage );
var p: TPoint;
begin
if Msg.lParam = WM_LBUTTONDOWN then
MostrarClick( Self );
if Msg.lParam = WM_RBUTTONDOWN then
begin
SetForegroundWindow( Handle );
GetCursorPos( p );
MenuBandeja.Popup( p.x, p.y );
PostMessage( Handle, WM_NULL, 0, 0 );
end;
end;
El procedimiento WMSysCommand es el encargado de interceptar los mensajes del sistema que manda Windows a nuestra aplicación. En el caso de que el mensaje enviado sea SC_MINIMIZE minimizamos la ventana en la bandeja del sistema. Si es otro mensaje dejamos que Windows lo maneje (DefaultHandler).
El procedimiento Restaurar comprueba si ha pulsado el botón izquierdo del ratón sobre el icono de la bandeja del sistema para volver a mostrar nuestra ventana. Si pulsa el botón derecho llamará a nuestro menu contextual MenuBandeja.
Ahora creamos el procedimiento encargado de minimizar la ventana:
Código Delphi
[-]procedure TFPrincipal.Minimizar;
begin
with IconData do
begin
cbSize := sizeof( IconData );
Wnd := Handle;
uID := 100;
uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
uCallbackMessage := WM_USER + 1;
hIcon := Application.Icon.Handle;
StrPCopy( szTip, Application.Title );
end;
Shell_NotifyIcon( NIM_ADD, @IconData );
Hide;
end;
Y por último el evento al pulsar la opción Mostrar en el menú contextual:Código Delphi
[-]procedure TFPrincipal.MostrarClick( Sender: TObject );
begin
FPrincipal.Show;
ShowWindow( Application.Handle, SW_SHOW );
Shell_NotifyIcon( NIM_DELETE, @IconData );
IconData.Wnd := 0;
end;
Si alguien lo hace funcionar por favor diganmelo.
Saludos