Tengo un problema con este hook (lo hago asi por no hacer un polling constante con ::GetForegroundWindow() )
El tema es que por mas que detecta cuando hago el cambio de ventana, no puedo obtener el titulo de la misma..
Posteo a continuacion el codigo de como puse la funcion:
Código:
HWINEVENTHOOK ventanas = FuncionSetWinEventHook(EVENT_SYSTEM_FOREGROUND,EVENT_SYSTEM_FOREGROUND,
NULL,FuncionHookVentanas,0,0,WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
Y aca el codigo de la funcion en la DLL:
Código:
extern "C" __declspec(dllexport) void RegistrarCambiosDeVentana
(HWINEVENTHOOK hWinEventHook, DWORD dwEvento, HWND ventana, LONG idObjeto, LONG idDescendiente, DWORD dwEventThread, DWORD dwMsEventTime)
{
if (idObjeto != OBJID_WINDOW || idDescendiente != 0) {
return;
}
//if (ventana == NULL) return;
ventana = GetForegroundWindow();
int error = GetLastError();
if (error == 0) {
char strError[15] = { 0 } ;
_itoa_s(error,strError,10);
MessageBoxA(NULL,strError,"DLL",MB_OK);
}
char * strventana = (char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,GetWindowTextLengthA(ventana)*sizeof(char)+1);
GetWindowTextA(ventana,strventana,strlen(strventana)+1);
MessageBoxA(NULL,strventana,"DLL",MB_OK);
HeapFree(GetProcessHeap(),HEAP_ZERO_MEMORY,strventana);
}
He probado todo, poniendo todas las combinaciones de INCONTEXT y OUTOFCONTEXT, junto con pasarle o no pasarle el handle de la DLL..
Algo mas debo estar haciendo mal porque en si, no entiendo la vuelta de por que no me obtiene el titulo de la ventana que pasa al foreground..
Saludos!
PD: El codigo de error que me retorna es 0 (o sea, operacion completada exitosamente, que ironico no? y el parametro que viene desde el sistema tampoco me sirve de nada para sacar el titulo de la ventana, esa es otra cosa que probé..)