J'écris une application en C pour le Mac (Leopard) qui a besoin de faire un peu de travail à la réception des notifications de puissance, par ex. sommeil, réveil, arrêt, redémarrage. Il fonctionne via launchd
en tant que launchagent lors de la connexion, puis commence à surveiller les notifications. Le code que je utilise pour ce faire est la suivante:Recevoir des notifications de puissance (en particulier shutdown) sur Mac OSX
/* ask for power notifications */
static void StartPowerNotification(void)
{
static io_connect_t rootPort;
IONotificationPortRef notificationPort;
io_object_t notifier;
rootPort = IORegisterForSystemPower(&rootPort, ¬ificationPort,
PowerCallback, ¬ifier);
if (!rootPort)
exit (1);
CFRunLoopAddSource (CFRunLoopGetCurrent(),
IONotificationPortGetRunLoopSource(notificationPort),
kCFRunLoopDefaultMode);
}
/* perform actions on receipt of power notifications */
void PowerCallback (void *rootPort, io_service_t y,
natural_t msgType, void *msgArgument)
{
switch (msgType)
{
case kIOMessageSystemWillSleep:
/* perform sleep actions */
break;
case kIOMessageSystemHasPoweredOn:
/* perform wakeup actions */
break;
case kIOMessageSystemWillRestart:
/* perform restart actions */
break;
case kIOMessageSystemWillPowerOff:
/* perform shutdown actions */
break;
}
}
Cependant, seuls les deux premiers pour dormir et se réveiller (kIOMessageSystemWillSleep
et kIOMessageSystemHasPoweredOn
) jamais obtenir appelé. Je ne reçois jamais aucune notification pour le redémarrage ou l'arrêt (kIOMessageSystemWillRestart
et kIOMessageSystemWillPowerOff
).
Est-ce que je fais quelque chose de mal? Ou y a-t-il une autre API qui me donnerait les notifications de redémarrage et d'arrêt? Je préférerais le garder comme un programme C (comme c'est ce que je connais) mais je suis ouvert à toutes les suggestions judicieuses d'alternatives (j'ai regardé les hooks de connexion/déconnexion mais ceux-ci semblent être dépréciés en faveur de launchd).
Merci d'avance pour toute aide/conseils!
Merci pour cela! Savez-vous si j'ai besoin d'une icône de fenêtre ou de dock pour recevoir ces notifications? – binarybob
Non, vous ne le faites pas. J'ai ajouté un exemple de code. –
Merci encore Rob, c'est très apprécié. – binarybob