|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
[Win32] Intercettare evento connessione USB
Volendo da software evitare l'utilizzo delle porte USB su un computer con WinXP come si può fare?
Nella documentazione di SetWindowsHookEx non ho trovato niente che possa riguardare l'argomento. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 5206
|
Quote:
Il messaggio WM_DEVICECHANGE viene inviato alle finestre quando avviene qualche cambiamento nell'hardware.
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%) Java Versions Cheat Sheet |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 5206
|
Esempio completo:
Codice:
#define STRICT
#include <windows.h>
#include <Dbt.h>
#define MAIN_WNDCLASS "MiaClasseFinestra"
LRESULT CALLBACK Main_WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
return 0;
case WM_DESTROY:
PostQuitMessage (0);
return 0;
case WM_CLOSE:
DestroyWindow (hWnd);
return 0;
case WM_DEVICECHANGE:
if (wParam == DBT_DEVICEARRIVAL)
{
PDEV_BROADCAST_HDR phdr = (PDEV_BROADCAST_HDR) lParam;
if (phdr->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME pvol = (PDEV_BROADCAST_VOLUME) phdr;
CHAR szMsg[80];
int mask = 1;
int n;
for (n = 0; n < 26; n++, mask<<=1)
{
if (pvol->dbcv_unitmask & mask)
{
wsprintf (szMsg, "E` arrivato il volume %c:", 'A' + n);
MessageBox (NULL, szMsg, "Arrivo device", MB_OK | MB_ICONINFORMATION);
}
}
}
}
return 0;
}
return DefWindowProc (hWnd, uMsg, wParam, lParam);
}
INT APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevious, LPSTR lpszCmdLine, INT iCmdShow)
{
WNDCLASSEX wcx;
HWND hWnd;
MSG msg;
wcx.cbSize = sizeof (wcx);
wcx.style = CS_HREDRAW | CS_VREDRAW;
wcx.lpfnWndProc = (WNDPROC) Main_WndProc;
wcx.cbClsExtra = 0;
wcx.cbWndExtra = 0;
wcx.hInstance = hInstance;
wcx.hIcon = NULL;
wcx.hIconSm = NULL;
wcx.hCursor = LoadCursor (NULL, IDC_ARROW);
wcx.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
wcx.lpszMenuName = NULL;
wcx.lpszClassName = MAIN_WNDCLASS;
if (!RegisterClassEx (&wcx))
{
MessageBox (NULL, "Errore nella registrazione della classe",
"ERRORE", MB_OK | MB_ICONEXCLAMATION);
return 1;
}
hWnd = CreateWindow (MAIN_WNDCLASS, "Test WM_DEVICECHANGE", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, 300, 300,
NULL, NULL, hInstance, NULL);
if (hWnd == NULL)
{
MessageBox (NULL, "Errore nella creazione della finestra",
"ERRORE", MB_OK | MB_ICONEXCLAMATION);
return 1;
}
ShowWindow (hWnd, SW_SHOWNORMAL);
UpdateWindow (hWnd);
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return 0;
}
E` arrivato il volume Q:
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%) Java Versions Cheat Sheet |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Se non ho capito male il codice, in questo modo intercetti la notifica dell'avvenuta connessione.
In ogni caso sulle risorse del computer mi ritrovo la penna installata, dovrei in qualche modo evitare l'accesso al disco. |
|
|
|
|
|
#5 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
non saprei, dovrei cercare su MSDN. se invece vuoi proprio evitare che la periferica venga installata allora penso sia impossibile a meno che non ci lavori in kernel mode. |
|
|
|
|
|
|
#6 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
|
|
|
|
|
|
#7 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
@andbin: il tuo codice si scorda di deregistrare la window class all'uscita
EDIT: ed inoltre fai una ShowWindow ignorando il parametro di show passato alla WinMain |
|
|
|
|
|
#8 | ||
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 5206
|
Quote:
"All window classes that an application registers are unregistered when it terminates." Quello che deduco io (spero in modo corretto) è quindi: quando una applicazione termina vengono de-registrate comunque tutte le classi. Quote:
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%) Java Versions Cheat Sheet |
||
|
|
|
|
|
#9 | ||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Quote:
ti sembrerà strano ma io non me ne sbatto mai
|
||
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Dec 2001
Messaggi: 217
|
Ciao a tutti
Mi collego a questo post perché volevo utilizzare il codice proposto in quanto vorrei che all'inserimento della chiavetta USB, un programma già residente in memoria eseguisse un'altra applicazione e si chiudesse Quindi pensavo a qualcosa che potessi mettere nell'esecuzione automatica tipo rileva.exe -c cmd /c bla.exe dove -c chiude rileva.exe e cmd è il programma che viene eseguito con i suoi parametri.. Potrebbe fare il programma suggerito, il codice.. (è fatto in c?) a caso mio? Manuel |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:08.




















