1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Перехватить левый клик мышки на кнопке пуск

Тема в разделе "WASM.BEGINNERS", создана пользователем unc1e, 2 сен 2018.

  1. unc1e

    unc1e Active Member

    Публикаций:
    2
    Регистрация:
    28 июл 2017
    Сообщения:
    289
    Значит, пробовал тройку разных вариантов. Начиная от патча explorer.exe и заканчивая SetWindowHookEx (локальный хук с обработчиком в длл). Последний вариант прекрасно работает, но только лишь на windows 10. На windows server 2012 r2 не летит событие WM_LBUTTONDOWN при нажатии на кнопку пуск. Вернее , оно не летит в окошечко кнопки пуск (hStart):
    Код (C):
    1. HWND hTray = FindWindowExW(0, 0, L"Shell_TrayWnd", 0);
    2. HWND hStart = FindWindowExW(hTray, 0, L"Start", 0);
    На win 10 летит именно туда, можно выполнить что-то типа такого:
    Код (C):
    1. SetWindowsHookExW(WH_MOUSE, GetProcAddress(hDll, "udll_init"), hDll, GetWindowThreadProcessId(hStart, 0));
    Что сделал: настроил winspy++ на перехват сообщений всех окон, отфильтровал сообщения по WM_LBUTTONDOWN. Это сообщение все же летит при нажатии на кнопку пуск (см 1 картинку).
    Но когда пытаюсь посмотреть че это за хэндл такой - winspy ничего не показывает (см картинку 2). Забавно, но если очистить лог сообщений и нажать на кнопку заново - этот хэндл изменится. И такая фигня только при нажатии на кнопку пуск. Может, оно все как-то динамически генерируется? Как тогда понять, куда именно летит WM_LBUTTONDOWN?

    В самом хэндлере SetWindowsHookExW я делаю return -1 (сообщение после этого не передается в оконную процедуру, стартовое меню не открывается). Мне как бы это и нужно: заблокировать открытие стартового меню и вместо него рисовать свое окно.

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

    Вложения:

    • fca07cac675f[1].png
      fca07cac675f[1].png
      Размер файла:
      21,7 КБ
      Просмотров:
      498
    • _2.png
      _2.png
      Размер файла:
      8,5 КБ
      Просмотров:
      541
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.210
    Инжектишься в explorer.exe, сабклассишь эту кнопку через SetWindowLongW(GWL_WNDPROC) и ловишь WM_LBUTTONDOWN в обработчике.
     
  3. unc1e

    unc1e Active Member

    Публикаций:
    2
    Регистрация:
    28 июл 2017
    Сообщения:
    289
    Есть вариант вместо локального хука ставить глобальный и проверять принадлежность x и y координат кнопке пуск, блокировать передачу. Вот только в таком случае, если поверх кнопку пуск будет какое-нибудь окно, на которое мы нажмем - клик заблокируется. См картинку
    [​IMG]
     
    Последнее редактирование: 2 сен 2018
  4. unc1e

    unc1e Active Member

    Публикаций:
    2
    Регистрация:
    28 июл 2017
    Сообщения:
    289
    f13nd, сабклассинг тоже хотел попробовать, вот только хз какой хэндл у окна, которое обрабатывает WM_LBUTTONDOWN
     
  5. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.210
    Вроде бы окно с классом ImmersiveSwitchList (8.1 х64)
    Можно на всякий случай засабклассить все и проверять координаты :mda:
     
    Последнее редактирование: 2 сен 2018
  6. unc1e

    unc1e Active Member

    Публикаций:
    2
    Регистрация:
    28 июл 2017
    Сообщения:
    289
    f13nd, винспай такое не ищет, будем разбираться, спасибо за помощь!
     
  7. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    5.175
  8. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    549
    Можно сделать несколькими способами.
    Поставить хук WH_GETMESSAGE и ловить WM_LBUTTONDOWN;
    Поставить хук WH_MOUSE, WH_MOUSE_LL и проверять координаты (WindowFromPoint);
    Поставить event-хук (SetWinEventHook) EVENT_OBJECT_INVOKED или EVENT_OBJECT_STATECHANGE и проверять условия.
    Сабклассинг в explorer.exe.
    Проблемы могут возникнуть между 64/32 процессами, которые уже решаются в зависимости от выбранного способа.
     
  9. unc1e

    unc1e Active Member

    Публикаций:
    2
    Регистрация:
    28 июл 2017
    Сообщения:
    289
    Thetrik, про event хуки ничего не знал, прикольная штука, спасибо))
    UbIvItS, вопрос решил, правда, решение так и не пригодилось.
     
  10. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    3.512
    unc1e,

    Суть в следующем. Вы можите надумать какие угодно задачи, для решения которых будет не достаточно гибкости гуй апи или же их использование перейдёт на низкоуровневый слой(это не апи, а уровень интерфейсов ядра). Правильный подход к задаче - вы должны реализовать простейший фильтр и отследить событие в um-km интерфейсе(конкретно APFN), тогда вы поймёте конкретный высокоуровневый механизм, который и необходим для решения. Это можно сделать и в отладчике. Тем более что по этим интерфейсам есть сурки.