Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-04-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
Parece que lo que pasa es que tus dos aplicaciones tienen problemas de comunicacion Bien, pues podemos usar un fallo de seguridad de windows, o fallo de diseño como dicen ellos, que permite a una aplicacion mandar pulsaciones de teclado a otra si comparten el mismo escritorio aunque pertenezcan a usuarios distintos.

En la aplicacion principal (lanzador o como la llames) la que recibe el mensage de finalizar sesion, utilizamos el siguiente codigo para simular un HotKey:

Código Delphi [-]
  // Esto simula la combinacion de teclas CTRL+SHIFT+F12
  keybd_event(VK_LCONTROL,0,0,0);
  keybd_event(VK_MENU,0,0,0);
  keybd_event(VK_F12,0,0,0);
  keybd_event(VK_F12,0,KEYEVENTF_KEYUP,0);
  keybd_event(VK_LCONTROL,0,KEYEVENTF_KEYUP,0);
  keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,0);

En la segunda aplicacion, la que corre como otro usuario, previamente hemos regsitrado el Hotkey Ctr+Shift+F12. Cuando recibimos el mensage del HotKey, cerramos la aplicacion, o realizamos cualquier otra tarea que necesitemos. Un poco de codigo, para ilustrar todo esto:

Código Delphi [-]
// Para resgitar el HotKey (Colocalo por ejemplo en el OnCreate)
 RegisterHotKey(Handle,0,MOD_ALT or MOD_CONTROL, VK_F12);

// Para quitar el Hotkey (en el Onclose por ejemplo)
UnregisterHotKey(Handle,0);


// Por ultimo atrapamos el mensaje del Hotkey
type
  TForm1 = class(TForm)
  private
    { Private declarations }
    procedure WMHOTKEY(var Msg: TMessage);message WM_HOTKEY;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMHOTKEY(var Msg: TMessage);
begin
  // Y cualquier otra cosa que tengas que hacer antes de cerrar
  Close;
end;

Bueno, aqui te dejo mi aportacion, se que no esta en la linea que estabais siguiendo, pero solo es una sugerencia. Espero que te sirva
Responder Con Cita
  #2  
Antiguo 26-04-2006
Avatar de PoZi
PoZi PoZi is offline
Miembro
 
Registrado: abr 2006
Posts: 11
Poder: 0
PoZi Va por buen camino
A probar

Gracias seoane.
Probaré lo que me dices y ya os contaré.
Es algo parecido a lo que yo quería hacer con la diferencia de que yo le quería enviar el mensaje WM_CLOSE para que se ejecutase el evento OnCloseQuery, pero como el lanzador no tiene ventana no he podido enviárselo o no sé.
Hasta luego¡¡¡
Responder Con Cita
  #3  
Antiguo 26-04-2006
Avatar de PoZi
PoZi PoZi is offline
Miembro
 
Registrado: abr 2006
Posts: 11
Poder: 0
PoZi Va por buen camino
Smile Por fin

Muy Buenas a todos¡¡¡
Por fin ha funcionado. Ha costado sudor y lágrimas, pero bueno todavía no quiero echar las campanas al vuelo porque no lo he probado profundamente.
Me ha funcionado de dos formas:
1ª.- Mandando el mensaje WM_CLOSE al lanzador para que al recibirlo cierre windows:
Código Delphi [-]
{ Esto va en la aplicación principal }
procedure TForm1.CerrarProceso;
var
  IdVentana: HWnd;
begin
  IdVentana := FindWindow(nil, 'Lanzador');
  SendMessage(IdVentana, WM_CLOSE, 0, 0);
end;
 
{ Y esto en el lanzador }
procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
  WinSesionFin := true;
  inherited;
end;
procedure TForm1.WMEndSession(var Msg: TWMEndSession);
begin
  WinSesionFin := Msg.EndSession;
  inherited;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if WinSesionFin then
    begin
      EnvioMensaje; { Envia HotKey a Aplicación principal para que guarde los datos de salida }
      WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
      CanClose := true;
    end
  else
    begin
      ExitWindowsEx(EWX_FORCE,0);
      Application.Terminate;
    end;
end;
Initialization
  Application.Title:='Lanzador';
  Application.ShowMainForm:=False;

No me funcionaba porque tenía puesto Application.Title:=''; y además yo pensaba que como no tenía ventana activa, pues usaba Application.ShowMainForm:=False; ), no le podía enviar el mensaje.

2ª.- Igual que antes pero enviando un HotKey al lanzador (como indica arriba seoane), en lugar de WM_CLOSE. Cuando el lanzador lo detecta Cierra Windows y se cierra él.

Muchas Gracias a todos, sobretodo a Lepe que le he estado dando la tabarra durante bastante tiempo.
Saludos.

Última edición por PoZi fecha: 03-05-2006 a las 20:49:13.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Dar privilegios del SYSDBA a otro usuario Eolo Firebird e Interbase 3 21-03-2004 05:48:15
Roles - Usuarios y privilegios Osorio Firebird e Interbase 2 13-02-2004 23:34:31
Privilegios en interbase acrophet Conexión con bases de datos 1 09-02-2004 15:07:35


La franja horaria es GMT +2. Ahora son las 10:35:11.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi