Вы можете использовать правило с регулярным выражением, которое использует функцию группы сброса ветвей PCRE :
RewriteRule ^(?|([a-z]{2})|(?:([a-z]{2})/)?.*?([\w-]+))/?$ index.php?a=$1&b=$2 [L,QSA]
У меня есть проверено в моем Apache, и это работает довольно хорошо. Обязательно прокомментируйте все остальные правила при тестировании.
Можно использовать объект приложения WPF и подписаться на его событие SessionEnding. Можно затем посмотреть на SessionEndingCancelEventArgs. Перечисление ReasonSessionEnding для определения точно, почему сессия заканчивается (LogOff или Завершение работы).
То, на что можно хотеть посмотреть, здесь - Изменения Завершения работы Приложения в Windows Vista. В основном, поскольку, что Вы хотите, все это вращается вокруг WM_QUERYENDSESSION.
Обратите внимание, что это выставляется в платформе .NET - вместо этого необходимо будет использовать собственные функции (p/invoke) и сцепить wndproc в коде для ответа на сообщение окон.
Для примера (показывая причину не завершить работу), Вы видите Windows Vista - ShutdownBlockReasonCreate в C#.
События SessionEnding / SessionEnded на Microsoft. Win32. SystemEvents мог бы быть тем, что Вы ищете.
Используйте событие
Приложение. SessionEnding для WPF.