Кто нажал кнопку?

Тема в разделе "WASM.WIN32", создана пользователем beginner, 27 сен 2008.

  1. beginner

    beginner New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    233
    Есть небольшая программка, которая при необходимости, блокирует физические мышь и клавиаутуру и выполняет движения мыши, нажатия кнопок в нужных местах, заранее определенных координатах.
    Почитав форум, статьи, понял, что блокировку можно выполнить через драйвер-фильтр и через хуки.
    Драйвер мне показалось черезчур сложным, потому решил использовать хуки WH_MOUSE_LL и WH_KEYBOARD_LL. Тем более, что для таких хуков не нужна длл.
    ставлю хук так:
    Код (Text):
    1. hHook_m = SetWindowsHookEx(WH_MOUSE_LL, MouseLLProc, hInstance, NULL);
    Почитав еще МСДН, выяснил, что в хуке можно выяснить было ли реальным нажатием или нет.
    За это отвечает flags в структуре MSLLHOOKSTRUCT.
    Потому сделал так:
    Код (Text):
    1. LRESULT CALLBACK MouseLLProc (int nCode, WPARAM wParam, LPARAM lParam) {
    2.     MSLLHOOKSTRUCT *mhs = (MSLLHOOKSTRUCT *)lParam;
    3.     if (nCode < 0)  // do not process the message
    4.         return CallNextHookEx(hHook_m, nCode, wParam, lParam);
    5.     if (mhs->flags) {
    6.         mhs->flags = 0;
    7.         return CallNextHookEx(hHook_m, nCode, wParam, lParam);
    8.     }
    9.     return 1;
    10. };
    у меня вопрос:
    Как хуки наследуются в системе? Последний установленный выполняется самым первым?
    Если это так, то подопытной программе достаточно поставить свой хук и проверить flags в структуре MSLLHOOKSTRUCT. Так как он будет ставится после меня, то получается будет выполнятся первым?

    И предполагаемый вариант решения:
    Сделать два хука, первый, который устанавливается в самом начале и просто отключает мышь и второй - который устанавливается только в момент, когда нужно выполнить какие то действия. Тогда с большой долей вероятностью этот второй хук будет выполнятся первым из всех хуков мыши и успевает обнулить flags в структуре MSLLHOOKSTRUCT.

    Будет ли этого достаточно, что бы обмануть программы? Или надо копать еще глубже?
     
  2. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    beginner
    Хм... я чесно говоря не был осведомлен об этом флаге ((( т.е. любая прога теоретически может запалить было ли реально нажата клавиша или была посланна программой. Так, можно если вы так боитесь еще и перехватить установку хука, и тогда все бы вроде нормально, но могуд попалить в АП хук.

    Я вот тут не понял, не нужна длл, те выполняеться в текущем процесе? хы интересно.... но бесполезно т.к. действительно программа может поставить хук посже и все испортить.


    Короче видимо выход только драйвер, и я чесно говоря не знаю как послать сообще ние конкретному окну, даже думаю это не документированно
     
  3. beginner

    beginner New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    233
    для хуков типа WH_MOUSE_LL и WH_KEYBOARD_LL не нужно внедрение длл, так как по умолчанию эти хуки глобальны, и функция обработки хука может быть в текущем процессе.

    Если я, смогу уверить все другие проги, что мой SendInput истинный, что он пришел от реальной мыши, но при этом реальная мышь будет заблокирована, что бы пользователь случайно не сдвинул курсор и не нажал кнопку - то это будет именно то, что мне нужно :)

    Счас вникаю в мсдн, в гугл, и прихожу к выводу - что не зная наверняка, пытается ли подопытная программа отловить нефизическую работу мыши и как она это делает - это гадание на кофейной гущи.

    Есть ли вообще 100% способ, который позволит обмануть такую программу?
     
  4. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    beginner
    100% только дравер, и то он скажем так 80% малоли какие побочные эфекты случайно вызовете. И еще как вариант польностью обернуть программу, но это еще не проще, да я ваще сам в тупеке.


    PS я щас занимаюсь очень похожей задачей, может в личку напишете что за программа мб вместе дочего и докумекаем.
     
  5. beginner

    beginner New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    233
    Я написал аську в личку. Там все таки удобней общаться, если вы не против.
     
  6. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Да именно, а функция CallNextHookEx вызывает следующий хук.

    http://www.wasm.ru/article.php?article=1001024
     
  7. beginner

    beginner New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    233
    JCronuz
    А можно ли как то определить является ли мой хук самым первым в цепочке?
     
  8. SEA

    SEA New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2008
    Сообщения:
    17
    Тоже сейчас занимаюсь похожими вопросами.
    У вас получилось "незаметно" управлять мышью?
     
  9. SEA

    SEA New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2008
    Сообщения:
    17
    Похоже, "незаметно" управлять мышкой без написания драйвера не выйдет - Raw input приходит с hDevice=0 в RAWINPUTHEADER - ещё один способ определить, что мышкой управляют. Может кто что подскажет? Может быть можно подсовывать мышиные события какому-то промежуточному драйверу-фильтру? Или это всё только для драйверов? Может где есть готовый драйвер "мыши", который принимает данные снаружи?