Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Симуляция нажатия Ctrl+Alt+Del 
:(
    Опции темы
_GRIN_
Дата 7.8.2012, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: нет
Всего: 7



Здравствуйте.
Возникла проблема симуляции нажатия пользователем Ctrl+Alt+Del. Т.е. перехват клавиш делать не нужно (допустим пользователь выбрал в меню Send Ctrl+Alt+Del).

Note: OS Windows XP SP3

---------------------------------
пробовал симулировать последовательное нажатие и отпускание:
Код

    keybd_event( VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY, 0 );
    keybd_event( VK_MENU,       0, KEYEVENTF_EXTENDEDKEY, 0 );
    keybd_event( VK_DELETE,    0, KEYEVENTF_EXTENDEDKEY, 0 );

    Sleep(1);

    keybd_event( VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0 );
    keybd_event( VK_MENU,       0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0 );
    keybd_event( VK_DELETE,    0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0 );

результат нулевой

----------------------------------
Пробовал заюзать WlxUseCtrlAltDel ( http://msdn.microsoft.com/en-us/library/wi...4(v=vs.85).aspx ) но:
1. в системе нет gina.dll - а есть msgina.dll.
2. msgina.dll НЕ СОДЕРЖИТ функций WlxUseCtrlAltDel, WlxSetOption, WlxSasNotify - хотя и СОДЕРЖИТ функции WlxNegotiate, WlxInitialize.
можно конечно сделать свою реализацию gina.dll - но регистрировать её в реестре нельзя по ТЗ.

----------------------------------
Посмотрел реализацию в tightvnc-2.5.2 (для версий младше висты) и на её основе сделал следующее:
Код

         HDESK desktop = OpenDesktop( (LPTSTR)"Winlogon", 0, TRUE,
                                   DESKTOP_CREATEMENU |
                                   DESKTOP_CREATEWINDOW |
                                   DESKTOP_ENUMERATE |
                                   DESKTOP_HOOKCONTROL |
                                   DESKTOP_WRITEOBJECTS |
                                   DESKTOP_READOBJECTS |
                                   DESKTOP_SWITCHDESKTOP |
                                   GENERIC_WRITE);
        if( NULL != desktop )
        {
            if( SetThreadDesktop( desktop ) )
            {
                HWND hwndCtrlAltDel = FindWindow( (LPCTSTR) "SAS window class",
                                                (LPCTSTR) "SAS window");
                if(hwndCtrlAltDel == NULL)
                {
                    hwndCtrlAltDel = HWND_BROADCAST;
                }
                PostMessage( hwndCtrlAltDel, WM_HOTKEY, 0,
                            MAKELONG( MOD_ALT | MOD_CONTROL, VK_DELETE ) );
            }
            CloseDesktop( desktop );
        }
        else
        {
            PostMessage( HWND_BROADCAST, WM_HOTKEY, 0,
                         MAKELONG( MOD_ALT | MOD_CONTROL, VK_DELETE ) );
        }

В итоге desktop == NULL и послав WM_HOTKEY всем окнам (HWND_BROADCAST) получаю окно запуска приложений ( как после нажатия Win+R )
Пробывал в PostMessage менять последний параметра на  MAKELONG( MOD_CONTROL, VK_DELETE | VK_MENU )  - результат тот же.

-------------------------------------------------------------------------
Просто запуск "C:\\windows\\system32\\taskmgr.exe" - но это не то, что нужно, т.к. по этой комбинации может требоваться переходить к логину на компе где установлено приложение (приложение а-ля team-viewer)

Please, help! =)


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
leniviy
Дата 9.8.2012, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



Зачем PostMessage ? Надо SendInput
Был не прав.

Это сообщение отредактировал(а) leniviy - 9.8.2012, 13:07
PM MAIL   Вверх
leniviy
Дата 9.8.2012, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



У меня семёрка.  Я запустил твой код из-под сервиса.
OpenDesktop() срабатывает, но FindWindow ничего находит. EnumWindows() тоже ничего не находит
PM MAIL   Вверх
leniviy
Дата 9.8.2012, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



под вистой и выше всё проще:
Код


typedef VOID (WINAPI *SendSas)(BOOL asUser);

void simulateCtrlAltDelUnderVista()
{
  SendSas sendSas;
    HMODULE hSasDll = LoadLibrary("sas.dll");
    if (!hSasDll) {
      printf("LoadLibrary(\"sas.dll\") failed\n");
      return;
    }
    sendSas = (SendSas)GetProcAddress(hSasDll, "SendSAS");
    if (!sendSas) {
      printf("GetProcAddress(\"SendSAS\") failed\n");
      return;
    }
    sendSas(FALSE); // Try only under service
}


PM MAIL   Вверх
_GRIN_
Дата 3.9.2012, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: нет
Всего: 7



Под 7-кой не работает пробывал  из-под запущенного и установленного сервиса:
вот аддапированный код:
Код

typedef VOID (WINAPI *SendSas)(BOOL asUser);
void simulateCtrlAltDelUnderVista()
{
    log( Q_FUNC_INFO ); //log() - функция выводящая сообщение в файл; Q_FUNC_INFO - макрос, возвращающий информацию о функции
    SendSas sendSas;
    HMODULE hSasDll = LoadLibraryW(L"sas.dll"); // LoadLibrary("sas.dll") не компилилось, а LoadLibrary( (LPCSTR)("sas.dll") ) возвращает NULL - хотя либа в системе есть !
    if (!hSasDll) {
      log("LoadLibrary(\"sas.dll\") failed\n"); //log() - функция выводящая сообщение в файл
      return;
    }
    sendSas = (SendSas)GetProcAddress(hSasDll, "SendSAS");
    if (!sendSas) {
      log("GetProcAddress(\"SendSAS\") failed\n");
      return;
    }
    sendSas(FALSE); // Try only under service
}


в лог выводится только: 

Код

[16:42:36] void __cdecl simulateCtrlAltDelUnderVista(void)


сообщений об ошибках нет - но результата нет.

З.Ы. - правда я пробывал для оси - установленной на виртуалбоксе.


Это сообщение отредактировал(а) _GRIN_ - 3.9.2012, 15:56


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
leniviy
Дата 3.9.2012, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



Значит прав нет. Ты точно из-под сервиса этот код запускаешь?
PM MAIL   Вверх
_GRIN_
Дата 3.9.2012, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: нет
Всего: 7



Цитата(leniviy @  3.9.2012,  14:13 Найти цитируемый пост)
Значит прав нет. Ты точно из-под сервиса этот код запускаешь? 

ща гляну из-под какого пользователя данный сервис запускается.

сервис запускается из под текущего пользователя (grin - который является администратором компьютера)

напутал - сервис работает из-под пользователя SYSTEM



Это сообщение отредактировал(а) _GRIN_ - 3.9.2012, 16:34


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
_GRIN_
Дата 3.9.2012, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: нет
Всего: 7



Для семёрки проблема частично решена - нужно было в групповых политиках включить следующую политику:
Computer Configuration | Administrative Templates | Windows Components | Windows Logon Options | Disable or enable software Secure Attention Sequence

Осталось под Xp добить



--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0549 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.