Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-04-2012
Rolando Glez Rolando Glez is offline
Miembro
 
Registrado: nov 2004
Ubicación: Havana
Posts: 62
Poder: 20
Rolando Glez Va por buen camino
Aplicacion no cierra cuando el SO trata de cerrar (inicializar el sistema o apagar)

Hola a todos he hecho una aplicacion minimizada es decir en forma de Icono la aplicacion responde correctamente a sus mensaje pero cuando se quiere cerrar la sesion es decir Inicializar el sistema o apagar, el Window cierra todas las aplicaciones que estan en systray pero mi aplicacion window informa que no responde como resultado el systema operativo no puede cerrar (inicializar o apagar cuando mi programita esta en memoria), no se porque esto sucede.

He tratado de resolver el problema gestionando los mensaje que window le envia a la aplicacion para cuando envie algun mensaje parecido a WM_QUIT O WM_DESTROY mi aplicacion termine se vaya de memoria y asi el sistema operativo puede cerrar la sesion he el procedimiento

Código:
procedure TMainForm.WndProc (var Message: TMessage);
var
  hwnd:word;
  lpmsg:TagMsg;
  continua:boolean;
  nv:variant;
begin
    hwnd:=mainform.handle;
    //continua:=GETMESSAGE(lpmsg,hwnd,0,0);
    if (MESSAGE.MSG=WM_QUIT) then APPLICATION.TERMINATE
                                        else  begin

                                              //dispatchmessage(lpmsg);
                                              inherited WndProc (Message);

                                              end


end;

Segun tengo entendido Window envia mensajes a las aplicaciones y las aplicaciones pueden en dependencia de el mensaje tomar una accion determinada esa es mi idea para que termine mi aplicacion pero no logro
que termine mi aplicacion cuando supuestamente window le este enviando un mensaje de WN_QUIT O WM_DESTROY a la aplicacion

no tengo claro cual es el handle de la funsion getmessage, en fin quisiera que alguien me diera un norte con relacion al tema saludos y gracias
Responder Con Cita
  #2  
Antiguo 11-04-2012
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
si mal no recuerdo, cuando windows se apaga, manda el mensaje wm_queryendsession o algo asi, buscalo en la ayuda de win32, estoy casi seguro que lleva lo de endsession jeje
Responder Con Cita
  #3  
Antiguo 11-04-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Efectivamente, WM_QUERYENDSESSION es enviado a la aplicación cuando el sistema está cerrando la sesión del usuario activo. WM_QUIT es enviado cuando se solicita el cierre de una aplicación en específico.

En lo que no estoy claro es que si las ventanas hijas reciben estos mensajes. Esta pueda ser la causa de tu problema. Recuerda que en Delphi, la ventana principal de la aplicación no es la solemos llamar "MainForm", sino una ventana oculta que es leída y manipulada por medio de la variable global Application. No sé si esta ventana tenga la propiedad WndProc para que por medio de ella puedas reimplementar tu propia función WndProc. Otra solución sería probar con el control TApplicationEvents.

Saludos!
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #4  
Antiguo 11-04-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Creo que más que nada, el compañero tendría que aclarar cuál es el código que usa para mantener la aplicación en la bandeja del sistema pues, en principio, el sólo hecho de mantener un icono ahí no debería impedir el cierre de sesión. Quizá también sería bueno que indicara el S.O pues en las pruebas que he hecho con Windows 7, no se me ha presentado el problema que menciona.

// Saludos
Responder Con Cita
  #5  
Antiguo 13-04-2012
Rolando Glez Rolando Glez is offline
Miembro
 
Registrado: nov 2004
Ubicación: Havana
Posts: 62
Poder: 20
Rolando Glez Va por buen camino
Lo que dice Roman es cierto pero no logro saber porque no hace el shutdown

Código Delphi [-]
const

