| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
pampa Lt JG

Registrado: 16 Jun 2004Mensajes: 58Ubicación: Mar del Plata - Argentina
|
Publicado: Mie 23 Mar, 2005 11:15 pm Asunto: detección de dispositivos |
|
|
Estimados: necesito generar un código para detectar la DESCONEXIÓN de dispositvos (tales como mouse, webcam) ; en fin el código lo que haría es dar aviso que se desconectó el dispositivo X. No estoy pidiendo que alguien haga el código sino que me orienten como capturar los eventos que genera Windows al respecto...
Gracias. |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Jue 24 Mar, 2005 5:36 am Asunto: |
|
|
Para detectar los cambios dentro de los dispositivos, es necesario capturar el mensaje de windows WM_DEVICECHANGE
en este link, viene la sintaxis, y los eventos que se generan, al conectar desconectar,
http://dietmonday.com/windows/WinDoc/msdn/sdk/platforms/doc/sdk/win32/mess/src/msg23_17.htm
haciendo algo rapido y como dice la url anterior, un ejemplo seria, el siguiente, la notificacion, la pongo, dentro del caption, del form, o si te parece bien, dentro de un memo..
inserta un TMemo dentro de un Form Nuevo y pegas este codigo, dentro del archivo .H del proyecto..
| Código: | //---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TMemo *Memo1;
private: // User declarations
void __fastcall WMCambioDispositivo(TMessage &msg)
{
Caption = msg.WParam; // muestra el valor
Memo1->Lines->Add((AnsiString)msg.WParam); // muestra los valores
}
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DEVICECHANGE,TMessage,WMCambioDispositivo);
END_MESSAGE_MAP(TForm)
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif |
es algo sencillo, pero puede ayudarte, esto lo estuve haciendo, para detectar, el estado de la tarjeta de red, pero para ello, existe una propiedad, dentro del windows 2000,nt xp, denominada MEDIA SENSE, en relativa, pude detectar los cambios cuando quitan la tarjeta de red, pero nunca pude detectar, cuando esta contenia tramas, bajas, que es cuando sale el dichoso mensaje "cable de red, desconectado",
asi mismo, dentro de la ayuda de Microsoft, viene mas detallado
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/wm_devicechange.asp
saludos... _________________
 |
|
| Volver arriba |
|
 |
pampa Lt JG

Registrado: 16 Jun 2004Mensajes: 58Ubicación: Mar del Plata - Argentina
|
Publicado: Sab 26 Mar, 2005 2:54 pm Asunto: |
|
|
Muy amable, ya lo he probado y detecta la conexión y desconexión (al menos probé con la impresora) ahora me pondré a investigar como desgloso la info que dispara para saber a que dispositivo se refiere...
Gracias. |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Lun 28 Mar, 2005 8:36 am Asunto: |
|
|
Una forma de hacerlo seria usar la siguiente funcion,
| Código: |
void __fastcall TForm1::WMCambioEnDispositivo(TMessage &msg)
{
UINT i;
DEV_BROADCAST_HDR *pdbch = (DEV_BROADCAST_HDR *) (msg.LParam);
switch(msg.WParam) // verificamos el tipo de evento
{
case DBT_DEVICEARRIVAL: // se instala
if (pdbch->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME pdbcv = (PDEV_BROADCAST_VOLUME) msg.LParam;
if (pdbcv->dbcv_flags == DBTF_MEDIA)
{
TCHAR szDrive[4];
// pdbcv->unitmask contains the drive bits
for (i=0; !(pdbcv->dbcv_unitmask & (1<<i)); i++);
wsprintf(szDrive, ("%c:\\"), 'A'+i);
if (GetDriveType(szDrive) == DRIVE_CDROM) {
ShowMessage("cd cerrado");
}
ShowMessage(szDrive);
}
if (pdbcv->dbcv_flags == DBTF_NET)
{
//detecta si es se inserto una unidad de red
}
}
if (pdbch->dbch_devicetype == DBT_DEVTYP_PORT) // detecta los puertos lpt y com
{
PDEV_BROADCAST_PORT pdbcv = (PDEV_BROADCAST_PORT) msg.LParam;
ShowMessage("se inserto el puerto "+AnsiString(pdbcv->dbcp_name));
}
break;
case DBT_DEVICEREMOVECOMPLETE: // CD drawer was opened
break;
}
}
|
y el codigo para llamarla seria el siguiente.
| Código: |
private: // User declarations
void __fastcall TForm1::WMCambioEnDispositivo(TMessage &msg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DEVICECHANGE,TMessage,WMCambioEnDispositivo);
END_MESSAGE_MAP(inherited) |
_________________
 |
