Blog. Just Blog

Образ мышления: Assembler

То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал Образ мышления: Assembler - Карта сайта

Как узнать, что приложение запущено через ярлык

29.11.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Очередная развлекушка на Ассемблере. Давайте узнаем, была ли наша программа запущена через .lnk-файл, то есть через ярлык, или же напрямую через Проводник, файловый менеджер или другой процесс. Для этого надо получить структуру STARTUPINFO, а затем проверить, установлен ли флаг STARTF_TITLEISLINKNAME в поле dwFlags.
  1.         STARTF_TITLEISLINKNAME = 0x800
  2.  
  3.         ; Получить информацию запуска
  4.         mov     [sinfo.cb],sizeof.STARTUPINFO
  5.         invoke  GetStartupInfo,sinfo
  6.  
  7.         ; Флаг установлен?
  8.         test    [sinfo.dwFlags],STARTF_TITLEISLINKNAME
  9.         jz      @f
  10.         ; Да, запуск выполнен через ярлык
  11.         ...
  12. @@:
  13.         ; Нет, прямой запуск
  14.         ...
Ранее этот флаг относился к недокументированным, сейчас в MSDN появилось его нормальное описание. Итак, если флаг STARTF_TITLEISLINKNAME установлен, то программа была запущена через ярлык, а в параметре lpTitle структуры STARTUPINFO содержится указатель на строку с полным путем к .lnk-файлу, через который был произведен запуск.

Читать статью целиком »
Просмотров: 133 | Комментариев: 0

Как получить текст под курсором

18.11.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Технология Microsoft Active Accessibility предназначена для взаимодействия различных устройств типа экранных читалок с объектами на экране, чтобы облегчить работу с компьютером людям с ограниченными физическими возможностями. При помощи Microsoft Active Accessibility, например, можно узнать, над каким элементом экрана находится курсор мыши, а также получить тип и содержимое этого элемента. Этим мы и воспользуемся, чтобы получить текст под курсором.

С технологией MSAA мы уже познакомились в статье про перехват Alt+Tab, только не заостряли внимание, что это именно она. Зато не придется дублировать структуры и интерфейсы, они уже описаны в статье по ссылке. Поэтому сразу переходим к программированию.
  1.         ; Получить координаты курсора
  2.         invoke  GetCursorPos,curs
  3.         ; Получить объект под курсором
  4.         invoke  AccessibleObjectFromPoint,[curs.x],[curs.y],pAcc,varChild
По таймеру или по какому-то другому событию получаем текущие координаты курсора, затем при помощи функции AccessibleObjectFromPoint получаем объект, который находится на экране по этим координатам. В случае удачного вызова, она возвращает указатель на интерфейс IAccessible объекта. Теперь можно попробовать получить текст под курсором, но сперва небольшое отступление.
  1.         ; Получить роль объекта под курсором
  2.         mov     [role.vt],VT_I4
  3.         push    role
  4.         mov     eax,varChild
  5.         push    dword [eax+0Ch]
  6.         push    dword [eax+08h]
  7.         push    dword [eax+04h]
  8.         push    dword [eax]
  9.         mov     eax,[pAcc]
  10.         mov     eax,[eax]
  11.         stdcall dword [eax+IAccessible.get_accRole],[pAcc]
  12.         ; [role.lVal] -> код роли объекта (кнопка, полоса прокрутки, текст и т.п.)
Роль зависит от типа элемента интерфейса. Это может быть текст, заголовок окна, пункт меню, полоса прокрутки, кнопка, чекбокс, клиентская область окна и так далее. На основании этих данных вспомогательное устройство принимает решение, каким образом можно взаимодействовать с объектом под курсором и какие данные от него можно ожидать.

Читать статью целиком »
Просмотров: 142 | Комментариев: 0

Программное отключение и подключение монитора

08.11.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter

Программное отключение и подключение монитора

С программным выключением мониторов уже разобрались, сегодня разберем более жесткое действие - отключение. Принципиальную разницу между выключением и отключением, надеюсь, объяснять не надо. Конечно, программно выдернуть видеокабель из системника невозможно, но можно сделать так, чтобы система просто перестала воспринимать этот монитор.

Читать статью целиком »
Просмотров: 289 | Комментариев: 3

Работа с контролом SysTabControl32 на Ассемблере

31.10.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter

Работа с контролом SysTabControl32 на Ассемблере

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

Читать статью целиком »
Просмотров: 316 | Комментариев: 3

Assembler: сейчас на сайте 2 гостей и 3 новостей

27.10.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Немного отдохнем от ковыряния во внутренностях системы. Переписал на Ассемблере свою PHP-шную функцию для правильного склонения языковых конструкций вида "число + слово". Всю суть вопроса и теорию можете почитать в статье по ссылке. Сама функция получилась вот такой:
  1. ;-------------------------------------------------------
  2. ; Функция для получения индекса массива с вариантами
  3. ; склонений слова в зависимости от числового значения.
  4. ; Массив слов формируется по принципу "1-2-5", то есть 
  5. ; ("гость", "гостя", "гостей")
  6. ;-------------------------------------------------------
  7. ; На входе: 
  8. ;    dNum - число
  9. ; На выходе: 
  10. ;    EAX = [0..2] - индекс элемента массива
  11. ;-------------------------------------------------------
  12. proc num2word dNum:DWORD
  13.         push    ecx edx
  14.         mov     eax,[dNum]
  15.         cdq
  16.         mov     ecx,100
  17.         idiv    ecx
  18.         cmp     edx,19
  19.         jb      @f
  20.         mov     eax,edx
  21.         cdq
  22.         mov     ecx,10
  23.         idiv    ecx
  24. @@:
  25.         xor     eax,eax
  26.         or      edx,edx
  27.         jz      .case2
  28.         cmp     edx,1
  29.         jz      .case0
  30.         cmp     edx,4
  31.         jbe     .case1
  32. .case2:
  33.         inc     eax
  34. .case1:
  35.         inc     eax
  36. .case0:
  37.         pop     edx ecx
  38.         ret
  39. endp
Единственный параметр на входе - число, для которого надо получить индекс элемента массива. На выходе EAX - искомый индекс от 0 до 2. Примеры использования смотрите в прилагаемом исходнике, там ничего сложного.

Читать статью целиком »
Просмотров: 230 | Комментариев: 0

prev 01 02 03 04 05 06 07 08 09 ... 44 next
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2020
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.002 сек.) / Память: 5 Mb
Наверх