Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

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. Примеры использования смотрите в прилагаемом исходнике, там ничего сложного.

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

Как узнать модель и серийный номер монитора

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

Как узнать модель и серийный номер монитора

EDID - Extended Display Identification Data - стандарт формата данных VESA, расширенные данные идентификации дисплея. Эта информация передается монитором или телевизором на устройство, которое генерирует видео сигнал. EDID содержит базовую информацию о мониторе и его возможностях, включая информацию о производителе, максимальном размере, цветовых характеристиках, заводских таймингах, границах частотного диапазона и другие технические данные. Кроме этого в EDID записаны строки, содержащие модель монитора и его серийный номер. Вот они-то нас и интересуют.

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

Как добавить иконку щита UAC на кнопку

26.09.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Начиная с Windows Vista, в интерфейсе системы на некоторых элементах управления появился значок в виде щита. Он означает, что при взаимодействии с таким элементом у пользователя будут запрошены повышенные права доступа. Если ваша программа выполняет действия, которые требуют повышенных прав, то хорошим тоном будет тоже отмечать специальной иконкой элементы управления, запускающие такие функции. Но совсем не обязательно таскать иконку в ресурсах или в каких-то отдельных файлах, тем более, что на разных системах она выглядит по-разному. Все делается очень просто, достаточно отправить нужной кнопке сообщение BCM_SETSHIELD и система сама дополнит кнопку иконкой щита, принятой в данной версии Windows. Если lParam сообщения равен TRUE, то иконка щита добавляется, а если FALSE, то, соответственно, удаляется.
  1.         BCM_SETSHIELD = 0x160C
  2.  
  3.         ; Установить иконку на кнопку
  4.         invoke  SendDlgItemMessage,[hwnddlg],ID_BTN1,BCM_SETSHIELD,0,TRUE
Узнать наличие иконки щита на кнопке можно при помощи сообщения BM_GETIMAGE. Точнее, так можно определить наличие иконки вообще, а не конкретно щита. Если сообщение вернуло 0, то никакая иконка на кнопке не отображается.
  1.         ; Какая-то иконка на кнопке уже есть?
  2.         invoke  SendDlgItemMessage,[hwnddlg],ID_BTN1,BM_GETIMAGE,IMAGE_ICON,0
  3.         or      eax,eax
  4.         jnz     @f
  5.         ; Иконки нет
  6.         ...
  7. @@:
  8.         ; Иконка есть
  9.         ...
В официальной документации сказано, что единственными элементами управления, на которые таким образом можно навесить значок щита, являются кнопки и командные ссылки. Но никто не запрещает загрузить изображение щита как обычную иконку и затем использовать ее хэндл. Иконка загружается с небольшим подвыподвертом - через функцию LoadIconWithScaleDown. Загруженную иконку можно установить в заголовок окна, на STATIC, в заголовок вкладки, точно так же на кнопку или на любой другой элемент диалогового окна, который поддерживает отображение HICON.
  1.         IDI_SHIELD    = 0x7F06
  2.  
  3.         ; Загрузить иконку щита
  4.         invoke  GetSystemMetrics,SM_CXSMICON
  5.         invoke  LoadIconWithScaleDown,0,IDI_SHIELD,eax,eax,hShieldIcon
  6.         ; [hShieldIcon] --> хэндл иконки щита
  7.  
  8.         ; Установить иконку на кнопку
  9.         invoke  SendDlgItemMessage,[hwnddlg],ID_BTN2,BM_SETIMAGE,\
  10.                 IMAGE_ICON,[hShieldIcon]
  11.         ; Установить иконку в заголовок окна
  12.         invoke  SendMessage,[hwnddlg],WM_SETICON,ICON_SMALL,[hShieldIcon]
  13.         ; Установить иконку на STATIC
  14.         invoke  SendDlgItemMessage,[hwnddlg],ID_STAT,STM_SETIMAGE,\
  15.                 IMAGE_ICON,[hShieldIcon]
Важное замечание. Чтобы программа могла использовать сообщение BCM_SETSHIELD и функцию LoadIconWithScaleDown, она должна быть скомпилирована с манифестом, в котором заявлена поддержка динамической библиотеки comctl32.dll версии 6.

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

Разделение ввода от нескольких клавиатур

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

Разделение ввода от нескольких клавиатур

В одной из прошлых статей мы научились получать список всех устройств, реальных и виртуальных, которые используются для ввода. А можно ли каким-то образом разделять данные, полученные от разных источников? Например, к компьютеру подключены несколько клавиатур и надо определить, на какой именно клавиатуре была нажата клавиша. Ответ - да, можно. Приложение может подписаться на нужные устройства ввода при помощи функции RegisterRawInputDevices. При получении "сырого" ввода от каждого из устройств выбранного типа, система будет посылать приложению сообщение WM_INPUT, а приложению останется его правильно обработать.

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

Управление отображением программы на панели задач

07.09.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
При скрытии главного окна программы при помощи функции ShowWindow, программа также убирается с панели задач. Тут ничего сложного. А как сделать так, чтобы окно отображалось на экране, но при этом программа не отображалась на панели задач? В некоторых случаях это можно сделать определенной комбинацией стилей окна, например, добавив в расширенный стиль параметр WS_EX_TOOLWINDOW. Но это не всегда приемлемо, чаще всего стиль окна должен оставаться привычным, то есть с заголовком, иконкой, кнопками сворачивания и т.д. Значит нужны программные способы добавить или убрать программу с панели задач.

Наиболее простой в реализации способ, который чаще всего рекомендуют использовать, основан на изменении родительского окна. Если у главного окна приложения нет родительского окна, то оно отображается на панели задач. Если в качестве родительского окна указан рабочий стол, то программа убирается из панели задач. На этапе инициализации окна ему присваивается нулевое значение в качестве хэндла родительского окна.
  1. .wminitdialog:
  2.         ; Если окно уже имеет родителя, то сбросить значение
  3.         invoke  GetWindowLong,[hwnddlg],GWL_HWNDPARENT
  4.         or      eax,eax
  5.         jz      @f
  6.         invoke  SetWindowLong,[hwnddlg],GWL_HWNDPARENT,0
  7. @@:
Затем при наступлении нужных событий программа или отображается на панели задач, или скрывается.
  1. .taskbar_show:
  2.         ; Добавить программу на панели задач
  3.         invoke  SetWindowLong,[hwnddlg],GWL_HWNDPARENT,0
  4.         ...
  5. .taskbar_hide:
  6.         ; Убрать программу с панели задач
  7.         invoke  GetDesktopWindow
  8.         invoke  SetWindowLong,[hwnddlg],GWL_HWNDPARENT,eax
  9.         ...
Если нужно с самого начала просто убрать программу из панели задач, то при инициализации окна вместо обнуления родительского хэндла на эту роль сразу назначается рабочий стол.

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

01 ... 04 05 06 07 08 09 10 ... 51
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2021
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.17 сек. / MySQL: 3 (0.0638 сек.) / Память: 5 Mb
Наверх