|
| Volver arriba |
|
 |
ElCangri Cdt

Registrado: 20 May 2005Mensajes: 19Ubicación: bolivia
|
Publicado: Mie 19 Oct, 2005 3:53 pm Asunto: deteccion de cambio hardware |
|
|
cesar probe con tu primer codigo y me resulto muy bien, ahora tengo problemas con el codigo donde se detecta el tipo de dispositivo, la verdad me salen unos cuantos errores, lo que quiero es que me indiques por favor donde implementar el codigo en la unit1.cpp o en la unit1.h..
espero tus repuestas...saludos a todos.... _________________ Retroceder Nunca....Rendirse Jamas!!!! |
|
| Volver arriba |
|
 |
ElCangri Cdt

Registrado: 20 May 2005Mensajes: 19Ubicación: bolivia
|
Publicado: Lun 14 Nov, 2005 2:57 pm Asunto: ayudaaaaa |
|
|
hola cesar estoy intentando hacer compilar este codigo y no se en que estoy fallando me salen errores ayudaaa ya no se que hacer.
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
public: // User declarations
void __fastcall TForm1::WMCambioEnDispositivo(TMessage &msg)
{
UINT i;
DEV_BROADCAST_HDR *pdbch = (DEV_BROADCAST_HDR *) (msg.LParam);
switch(msg.WParam) // verificamos el tipo de evento
{
case DBT_DEVICEARRIVAL: // se instala
if (pdbch->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME pdbcv = (PDEV_BROADCAST_VOLUME) msg.LParam;
if (pdbcv->dbcv_flags == DBTF_MEDIA)
{
TCHAR szDrive[4];
// pdbcv->unitmask contains the drive bits
for (i=0; !(pdbcv->dbcv_unitmask & (1<<i)); i++);
wsprintf(szDrive, ("%c:\\"), 'A'+i);
if (GetDriveType(szDrive) == DRIVE_CDROM) {
ShowMessage("cd cerrado");
}
ShowMessage(szDrive);
}
if (pdbcv->dbcv_flags == DBTF_NET)
{
//detecta si es se inserto una unidad de red
}
}
if (pdbch->dbch_devicetype == DBT_DEVTYP_PORT) // detecta los puertos lpt y com
{
PDEV_BROADCAST_PORT pdbcv = (PDEV_BROADCAST_PORT) msg.LParam;
ShowMessage("se inserto el puerto "+AnsiString(pdbcv->dbcp_name));
}
break;
case DBT_DEVICEREMOVECOMPLETE: // CD drawer was opened
break;
}
}
private: // User declarations
void __fastcall TForm1::WMCambioEnDispositivo(TMessage &msg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DEVICECHANGE,TMessage,WMCambioEnDispositivo);
END_MESSAGE_MAP(inherited)
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Me salen los siguientes errores cesar vale dame una mano.
1.-[C++ Error] Unit1.h(53): E2238 Multiple declaration for '_fastcall TForm1::WMCambioEnDispositivo(TMessage &)'
2.-[C++ Error] Unit1.h(15): E2344 Earlier declaration of '_fastcall TForm1::WMCambioEnDispositivo(TMessage &)'
3.-[C++ Error] Unit1.h(1 : E2451 Undefined symbol 'DEV_BROADCAST_HDR'
4.-[C++ Error] Unit1.h(1 : E2451 Undefined symbol 'pdbch'
5.-[C++ Error] Unit1.h(1 : E2188 Expression syntax
6.-[C++ Error] Unit1.h(21): E2451 Undefined symbol 'DBT_DEVICEARRIVAL'
7.-[C++ Error] Unit1.h(22): E2451 Undefined symbol 'DBT_DEVTYP_VOLUME'
8.-[C++ Error] Unit1.h(24): E2451 Undefined symbol 'PDEV_BROADCAST_VOLUME'
9.-[C++ Error] Unit1.h(43): E2379 Statement missing ;
10.-[C++ Error] Unit1.h(4 : E2451 Undefined symbol 'DBT_DEVICEREMOVECOMPLETE'
11.-[C++ Error] Unit1.h(4 : E2172 Duplicate case _________________ Retroceder Nunca....Rendirse Jamas!!!! |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Lun 14 Nov, 2005 4:26 pm Asunto: |
|
|
tu codigo debe quedar asi
Archivo .h
| Código: | //---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes>
#include <Controls>
#include <StdCtrls>
#include <Forms>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
public: // User declarations
private: // User declarations
void __fastcall TForm1::WMCambioEnDispositivo(TMessage &msg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DEVICECHANGE,TMessage,WMCambioEnDispositivo);
END_MESSAGE_MAP(inherited)
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif |
Archivo .cpp
inserta tambien este archivo de cabecera en el archivo.cpp
| Código: |
#pragma hdrstop
#include <dbt>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WMCambioEnDispositivo(TMessage &msg)
{
UINT i;
DEV_BROADCAST_HDR *pdbch = (DEV_BROADCAST_HDR *) (msg.LParam);
switch(msg.WParam) // verificamos el tipo de evento
{
case DBT_DEVICEARRIVAL: // se instala
if (pdbch->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME pdbcv = (PDEV_BROADCAST_VOLUME) msg.LParam;
if (pdbcv->dbcv_flags == DBTF_MEDIA)
{
TCHAR szDrive[4];
// pdbcv->unitmask contains the drive bits
for (i=0; !(pdbcv->dbcv_unitmask & (1<<i>dbcv_flags == DBTF_NET)
{
//detecta si es se inserto una unidad de red
}
}
if (pdbch->dbch_devicetype == DBT_DEVTYP_PORT) // detecta los puertos lpt y com
{
PDEV_BROADCAST_PORT pdbcv = (PDEV_BROADCAST_PORT) msg.LParam;
ShowMessage("se inserto el puerto "+AnsiString(pdbcv->dbcp_name));
}
break;
case DBT_DEVICEREMOVECOMPLETE: // CD drawer was opened
break;
}
} |
_________________

Ultima edición por Cesar C. Salazar Gonzalez el Mar 23 Sep, 2008 6:01 pm, editado 1 vez |
|
| Volver arriba |
|
 |
likibuay Master


Registrado: 24 Abr 2006Mensajes: 190Ubicación: COLOMBIA
|
Publicado: Vie 15 Jun, 2007 3:45 am Asunto: |
|
|
Cesar..... salu2
el código ya visto esta realizado en q versión del builder... ?
ya q lo intente compilar en builder 6 y me salieron muchos errores...
gracias de antemano. _________________ ><(((((º> From °l||l° §ÂN ÅNЮ€$ i§Lã$ °l||l°
_____________________ |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 15 Jun, 2007 3:50 am Asunto: |
|
|
El código es para BCB60, lo he recompilado y ha trabajado sin ningun problema, tambie lo compile en BDS2006 y ha corrido perfecto.
puedes poner la lista de errores que te marca para verificar si alguna cabecera te esta causando problemas?
Saludos... _________________

Ultima edición por Cesar C. Salazar Gonzalez el Vie 15 Jun, 2007 7:58 pm, editado 1 vez |
|
| Volver arriba |
|
 |
likibuay Master


Registrado: 24 Abr 2006Mensajes: 190Ubicación: COLOMBIA
|
Publicado: Vie 15 Jun, 2007 5:37 pm Asunto: |
|
|
buenos dias..
Gracias por contestar.. aqui te muestro los errores que me salen..
| Código: | [C++ Error] dbt.h(209): E2303 Type name expected
[C++ Error] dbt.h(209): E2139 Declaration missing ;
[C++ Error] dbt.h(210): E2303 Type name expected
[C++ Error] dbt.h(210): E2238 Multiple declaration for '_DEV_BROADCAST_HDR::DWORD'
[C++ Error] dbt.h(209): E2344 Earlier declaration of '_DEV_BROADCAST_HDR::DWORD'
[C++ Error] dbt.h(210): E2139 Declaration missing ;
[C++ Error] dbt.h(211): E2303 Type name expected
[C++ Error] dbt.h(211): E2238 Multiple declaration for '_DEV_BROADCAST_HDR::DWORD'
[C++ Error] dbt.h(210): E2344 Earlier declaration of '_DEV_BROADCAST_HDR::DWORD'
[C++ Error] dbt.h(211): E2139 Declaration missing ;
[C++ Error] dbt.h(215): E2257 , expected
[C++ Error] dbt.h(225): E2303 Type name expected
[C++ Error] dbt.h(225): E2139 Declaration missing ;
[C++ Error] dbt.h(226): E2303 Type name expected
[C++ Error] dbt.h(226): E2139 Declaration missing ;
[C++ Error] dbt.h(227): E2303 Type name expected
[C++ Error] dbt.h(227): E2238 Multiple declaration for 'VolLockBroadcast::BYTE'
[C++ Error] dbt.h(226): E2344 Earlier declaration of 'VolLockBroadcast::BYTE'
[C++ Error] dbt.h(227): E2139 Declaration missing ;
[C++ Error] dbt.h(228): E2303 Type name expected
[C++ Error] dbt.h(228): E2238 Multiple declaration for 'VolLockBroadcast::BYTE'
[C++ Error] dbt.h(227): E2344 Earlier declaration of 'VolLockBroadcast::BYTE'
[C++ Error] dbt.h(228): E2139 Declaration missing ;
[C++ Error] dbt.h(229): E2303 Type name expected
[C++ Error] dbt.h(229): E2238 Multiple declaration for 'VolLockBroadcast::BYTE'
[C++ Error] dbt.h(229): E2228 Too many error or warning messages |
me salen este pedazo de código...
| Código: | struct _DEV_BROADCAST_HDR { /* */
DWORD dbch_size; // <<<<<<<<<<<<aqui
DWORD dbch_devicetype; // <<<<<<<<<<<<aqui
DWORD dbch_reserved; // <<<<<<<<<<<<aqui
}; |
gracias....nuevamente
coloco todo lo q me dices mas arriba pero nada... _________________ ><(((((º> From °l||l° §ÂN ÅNЮ€$ i§Lã$ °l||l°
_____________________ |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 15 Jun, 2007 7:57 pm Asunto: |
|
|
si has incluido el archivo de cabecera
no veo la razon de tu error, a menos que estes usando "otras" cabeceras donde se haga relacion con el cambio de dispositivos, para no aumentar mas este post, pon la lista de tus cabeceras en el mensaje de arriba y vemos que cabeceras te esta causando conflicto.
Saludos _________________

Ultima edición por Cesar C. Salazar Gonzalez el Sab 16 Jun, 2007 10:41 pm, editado 1 vez |
|
| Volver arriba |
|
 |
likibuay Master


Registrado: 24 Abr 2006Mensajes: 190Ubicación: COLOMBIA
|
Publicado: Sab 16 Jun, 2007 3:59 am Asunto: |
|
|
Cesar.... gracias.... ya me funciona.. cambie el #include <dbt> por el #include <Dbt> y funciona perfectamente... _________________ ><(((((º> From °l||l° §ÂN ÅNЮ€$ i§Lã$ °l||l°
_____________________ |
|
| Volver arriba |
|
 |
likibuay Master


Registrado: 24 Abr 2006Mensajes: 190Ubicación: COLOMBIA
|
Publicado: Sab 16 Jun, 2007 4:00 am Asunto: |
|
|
| likibuay escribió: | | César.... gracias.... ya me funciona.. cambie el #include <dbt> por el #include <Dbt> y funciona perfectamente... |
_________________ ><(((((º> From °l||l° §ÂN ÅNЮ€$ i§Lã$ °l||l°
_____________________ |
|
| Volver arriba |
|
 |
|