В случае более нормальных ОС см. в сторону

В случае более нормальных ОС см. в сторону обработчиков ACPI.
Для линуха - читаем /proc/acpi/event до посинения, и обрабатываем эти самые события (приходящие в виде строк текста). Пример реализации - acpid - в нем есть обратотчик для power button. Для BSD5 тож был схожий интерфейс.