Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   SendMessage no me funciona (https://www.clubdelphi.com/foros/showthread.php?t=48928)

gluglu 08-10-2007 17:35:55

SendMessage no me funciona
 
Hola de nuevo !

No entiendo por qué no me funciona el SendMessage en este caso, si por otro lado ayer con hilo diferente Seoane me dí una opción que me funcionó perfectamente.

A ver ...

En un formulario de mi aplicación principal pido un código de usuario. Después de introducirlo, y en el evento FormClose del Form correspondiente hago :

Código Delphi [-]
const
  WM_CLOSEREQUEST = WM_USER + 102;
 
procedure TLogIn.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  fHandle := FindWindow(nil, 'Wake-Up');
  if fHandle <> 0 then
    SendMessage(fHandle, WM_CLOSEREQUEST, 0, 0);
  ...
  ...
end;

Y en la otra aplicación denomnidad Wake-Up lo que tengo es :
Código Delphi [-]
const
  WM_CLOSEUSERID = WM_USER + 102;
 
type
  TWakeUp = class(TForm)
  ...
  private
    { Private declarations }
    procedure Close_UserID_Request(var Msg: TMessage); message WM_CLOSEUSERID;
  public
    { Public declarations }
  end;

procedure TWakeUp.Close_UserID_Request(var Msg: TMessage);
begin
  if Assigned(WakeUp1) then begin
    WakeUp1.Free;
    WakeUp1 := nil;
  end;
end;

Pues bien, no entra nunca en el procedimiento TWakeUp.Close_UserID_Request, aun habiendo comprobado que el fHandle obtenido en la aplicación que 'manda' el mensaje es diferente de 0 y que pasa correctamente por SendMessage.

Qué estoy haciendo mal ?? :o

Garcias por vuestra ayuda.

droguerman 08-10-2007 18:14:22

intenta con PostMessage

seoane 08-10-2007 18:14:37

Antes de nada, esto:
Código Delphi [-]
if Assigned(WakeUp1) then begin
  WakeUp1.Free;
  WakeUp1 := nil;
end;

Yo lo haría así (si lo se, soy un quisquilloso :p ):
Código Delphi [-]
  FreeAndNil(WakeIp1);

Con respecto a tu problema, dices que FindWindow te devuelve un handle, pero ¿estas seguro que es el correcto?. Puede haber mas de una ventana con ese titulo, puede que la ventana con ese titulo no sea TWakeUp. Hay veces que la cosa es tan tonta como que tienes una carpeta con ese mismo nombre y la tienes abierta ¿No tendrás una carpeta llamada "Wake-up"? :D

gluglu 08-10-2007 18:36:14

Gracias Domingo de nuevo por tu ayuda.

No, seguro que el Handle que obtengo es correcto. De hecho no utilizo el nombre exacto que he puesto aquí en el hilo, sino uno mas complicado de prueba con varias caracteres más.

Y además lo inicializo en la aplicación con Application.Title := '....'

Además seguro que debe ser el Handle correcto ya que cuando no tengo activa la aplicación Wake-Up, el Handle que me devuelve es 0.

Lo dicho, no entiendo por qué no funciona si con la explicación tuya de ayer solucioné el otro problema que tenía. Perfectamente. Y ahora trataba de hacer una cosa adicional pero en sentido contrario.

Me queda una duda que no sé si tiene algo que ver. Entiendo que por supuesto no debería tener nada que ver.

En el .dpr del programa Wake-Up comprueba que sólo se permita una instancia del programa de la siguiente manera :
Código Delphi [-]
  Handle := CreateMutex(nil, true, 'E1BFB967-E3EB-47EB-977E-780CE7BB4723');
  if GetLastError = ERROR_ALREADY_EXISTS then begin
     PostMessage(HWND_BROADCAST, messID, 0, 0);
     Exit;
  end;

Como decía, entiendo que no tiene nada que ver como para que el SendMessage no funcione, no ?

gluglu 08-10-2007 18:47:53

Probé también con PostMessage, tal y como indicaba droguerman, y nada.

seoane 08-10-2007 20:04:02

Cita:

Empezado por gluglu (Mensaje 236950)
Y además lo inicializo en la aplicación con Application.Title := '....'

Empezáramos por ahí. En delphi, todas las aplicaciones que creamos normalmente "VCL Forms Application", crean una ventana por cada formulario y además una oculta que pasa a ser la ventana principal de la aplicación.

Cuando tu utilizas Aplication.Title, a la ventana que le estas cambiando el titulo es a la que esta oculta. En tu caso a la ventana que le tienes que cambiar el titulo es a WakeUp, y para eso esta la propiedad caption:
Código Delphi [-]
WakeUp.Caption:= '...';
Y deja el Aplication.Title tranquilo ;)

gluglu 08-10-2007 20:11:49

Cachis !!! :mad:

Perfecto de nuevo Domingo !!

Pues mira que ha sido casualidad creo yo que la pregunta que me contestaste ayer, el Caption de la ventana principal coincidía con el Application.Title que le dí (lo cual suele ser bastante común), y dí con la solución a la primera.

Ahora resulta que la aplicación Wake-Up, la ventana principal la tengo sin marco (bsNone) y por eso no le puse ningún Caption a la ventana principal. Y claro, por eso por más que intentaba no funcionaba !! :o :mad:

De nuevo, mil gracias por tu ayuda. Todo perfecto. Me traía loco ya !


La franja horaria es GMT +2. Ahora son las 02:40:33.

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