Cuestión : cómo detectar la impulsión desprendible (impulsión de la pluma)


Cómo detectar la impulsión desprendible usar código del vb

Gracias

Respuesta : cómo detectar la impulsión desprendible (impulsión de la pluma)

Usted puede colocar las notificaciones del dispositivo para el dispositivo del USB colocando el guid del usb y comprobando para saber si hay mensaje de WM_DEVICECHANGE. ver la sección del código para una versión del API.

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
' 
'//                   Module1.bas
' 

Opción explícita

'egl1044
Const privado GWL_WNDPROC                como de largo = (- 4)
Const privado WM_DEVICECHANGE            como de largo = &H219
Const privado DBT_DEVICEARRIVAL          como de largo = 32768
Const privado DBT_DEVICEREMOVECOMPLETE   como de largo = 32772
Const privado DBT_DEVTYP_DEVICEINTERFACE como de largo = &H5&
Const privado DBT_DEVTYP_VOLUME          como de largo = &H2&
Const privado GUID_USB                   como secuencia = “{A5DCBF10-6530-11D2-901F-00C04FB951ED}”

Tipo privado UUID
Data1               como de largo
Data2               como número entero
Data3               como número entero
Data4 (7)            como octeto
Tipo del extremo
 
Tipo privado DEV_BROADCAST_HDR
dbch_size           como de largo
dbch_devicetype     como de largo
dbch_reserved       como de largo
Tipo del extremo
 
Tipo privado DEV_BROADCAST_DEVICEINTERFACE
dbcc_size           como de largo
dbcc_devicetype     como de largo
dbcc_reserved       como de largo
dbcc_classguid      como UUID
dbcc_name           como de largo
Tipo del extremo
 
Tipo privado DEV_BROADCAST_VOLUME
dbcv_size           como de largo
dbcv_devicetype     como de largo
dbcv_reserved       como de largo
dbcv_unitmask       como de largo
dbcv_flags          como número entero
Tipo del extremo
 
Privado declarar la liberación “User32.dll” de CallWindowProcW de la función (el _
    lpPrevWndFunc de ByVal como de largo, _
    hWnd de ByVal como de largo, _
    uMsg de ByVal como de largo, _
    wParam de ByVal como de largo, _
    lParam de ByVal como de largo) como de largo
    
Privado declarar la liberación “User32.dll” de SetWindowLongW de la función (el _
    hWnd de ByVal como de largo, _
    nIndex de ByVal como de largo, _
    dwNewLong de ByVal como de largo) como de largo
    
Privado declarar la liberación “User32.dll” de RegisterDeviceNotificationW de la función (el _
    ByVal hRecipient como de largo, _
    ByVal NotificationFilter como de largo, _
    Banderas de ByVal como de largo) como de largo

Privado declarar la liberación “User32.dll” de UnregisterDeviceNotification de la función (el _
    Manija de ByVal como de largo) como de largo

Privado declarar la liberación “Ole32.dll” de CLSIDFromString de la función (el _
    Lpsz de ByVal como de largo, _
    Pclsid de ByRef como UUID) como de largo

Privado declarar la liberación secundaria “Kernel32.dll” de RtlMoveMemory (el _
    Destinación de ByRef como cualesquiera, _
    Fuente de ByRef como cualesquiera, _
    Longitud de ByVal como de largo)
    
Privado declarar la liberación secundaria “Kernel32.dll” de RtlZeroMemory (el _
    Dst de ByRef como cualesquiera, _
    nBytes de ByVal como de largo)
 

Funcional público         como de largo
hDev público         como de largo
hWindow público      como de largo

Lpdb dévil            como DEV_BROADCAST_HDR
Lpdbv dévil           como DEV_BROADCAST_VOLUME
Lpdbdi dévil          como DEV_BROADCAST_DEVICEINTERFACE
fUsb dévil            como boleano

Función privada GetDriveFromMask (ByVal UnitMask como de largo) como secuencia
    GetDriveFromMask = Chr$ (65 + (registro ()/registro de UnitMask (2)))
Función del final
 
RegisterDeviceInterfaceToHwnd secundario público (hWnd de ByVal como de largo)
    Lpdbd dévil       como DEV_BROADCAST_DEVICEINTERFACE
    Lpusb dévil       como UUID
    Si 0 <> funcional entonces
        Salir el submarino
    Terminar si
    hWindow = hWnd
    CLSIDFromString StrPtr (GUID_USB), lpusb
    lpdbd.dbcc_size = Len (lpdbd)
    lpdbd.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE
    lpdbd.dbcc_classguid = lpusb
    hDev = RegisterDeviceNotificationW (hWindow, VarPtr (lpdbd), 0)
    funcional = SetWindowLongW (hWindow, GWL_WNDPROC, AddressOf OnUsbChange)
Submarino del extremo
 
UnRegisterDeviceInterface secundario público ()
    hDev de UnregisterDeviceNotification
    funcional = SetWindowLongW (hWindow, GWL_WNDPROC, funcionales)
    = 0 funcional
    hWindow = 0
Submarino del extremo
 
Función pública OnUsbChange (hWnd de ByVal como uMsg de largo, de ByVal como wParam de largo, de ByVal como lParam de largo, de ByVal como de largo) como de largo

    Si uMsg = WM_DEVICECHANGE después
    
        Seleccionar el wParam del caso
        
            Encajonar DBT_DEVICEARRIVAL
                Lpdb de RtlMoveMemory, lParam& de ByVal, Len (lpdb)
                
                Si lpdb.dbch_devicetype = DBT_DEVTYP_DEVICEINTERFACE después
                    Lpdbdi de RtlMoveMemory, lParam& de ByVal, Len (lpdbdi)
                    el fUsb = verdad
                Terminar si
                
                Si lpdb.dbch_devicetype = DBT_DEVTYP_VOLUME y fUsb después
                    Lpdbv de RtlMoveMemory, lParam& de ByVal, Len (lpdbv)
                    fUsb = falso
                    '                       Insertado
                    Debug.Print “insertó @ el drive=” y GetDriveFromMask (lpdbv.dbcv_unitmask)
                Terminar si
                
            Encajonar DBT_DEVICEREMOVECOMPLETE
                Lpdb de RtlMoveMemory, lParam& de ByVal, Len (lpdb)
                
                Si lpdb.dbch_devicetype = DBT_DEVTYP_DEVICEINTERFACE después
                    Lpdbdi de RtlMoveMemory, lParam& de ByVal, Len (lpdbdi)
                     el fUsb = verdad
                Terminar si
                
                Si lpdb.dbch_devicetype = DBT_DEVTYP_VOLUME y fUsb después
                    Lpdbv de RtlMoveMemory, lParam& de ByVal, Len (lpdbv)
                    fUsb = falso
                    '                       Quitado
                    Debug.Print “quitó @ el drive=” y GetDriveFromMask (lpdbv.dbcv_unitmask)
                Terminar si
                
        Terminar selecto
    Terminar si
    OnUsbChange = CallWindowProcW (funcional, hWnd, uMsg, wParam, lParam)
Función del final








'
'//              Form1.frm
'

Opción explícita

Form_Load secundario privado ()
    Llamada RegisterDeviceInterfaceToHwnd (Me.hWnd)
Submarino del extremo
 
Form_QueryUnload secundario privado (cancelación como número entero, UnloadMode como número entero)
    Llamada UnRegisterDeviceInterface
Submarino del extremo
Otras soluciones  
 
programming4us programming4us