SE_CREATE_TOKEN_NAME = 'SeCreateTokenPrivilege';
SE_ASSIGNPRIMARYTOKEN_NAME = 'SeAssignPrimaryTokenPrivilege';
SE_LOCK_MEMORY_NAME = 'SeLockMemoryPrivilege';
SE_INCREASE_QUOTA_NAME = 'SeIncreaseQuotaPrivilege';
SE_UNSOLICITED_INPUT_NAME = 'SeUnsolicitedInputPrivilege';
SE_MACHINE_ACCOUNT_NAME = 'SeMachineAccountPrivilege';
SE_TCB_NAME = 'SeTcbPrivilege';
SE_SECURITY_NAME = 'SeSecurityPrivilege';
SE_TAKE_OWNERSHIP_NAME = 'SeTakeOwnershipPrivilege';
SE_LOAD_DRIVER_NAME = 'SeLoadDriverPrivilege';
SE_SYSTEM_PROFILE_NAME = 'SeSystemProfilePrivilege';
SE_SYSTEMTIME_NAME = 'SeSystemtimePrivilege';
SE_PROF_SINGLE_PROCESS_NAME = 'SeProfileSingleProcessPrivilege';
SE_INC_BASE_PRIORITY_NAME = 'SeIncreaseBasePriorityPrivilege';
SE_CREATE_PAGEFILE_NAME = 'SeCreatePagefilePrivilege';
SE_CREATE_PERMANENT_NAME = 'SeCreatePermanentPrivilege';
SE_BACKUP_NAME = 'SeBackupPrivilege';
SE_RESTORE_NAME = 'SeRestorePrivilege';
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
SE_DEBUG_NAME = 'SeDebugPrivilege';
SE_AUDIT_NAME = 'SeAuditPrivilege';
SE_SYSTEM_ENVIRONMENT_NAME = 'SeSystemEnvironmentPrivilege';
SE_CHANGE_NOTIFY_NAME = 'SeChangeNotifyPrivilege';
SE_REMOTE_SHUTDOWN_NAME = 'SeRemoteShutdownPrivilege';
SE_UNDOCK_NAME = 'SeUndockPrivilege';
SE_SYNC_AGENT_NAME = 'SeSyncAgentPrivilege';
SE_ENABLE_DELEGATION_NAME = 'SeEnableDelegationPrivilege';
SE_MANAGE_VOLUME_NAME = 'SeManageVolumePrivilege';

// Enables or disables privileges debending on the bEnabled
// Aktiviert oder deaktiviert Privilegien, abhängig von bEnabled








Código:
type
    
   
  TMainForm = class(TForm)
    PopupMenu1: TPopupMenu;
    ShowForm1: TMenuItem;
    HideForm1: TMenuItem;
    ImageList1: TImageList;
    ListBox1: TListBox;
    
Código Delphi [-]
procedure
FormCreate(Sender: TObject);
Código Delphi [-]
procedure
FormDestroy(Sender: TObject);
Código Delphi [-]
procedure
ShowForm1DrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
Código Delphi [-]
procedure
HideForm1DrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
Código Delphi [-]
procedure
Exit1DrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
Código Delphi [-]
 procedure
Exit1Click(Sender: TObject); procedure AnimateIcon1DrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
Código Delphi [-]
procedure
ShowForm1Click(Sender: TObject);
Código Delphi [-]
 procedure
HideForm1Click(Sender: TObject);
Código Delphi [-]
procedure
Exit1MeasureItem(Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer);
Código Delphi [-]
procedure
AnimateIcon1Click(Sender: TObject);
Código Delphi [-]
procedure
FormActivate(Sender: TObject);
Código Delphi [-]
procedure
FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean);
Código Delphi [-]
procedure
WndProc(var Message: TMessage); override;
Código Delphi [-]
 private
TrayIconData: TNotifyIconData; //procedure TimerCallback (Sender: TObject);
Código Delphi [-]
public
procedure TrayMessage(var Msg: TMessage); message WM_ICONTRAY; procedure DrawBar(ACanvas: TCanvas); end;
//Esta no son todas las property del objeto pero las que involucran al systray estan















//Esta funsion parece ser necesaria para realizar un shutdown en NT Y XP pero ni llamandola el programa realiza el mismo
//

Código:
Código Delphi [-]
function
NTSetPrivilege(sPrivilege: string; bEnabled: Boolean): Boolean; var hToken: THandle; TokenPriv: TOKEN_PRIVILEGES; PrevTokenPriv: TOKEN_PRIVILEGES; ReturnLength: Cardinal;
Código Delphi [-]
begin
Result := True; // Only for Windows NT/2000/XP and later.
Código Delphi [-]
if
not (Win32Platform = VER_PLATFORM_WIN32_NT)
Código Delphi [-]
then
Exit; Result := False; // obtain the processes token
Código Delphi [-]
if
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)
Código Delphi [-]
then
  begin
Código Delphi [-]
 try
// Get the locally unique identifier (LUID) .
Código Delphi [-]
 if
LookupPrivilegeValue(nil, PChar(sPrivilege), TokenPriv.Privileges[0].Luid) then
Código Delphi [-]
 begin
TokenPriv.PrivilegeCount := 1; // one privilege to set
Código Delphi [-]
case
bEnabled
Código Delphi [-]
of
True: TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; False: TokenPriv.Privileges[0].Attributes := 0;
Código Delphi [-]
end;
ReturnLength := 0; // replaces a var parameter PrevTokenPriv := TokenPriv; // enable or disable the privilege AdjustTokenPrivileges(hToken, bEnabled, TokenPriv, SizeOf(PrevTokenPriv), PrevTokenPriv, ReturnLength);
Código Delphi [-]
 end;
    finally
CloseHandle(hToken);
Código Delphi [-]
end;
  end;
// test the return value of AdjustTokenPrivileges. Result := GetLastError = ERROR_SUCCESS; if not Result then raise Exception.Create(SysErrorMessage(GetLastError)); end;







