| 
	
		|  Autor | Tema: Capturar señal WM_QUERYENDSESSION   (Leído 4,546 veces) |  
	| 
			| 
					
						| gxg 
								
								 Desconectado 
								Mensajes: 37
								
								
								
								
								
								   | 
 
Hola necesito un codigo en  C para saber cuando windows ha lanzado esta señal.La idea es ejecutar un trozo de codigo antes de que se apague el pc.
 
 
 Gracias
 
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| Oblivi0n 
								 
								
								 Desconectado 
								Mensajes: 392
								 
								Odio las ranas.
								
								
								
								
								
								   | 
 
tienes que usar WinAPI en el bucle de mesajes, pones un  case WM_QUERYENDSESSION:codebreak;
 y ya el bucle de mensajes seria algo asi LRESULT CALLBACK WindowsProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){    switch(msg)                //Analizamos el mensaje que recibe como parametro la función    {        case WM_PAINT:         //En caso que ocurra WM_PAINT            HDC hDC;   //Creamos un dispositivo de contexto (para poder dibujar)            //Contiene información que puede ser usada para pintar el área de cliente de una ventana por la propia aplicación.            PAINTSTRUCT ps;            hDC = BeginPaint(hwnd, &ps);  //Prepara la ventana para dibujar sobre ella            RECT  rectangulo;      //Creamos un rectangulo en la ventana para dibujar sobre el            GetClientRect(hwnd, &rectangulo);   //Agregamos el rectangulo a la ventana            //Función que dibuja un texto sobre el rectangulo creado            DrawText(hDC,                                   //Identificador del dispositivo de context                     "Hola Mundo!!!!!",                     //Texto a dibujar en pantalla                     -1,                                    //Dejamos que la función ajuste automaticamente el tamaño del texto.                     &rectangulo,                            //Dirección del rectangulo donde se dibujará el texto                     DT_SINGLELINE | DT_CENTER | DT_VCENTER  //Formato del texto (una sola linea centrada horizontal y vericalmente)                     );            EndPaint(hwnd, &ps);        //Termina el proceso de dibujo en la ventana        break;         case WM_DESTROY:          //En caso que ocurra WM_DESTROY            PostQuitMessage(0);  //Ocurre el mensaje WM_QUIT para terminar la aplicación            return 0;        break;    }     //Esta función procesa los mensajes no tratados por WindowsProc(), como redimensionar    //la ventana, maximizarla, etc.. , es decir, hace lo predterminado sin alterar su función    return DefWindowProc(hwnd, msg, wParam, lParam);}
 mirate este post que explican mejor que yo http://foro.elhacker.net/programacion_cc/principios_basicos_de_programacion_windows_lenguaje_c-t299760.0.html
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| raul338 
								       
								
								 Desconectado 
								Mensajes: 2.633
								
								 
								La sonrisa es la mejor forma de afrontar las cosas
								
								
								
								
								
								     | 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| gxg 
								
								 Desconectado 
								Mensajes: 37
								
								
								
								
								
								   | 
 
Ya lei todos esos enlaces antes de que pusiera este post. Llevo 3 meses programando, no quiero que me digais como se hace necesito el trozo de codigo contreto, porque tras buscar mucho informacion no soy capaz de hacerlo por mi mismo.
 En el enzace anterior no estra en c.
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| Eternal Idol 
								Kernel coder ajeno al tiempo 
								Moderador
								      Desconectado 
								Mensajes: 5.970
								
								 
								Israel nunca torturó niños, ni lo volverá a hacer.
								
								
								
								
								
								     | 
 
gxg: vas a tener que poner mas esfuerzo de tu parte.
 raul338: no dejes mas enlaces sobre VB por favor, este no es el subforo adecuado para eso.
 |  
						| 
								|  |  
								|  |  En línea | 
 
 La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.Juan Domingo Perón
 |  |  |  | 
			| 
					
						| gxg 
								
								 Desconectado 
								Mensajes: 37
								
								
								
								
								
								   | 
 
Lo he hecho de esta forma pero no me funciona, ¿Alguien me puede ayudar? MSG msg; while(1) { GetMessage(&msg, NULL, 0, 0) if(msg.wParam==WM_QUERYENDSESSION) //Codigo a ejecutar cuando se apaga el pc } Mi SO es windows xpEI: juntando mensajes. Ahora estoy utilizando este codigo, pero no me funciona porque al apagar el pc no me sale ninguna ventana ni se me borra el archivo que tengo en  c:\apagar.txt #include <windows.h>#include <stdio.h>
 LRESULT CALLBACK YourWindowProc(HWND hWnd, UINT uMsgId, WPARAM wParam, LPARAM lParam)
 {
 switch(uMsgId) {
 case WM_QUERYENDSESSION:
 {
 remove("C:\\apagar.txt ");
 MessageBoxA(0, "adios", "dw", 0);
 
 return 0;
 break;
 }
 }
 }
 
 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
 {
 WNDCLASSEX wc;
 MSG msg;
 wc.lpfnWndProc = YourWindowProc;
 BOOL bRet;
 
 
 while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
 {
 if (bRet == -1)
 {
 
 
 }
 else
 {
 
 
 TranslateMessage(&msg);
 
 DispatchMessage(&msg);
 }
 }
 return 0;
 }
 |  
						| 
								|  |  
								| « Última modificación:  6 Marzo 2011, 12:03 pm por Eternal Idol » |  En línea | 
 
 |  |  |  |  |  
 
	
 
   |