PDA

Ver la Versión Completa : SendMessage no me funciona


gluglu
08-10-2007, 17:35:55
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 :

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 :
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:

if Assigned(WakeUp1) then begin
WakeUp1.Free;
WakeUp1 := nil;
end;


Yo lo haría así (si lo se, soy un quisquilloso :p ):

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 :
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
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:

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 !