Eternal_Shield, огромное спасибо
Рано обрадовался...
WM_WTSSESSION_CHANGE с lParam равным WTS_SESSION_LOCK действительно проходит при подаче заявки на смену пользователя. На ХР. На семерке этого сообщения не проходит ни с каким lParam вообще. вопрос пока открыт. тотальный мониторинг сообщений, после отсечения сообщений, которые точно не участвуют в "недовыходе" из системы - дает нуль. Хуки дают реакцию антивируса, да и предубеждения у меня к глобальным хукам, а локальный так-же не дал результата.
P.S. Нашел WTSUnRegisterSessionNotificationEx, на семерке сообщение WM_WTSSESSION_CHANGE проходит. Но только если на экране, который после комбинации клавиш Ctrl+Alt+Del нажать кнопку "Сменить пароль" или "Сменить Пользователя"
Беда, блин, с этой семеркой. и это с учетом того, что пользователей ХР все меньше и меньше, а задачки от мелкомягких в новых системах - все сложнее и сложнее..
В общем, кому интересно решение этой задачи - относительно надежно получилось так:
Код: aEvent := OpenEvent(SYNCHRONIZE, False, 'WinSta0_DesktopSwitch');
if aEvent <> 0 then
begin
try
if WaitForSingleObject(aEvent, 10000) = WAIT_OBJECT_0 then
// тут наше действие
finally
CloseHandle(aEvent);
end;
end;