FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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 |
#2
|
|||
|
|||
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
|
#3
|
||||
|
||||
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! |
#4
|
||||
|
||||
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 |
#5
|
|||
|
|||
Lo que dice Roman es cierto pero no logro saber porque no hace el shutdown
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;FormCreate(Sender: TObject); //Esta funsion parece ser necesaria para realizar un shutdown en NT Y XP pero ni llamandola el programa realiza el mismo // Código:
NTSetPrivilege(sPrivilege: string; bEnabled: Boolean): Boolean; var hToken: THandle; TokenPriv: TOKEN_PRIVILEGES; PrevTokenPriv: TOKEN_PRIVILEGES; ReturnLength: Cardinal; TMainForm.WndProc (var Message: TMessage); hwnd,exitcode:word;
hwnd:=Handle; if (MESSAGE.MSG=WM_ENDSESSION) then
MESSAGE.LParam=ENDSESSION_LOGOFF then DestroyWindow(hwnd); //postquitmessage(exitcode); ExitWindowsEx(EWX_FORCE,0);//esta instruccion se ejecuta perfectamente cerrando la session, aunque para mi no es necesaria
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
[delphi]else inherited WndProc (Message);
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 |
#6
|
||||
|
||||
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 |
|
|
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 |
|