Código Delphi [-]
procedure
TMainForm.WndProc (var Message: TMessage);

Código Delphi [-]
var
hwnd,exitcode:word;


Código Delphi [-]
begin

hwnd:=Handle;
if (MESSAGE.MSG=WM_ENDSESSION) then
Código Delphi [-]
begin

Código Delphi [-]
if
MESSAGE.LParam=ENDSESSION_LOGOFF
Código Delphi [-]
then
then
Código Delphi [-]
begin
DestroyWindow(hwnd);
//postquitmessage(exitcode);
ExitWindowsEx(EWX_FORCE,0);//esta instruccion se ejecuta perfectamente cerrando la session, aunque para mi no es necesaria
Código Delphi [-]
end
Código Delphi [-]
  else
                         begin
DestroyWindow(hwnd);
//postquitmessage(exitcode);
NTSetPrivilege(SE_SHUTDOWN_NAME,true);
//Lei que es necesario el llamado para realizar shutdown
ExitWindowsEx(EWX_SHUTDOWN,0);
//No se ejecuta exitosamente la anterior instruccion, el programa se va de memoria pero para el shutdown

Código Delphi [-]
 end

Código Delphi [-]
end
[delphi]else
inherited WndProc (Message);


Código Delphi [-]
end;






La idea es que cuando MESSAGE.LParam=ENDSESSION_LOGOFF
se cierre la session pero que cuando sea otra cosa se apague el sistema, el llamado a cerrar la session se ejecuta exitosamente sin embargo el shutdown no ,sencillamente window para el mismo,pense que el privilegio era la causa ,me hice de esta funsion pero ni llamandola
el desgraciado shutdown se ejecuta
Responder Con Cita
  #6  
Antiguo 13-04-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Pero, ¡qué galimatías es esto? No se entiende nada y sigues sin contestar cómo pones el icono en la bandeja ni qué S.O usas.

Te pongo un ejemplo que hice y que no me causa problemas aunque quizá hay factores que no estoy considerando. De todas formas pruébalo. El ejecutable sólo lo puedes correr si tienes Delphi 7, si no, basta que compiles.

// Saludos
Archivos Adjuntos
Tipo de Archivo: zip TrayIcon.zip (55,6 KB, 9 visitas)
Responder Con Cita
  #7  
Antiguo 16-04-2012
genius78 genius78 is offline
Registrado
NULL
 
Registrado: ago 2011
Posts: 4
Poder: 0
genius78 Va por buen camino
me pasó algo similar hace un tiempo y era un closeQuery mal manejado en un x formulario, si lo buscas capaz lo encuentres.

Saludos.
Responder Con Cita
  #8  
Antiguo 18-04-2012
Rolando Glez Rolando Glez is offline
Miembro
 
Registrado: nov 2004
Ubicación: Havana
Posts: 62
Poder: 20
Rolando Glez Va por buen camino
Resuelto el Problema con el systray

Bueno he resuelto el problema con la ayuda de Roman y Escafandra parece ser que la estructura systraydata habia algo incorrecto, utilice el componente de escafandra y Bingo bueno muchas gracias a todos
Responder Con Cita
  #9  
Antiguo 30-05-2012
Rolando Glez Rolando Glez is offline
Miembro
 
Registrado: nov 2004
Ubicación: Havana
Posts: 62
Poder: 20
Rolando Glez Va por buen camino
Smile Intrucciones que causaron el problema

//se sustituyo estas instruccionespor el componente hecho escafandra systray
// fix problem

{with TrayIconData do
begin
cbSize := SizeOf(TrayIconData);
Wnd := Handle;
uID := 0;
uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
uCallbackMessage := WM_ICONTRAY;
hIcon := Application.Icon.Handle;
StrPCopy(szTip, Application.Title);
end;

Shell_NotifyIcon(NIM_ADD, @TrayIconData); }

parece ser que hay algo incorrecto en estas instrucciones que a hace
que el sistema no pueda cerrar la aplicacion pero bueno lo resolvi con el uso del componente de escafranda y eliminando este codigo de la aplicacion

TrayIconData: TNotifyIconData; esta definida dentro de la zona privada
de la forma principal
Responder Con Cita
  #10  
Antiguo 30-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.050
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Recuerda poner los tags al código fuente, ejemplo:



Gracias
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como saber mediante hook cuando se abre o cierra una aplicacion JoAnCa API de Windows 2 15-11-2008 20:05:48
Apagar, reiniciar y cerrar sesión jorgegetafe Varios 25 05-06-2007 20:28:17
Cerrar aplicación al apagar el sistema MDSato API de Windows 17 08-11-2006 23:08:30
Error al cerrar aplicacion cuando creo fields dinamicamente mierda OOP 3 02-11-2006 18:57:41
al cerrar un libro se me cierra el Excel! haron Servers 0 30-05-2003 11:07:26


La franja horaria es GMT +2. Ahora son las 15:59:13.


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
Copyright 1996-2007 Club Delphi