Tema destacado: Deseas probar algunas mejoras a la interfaz del foro? Prueba cake! acerca de
Autor
|
Tema: intentando hacer hook a USB (Leído 2,771 veces)
|
|
Zzombi
|
hola a todos. resulta que estoy intentando intervenir el mensaje WM_DEVICECHANGE (que tengo entendido que es el que necesito) pero cuando conecto algun dispositivo no me sale nada  bueno hice un codigo bastante sencillo para probar. HHOOK hook = NULL; HINSTANCE hInst2; LRESULT CALLBACK GetMsgProc(UINT nCode, WPARAM wParam, LPARAM lParam) { LPMSG msg = (LPMSG)lParam; if(msg->message == WM_DEVICECHANGE ) { MessageBox(0,"dispositivo","dispositivo",0); } return CallNextHookEx(hook, nCode, wParam, lParam); } DLLIMPORT BOOL setHook(HWND hWnd) { hook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgProc,hInst2,0); if(hook == NULL) MessageBox(0,"fallo","fallo",0); return TRUE; } lo que no estoy seguro si es que se instala el tipo de hook WH_GETMESSAGE.. o definitivamente esta todo mal  en realidad no se  ojala alguien me pueda orientar un poco... estoy un poco perdido 
|
|
|
|
|
En línea
|
|
|
|
[L]ord [R]NA
Desconectado
Mensajes: 1.507
El Dictador y Verdugo de H-Sec
|
Nunca lo he usado pero soy de los que opta por hacer un loop, debido a que despues de entrar el dispositivo podrian buscar y eliminar luego tendrias que esperar nuevamente a que se introduzca un dispositivo
|
|
|
|
|
En línea
|
|
|
|
|
Zzombi
|
si también lo he hecho con un loop pero quiero aprender hacerlo con hooks 
|
|
|
|
|
En línea
|
|
|
|
|
|
|
Karcrack
|
Fijate en este codigo en VB:Public Sub HookForm(hwnd As Long) PrevProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc) End Sub Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam) If uMsg = WM_DEVICECHANGE Then If wParam = DBT_DEVICEARRIVAL Then Dim dev As DEV_BROADCAST_HDR CopyMemory dev, ByVal lParam, 12 If dev.dbch_devicetype = DBT_DEVTYP_VOLUME Then MsgBox USBConected End If ElseIf wParam = DBT_DEVICEREMOVECOMPLETE Then AllLocalDrives End If End If End Function Las diferencias que veo son que tu no Subclassificas tu ventana de la misma forma, prueba a hacerlo con SetWindowLong, tendras que cambiar el CallBack...
 si es por curiosidad hazlo... Ademas de 'curiosidad' es mas optimo usar un Hook que un loop...
|
|
|
|
« Última modificación: 7 Febrero 2010, 13:27 por Karcrack »
|
En línea
|
|
|
|
|
Zzombi
|
gracias Karcrack la verdad que nunca he usado SetWindowLong... pero hay vere que me sale 
|
|
|
|
|
En línea
|
|
|
|
|
Zzombi
|
sigue sin resultar... y esta vez en hook no se instala  SetWindowLong lanza error LONG hook; HINSTANCE hInst2; LRESULT WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam){ if (uMsg == WM_DEVICECHANGE) { MessageBox(0,"dispositivo","dispositivo",0); } else MessageBox(0,"otro mensaje","otro mensaje",0); return DefWindowProc(hwnd, uMsg, wParam, lParam); } DLLIMPORT BOOL setHook(HWND hWnd) { hook = SetWindowLong(hWnd,GWL_WNDPROC,(LONG)WindowProc); if(hook == 0){ MessageBox(0,"fallo","fallo",0); printf("%d",GetLastError()); } return TRUE; }
|
|
|
|
|
En línea
|
|
|
|
|
Karcrack
|
Que HWND le estas pasando? Deberias crear una ventan con CreateWindowEx para el subclass..
|
|
|
|
|
En línea
|
|
|
|
|
Zzombi
|
le paso el hwnd de la consola
setHook(GetForegroundWindow());
porque se debería crear una ventana?
|
|
|
|
|
En línea
|
|
|
|
|
Karcrack
|
le paso el hwnd de la consola
setHook(GetForegroundWindow());
porque se debería crear una ventana?
Prueba creando una nueva ventana 
|
|
|
|
|
En línea
|
|
|
|
|
Zzombi
|
le paso el hwnd de la consola
setHook(GetForegroundWindow());
porque se debería crear una ventana?
Prueba creando una nueva ventana  y si le paso el hwnd de otra ventana (como la del msn  )  es que es mucho codigo crear otra ventana 
|
|
|
|
|
En línea
|
|
|
|
|
Karcrack
|
y si le paso el hwnd de otra ventana (como la del msn  )  es que es mucho codigo crear otra ventana  Mucho codigo? Es una linea 
|
|
|
|
|
En línea
|
|
|
|
|
Zzombi
|
y si le paso el hwnd de otra ventana (como la del msn  )  es que es mucho codigo crear otra ventana  Mucho codigo? Es una linea   pero hay harto codigo en llenar WNDCLASSEX peor me resulto  tenias razón era eso pero ahora que me resulto me gustaria saber porque hay que pasarle el hwnd de una ventana que yo creo  solo te pido que me respondas eso último Karcrack (por que intente pasarle el hwnd de msn y no funciono  ) no manejo mucho el tema de las ventanas
|
|
|
|
« Última modificación: 7 Febrero 2010, 21:18 por Zzombi »
|
En línea
|
|
|
|
|
Karcrack
|
 pero hay harto codigo en llenar WNDCLASSEX peor me resulto  tenias razón era eso pero ahora que me resulto me gustaria saber porque hay que pasarle el hwnd de una ventana que yo creo  solo te pido que me respondas eso último Karcrack (por que intente pasarle el hwnd de msn y no funciono  ) no manejo mucho el tema de las ventanas Porque la ventana no pertenece a tu proceso. Solo tienes que llamara a CreateWindowEx tal que asi: HWND CreateWindowEx( DWORD dwExStyle, = 0 LPCTSTR lpClassName, = "STATIC" LPCTSTR lpWindowName, = NULL DWORD dwStyle, = 0 int x, = 0 int y, = 0 int nWidth, = 0 int nHeight, = 0 HWND hWndParent, = 0 HMENU hMenu, = 0 HINSTANCE hInstance, = GetModuleHandle(NULL) LPVOID lpParam = 0 ); Te devuelve el HWND de la ventan que recibira los mensajes.
|
|
|
|
|
En línea
|
|
|
|
|
Zzombi
|
jeje gracias por contestar Sr.Karcrack
|
|
|
|
|
En línea
|
|
|
|
|
|