Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problemas con SendMessage y WM_QUERYENDSESSION y WM_ENDSESSION

Estas en el tema de Problemas con SendMessage y WM_QUERYENDSESSION y WM_ENDSESSION en el foro de C/C++ en Foros del Web. Hola amigos, he estado liado con una pequeña aplicacion que realiza un hook de teclado y raton bloqueandolos. El caso es que a mis gatos ...
  #1 (permalink)  
Antiguo 06/04/2016, 03:13
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Problemas con SendMessage y WM_QUERYENDSESSION y WM_ENDSESSION

Hola amigos, he estado liado con una pequeña aplicacion que realiza un hook de teclado y raton bloqueandolos. El caso es que a mis gatos les gusta mucho ponerse encima del teclado y me la lian cada vez que se ponen encima de este y el pc esta encendido. La aplicacion la tengo 100% funcional y va genial pero me di cuenta que, si tenia la aplicacion corriendo y con los hooks activos y apagaba el pc, Windows cierra todas las aplicaciones pero no es capaz de cerrar la mia. Ya me ayudaron a solucionar este problema que por lo visto mi aplicacion se negaba a cerrarse y al enviarle windows el mensaje WM_QUERYENDSESSION mi aplicacion devolvia un valor diferente de 1 con lo que Windows se quedaba a la espera y no se cerraba. Ahora que ya lo solucioné controlando ese mensaje en mi aplicacion, me he creado una pequeña aplicacion la cual su funcion seria enviar los mensajes WM_QUERYENDSESSION y WM_ENDSESSION y esta asi:
Código C++:
Ver original
  1. void __fastcall TForm1::ButtonQueryEndSessionClick(TObject *Sender)
  2. {
  3.    HWND hWnd;
  4.    UINT message = WM_QUERYENDSESSION;
  5.    WPARAM wParam = 0;
  6.    LPARAM lParam = 0;
  7.    LRESULT result;
  8.  
  9.    hWnd=FindWindow("TFormMain","Bloqueador anti-gato");
  10.    result = SendMessage(&hWnd,message,wParam,lParam);
  11. }
  12. //---------------------------------------------------------------------------
  13. void __fastcall TForm1::ButtonEndSessionClick(TObject *Sender)
  14. {
  15.    HWND hWnd;
  16.    UINT message = WM_ENDSESSION;
  17.    WPARAM wParam = 0;
  18.    LPARAM lParam = 0;
  19.    LRESULT result;
  20.  
  21.    hWnd=FindWindow("TFormMain","Bloqueador anti-gato");
  22.    result = SendMessage(&hWnd,message,wParam,lParam);
  23. }
  24. //---------------------------------------------------------------------------
El caso es que mi aplicacion no se cierra al mandarle esos mensajes y supongo que algo hago mal. ¿podeis ayudarme? Es que para probar lo que hice en mi aplicacion tenia que estar cerrando sesion y volviendola a abrir y lo suyo es simular eso para ahorrarme esos pasos ya que mi ordenador es del plestoceno y es lentito para encender y apagar.
Ambas aplicaciones estan hechas con C++Builder 6.
  #2 (permalink)  
Antiguo 06/04/2016, 03:30
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Problemas con SendMessage y WM_QUERYENDSESSION y WM_ENDSESSION

¿Has probado a bloquear la sesión (tecla de Windows + L)?

A veces nos complicamos en exceso cuando tenemos una solución mucho más limpia y funcional.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #3 (permalink)  
Antiguo 06/04/2016, 03:54
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Problemas con SendMessage y WM_QUERYENDSESSION y WM_ENDSESSION

El caso es que casi siempre estoy viendo pelis en el pc y no puedo bloquear porque entonces no veo nada. Mi aplicacion ya funciona perfectamente, lo que quiero es crearme una miniApp que me permita enviar esos dos mensajes para experimentar con otras aplicaciones y ver si se cierran o que hacen. El caso es que esta miniApp no funciona porque no se cierran las aplicaciones y no llegan esos mensajes y no se que pasa.
  #4 (permalink)  
Antiguo 06/04/2016, 04:00
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Problemas con SendMessage y WM_QUERYENDSESSION y WM_ENDSESSION

¿Qué está haciendo tu aplicación cuando recibe esos mensajes?

¿Has comprobado si tu aplicación recibe los mensajes?

¿Qué devuelve entonces la aplicación?
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #5 (permalink)  
Antiguo 06/04/2016, 04:33
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Problemas con SendMessage y WM_QUERYENDSESSION y WM_ENDSESSION

Si recibe los mensajes cuando windows se los manda pero no cuando se los mando yo. En mi aplicacion hago esto para controlar esos eventos:
Código C++:
Ver original
  1. void __fastcall TFormMain::WndProc(Messages::TMessage &Message)
  2. {
  3.   switch(Message.Msg){
  4.     case WM_QUERYENDSESSION:
  5.       Message.Result = 1;
  6.       return;                        // La VCL no podrá procesar el mensaje
  7.     case WM_ENDSESSION:
  8.       //CloseApp = true;
  9.       //SysTrayCanClose = CloseApp;
  10.       if(hKeyboardHook != NULL){
  11.          SysTrayIcon->Minimize();
  12.          SysTrayIcon->ShowBalloon("Oye tu","¿Como te atreves a cerrar la sesión cuando estoy bloqueando?\nEsto no quedará así, me he quedado con tu cara");
  13.          Sleep(6000);
  14.          UnhookWindowsHookEx(hKeyboardHook);
  15.          hKeyboardHook = NULL;
  16.       }
  17.       if(hMouseHook != NULL){
  18.          UnhookWindowsHookEx(hMouseHook);
  19.          hMouseHook= NULL;
  20.       }
  21.       break;
  22.   }
  23.   TForm::WndProc(Message);
  24. }
  #6 (permalink)  
Antiguo 06/04/2016, 04:46
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Problemas con SendMessage y WM_QUERYENDSESSION y WM_ENDSESSION

Cómo has registrado la ventana? Lo mismo los datos son diferentes y lo mismo te está fallando en el FindWindow
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #7 (permalink)  
Antiguo 06/04/2016, 05:22
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Problemas con SendMessage y WM_QUERYENDSESSION y WM_ENDSESSION

FindWindow me devuelve un valor diferente de NULL y el nombre de la clase del Form es FormMain y el titulo es correcto.
  #8 (permalink)  
Antiguo 06/04/2016, 06:56
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Problemas con SendMessage y WM_QUERYENDSESSION y WM_ENDSESSION

Un detalle tonto...

Código C:
Ver original
  1. LRESULT WINAPI SendMessage(
  2.   _In_ HWND   hWnd,
  3.   _In_ UINT   Msg,
  4.   _In_ WPARAM wParam,
  5.   _In_ LPARAM lParam
  6. );

Si SendMessage espera recibir un handle tal cual... ¿por qué le estás pasando un puntero?
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #9 (permalink)  
Antiguo 06/04/2016, 10:24
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Problemas con SendMessage y WM_QUERYENDSESSION y WM_ENDSESSION

Ya lo solucioné, sobraba el & que puse delante de hWnd. Eso era eferion, como siempre das en el clavo. Esto sólo era una prueba para pasarlo a otro proyecto más grande que permite enviar mensajes a otras aplicaciones y ya lo tengo todo solucionado.
Gracias a todos.

Etiquetas: funcion, sendmessage
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:58.