No he tenido esa experiencia con Hooks, pero puede ser que tu app se niegue a terminar la sesión. Para resolverlo tendrás que manejar los mensajes
WM_QUERYENDSESSION y
WM_ENDSESSION
Suelo reescribir la función virtual WndProc del formulario para estos menesteres:
Código:
private:
void __fastcall WndProc(Messages::TMessage &Message);
Código:
void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
switch(Message.Msg){
case WM_QUERYENDSESSION:
Message.Result = 1;
break;
case WM_ENDSESSION:
if(hKeyboardHook) UnhookWindowsHookEx(hKeyboardHook);
if(hMouseHook) UnhookWindowsHookEx(hMouseHook);
break;
}
TForm::WndProc(Message);
}
Pruébalo y nos cuentas.
Saludos.