Показать сообщение отдельно

  #40  
Старый 05.04.2010, 17:15
sn0w
Статус пользователя:
Регистрация: 26.07.2005
Сообщений: 568
Провел на форуме:
1290766

Репутация: 1236


По умолчанию

Код:
Немного теории

Процесс Winlogon при загрузке создает окно "SAS window", которое регистрирует HOTKEY для Ctrl+Alt+Del (CAD) и Ctrl+Shift+Esc (CSE). Вот собственно и все.

Перехват

Для перехвата CAD (CSE) нам необходимо внедрить DLL в процесс Winlogon, сабклассить указанное окно, и обрабатывать сообщение WM_HOTKEY:


// Новая оконная функция
LRESULT WINAPI NewSASProc( HWND hSAS, UINT msg, WPARAM wParam, LPARAM lParam )
{
    if( WM_HOTKEY == msg ){
         // Поймали HOTKEY CAD (CSE) - выводим сообщение на десктоп "Default" и затем выходим
         if( MAKELONG( MOD_CONTROL | MOD_ALT, VK_DELETE ) == lParam ){
              MessageBoxEx( GetActiveWindow(), TEXT("Ctrl + Alt + Del"), 
                                               TEXT("SAS Hook"), MB_DEFAULT_DESKTOP_ONLY, 0 );
              return 0;
             }

         if( MAKELONG( MOD_CONTROL | MOD_SHIFT, VK_ESCAPE ) == lParam ){
              MessageBoxEx( GetActiveWindow(), TEXT("Ctrl + Shift + Esc"), 
                                               TEXT("SAS Hook"), MB_DEFAULT_DESKTOP_ONLY, 0 );
              return 0;
             }
        }

    // Вызываем стандартный обработчик
    return CallWindowProc( g_OldSASProc, hSAS, msg, wParam, lParam );
}
Функция DllMain:

BOOL WINAPI DllMain( HINSTANCE hinstDll, DWORD fdwReason, PVOID fImpLoad )
{
    if( DLL_PROCESS_ATTACH == fdwReason ){
         // Находим окно
         g_hSASwnd = FindWindow( TEXT("SAS Window class"), TEXT("SAS window") );

         // Заменяем обработчик
         if( g_hSASwnd != NULL )
              g_OldSASProc = (WNDPROC) SetWindowLong( g_hSASwnd, GWL_WNDPROC, (LONG) NewSASProc );
        }

    if( DLL_PROCESS_DETACH == fdwReason ){
         // Возвращаем обработчик
         if( g_hSASwnd != NULL )
              SetWindowLong( g_hSASwnd, GWL_WNDPROC, (LONG) g_OldSASProc );
        }

    return TRUE;
}
=) мб уже не актуально - не проверял
__________________


snow white world wide
 
Ответить с цитированием