![]() |
WM_DEVICECHANGE en un TComponent
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? |
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! |
¿Ejemplo?
¿Podrias poner algun ejemplo de como realizar esta tarea?
|
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! |
AllocateHWND
Bien, utilizo el AllocateHWND para crear un handle y recibir los mensajes
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? |
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! |
La franja horaria es GMT +2. Ahora son las 07:08:11. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi