Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

detección de dispositivos

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: detección de dispositivos Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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...
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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)

_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: deteccion de cambio hardware Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Yahoo Messenger MSN Messenger
Mensaje    Asunto: ayudaaaaa Responder citando

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(1Cool: E2451 Undefined symbol 'DEV_BROADCAST_HDR'
4.-[C++ Error] Unit1.h(1Cool: E2451 Undefined symbol 'pdbch'
5.-[C++ Error] Unit1.h(1Cool: 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(4Cool: E2451 Undefined symbol 'DBT_DEVICEREMOVECOMPLETE'
11.-[C++ Error] Unit1.h(4Cool: E2172 Duplicate case
_________________
Retroceder Nunca....Rendirse Jamas!!!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Yahoo Messenger MSN Messenger
Mensaje    Asunto: Responder citando

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:
#include <Dbt>



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;
}
}

_________________
Cool


Ultima edición por Cesar C. Salazar Gonzalez el Mar 23 Sep, 2008 6:01 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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...
_________________
Cool


Ultima edición por Cesar C. Salazar Gonzalez el Vie 15 Jun, 2007 7:58 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

si has incluido el archivo de cabecera
Código:
#include <Dbt.h>

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
_________________
Cool


Ultima edición por Cesar C. Salazar Gonzalez el Sab 16 Jun, 2007 10:41 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.