PDA

Ver la Versión Completa : WM_DEVICECHANGE en un TComponent


NeWNeO
27-05-2004, 16:34:34
Wolaps:

Estoy construyendo un Componente no visual para poder controlar ciertos parámetros de los lectores.

Utilizo el siguiente código:

procedure WMDEVICECHANGE(var msg:tmessage);message WM_DEVICECHANGE;

procedure TWinCDControl.WMDEVICECHANGE(var msg:tmessage);
const
DBT_CONFIG_CHANGED = $0018;
DBT_DEVICE_ARRIVAL = $8000;
DBT_DEVICE_QUERY_REMOVE = $8001;
DBT_DEVICE_QUERY_REMOVE_FAILED = $8002;
DBT_DEVICE_REMOVE_PENDING = $8003;
DBT_DEVICE_REMOVE_COMPLETE = $8004;
DBT_DEVICE_TYPE_SPECIFIC = $8005;
begin
case msg.WParam of
DBT_DEVICE_REMOVE_COMPLETE: OnCDOpen(Self);// Acciones al abrir
DBT_DEVICE_ARRIVAL: OnCDClose(Self);// Evento al cerrar
end;
end;

OnCDOpen y OnCDClose son 2 TNotifyEvent declarados correctamente y funcionan si se les aplica cualquier otra función

Este código utilizado en cualquier aplicación normal funciona a la perfección, pero al introducirlo en mi componente no funciona. ¿Alguien me puede dar una solución para hacer que funcione?

delphi.com.ar
27-05-2004, 16:48:57
Tené en cuenta que ese mensaje solo lo recibirán las controles que tengan un Handle, digamos los que tengan “Ventana”. Si desarrollas un control no-visual una práctica común es crear un handle y apuntar el procedimiento de entrada de mensajes (WndProc) a un método de tu clase.

Saludos!

NeWNeO
27-05-2004, 17:01:58
¿Podrias poner algun ejemplo de como realizar esta tarea?

delphi.com.ar
27-05-2004, 17:04:48
No te puedo poner un ejemplo, pero puedo decirte que puedes utilizar las apis: CreateWindowEx, SetWindowLong y DestroyWindow. O las funciones de la VCL: AllocateHWnd y DeallocateHWnd.

Saludos!

NeWNeO
28-05-2004, 16:29:55
Bien, utilizo el AllocateHWND para crear un handle y recibir los mensajes


Constructor TWinCDControl.Create;
begin
inherited Create(Self);
fHWND := AllocateHWND(WMDEVICECHANGE); // Handle de la "Ventanta"
end;



Siendo WMDEVICECHANGE el proceso encargado de leer el mensaje (anotado en el primer mensaje)

en el destructor hago un DealloateHWND.

Al consultar el handle creado en el componente sale 0 ...¿Cual es la forma correcta de usar el AllocateHWND?

delphi.com.ar
28-05-2004, 17:12:07
Tené en cuenta que en el método WMDEVICECHANGE, entrarán todos los mensajes de la ventana creada, si el mensaje no es del tipo WM_DEVICECHANGE tendrías que dejar que la ventana lo procese (DefWindowProc).
Por otro lado te recomiendo cambiarle el nombre al método por alguno mas estándar como WndProc.

Saludos!