Blog. Just Blog

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

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

Ассоциация файлов с программой

12.07.2018 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня разберем пример ассоциации файлов с программой. В Windows это один из краеугольных камней работы системы. С определенным расширением файлов связана та или иная программа. При клике на документе открывается Word, при открытии html-документа запускается браузер, картинки открываются в просмотрщике, а файлы проектов различных программ открываются в этих программах. Это хорошо и правильно.

Для установки связки определенного расширения файлов со своей программой, сперва надо придумать название типа. Для примера, пусть это будет "MyApplication". Затем в ветке реестра HKEY_CLASSES_ROOT надо создать ключ, соответствующий нужному расширению и присвоить значение параметра по умолчанию, равное придуманному имени.

[HKEY_CLASSES_ROOT\.pcl]
@="MyApplication"

Если программа работает с несколькими расширениями файлов, то для каждого из них точно так же надо прописать ассоциацию с типом "MyApplication".

Теперь надо настроить программу, соответствующую типу "MyApplication". Сперва создается ключ в реестре "HKEY_CLASSES_ROOT\MyApplication". Затем нужно настроить иконку, которая будет отображаться в Проводнике у всех связанных файлов. За это отвечает ключ реестра "HKEY_CLASSES_ROOT\MyApplication\DefaultIcon". В этом примере файлы будут иметь иконку, которая назначена в ресурсах приложения в качестве основной.

[HKEY_CLASSES_ROOT\MyApplication\DefaultIcon]
@="D:\\DEMO\\association.exe,0"

При запуске связанной программы ей в качестве параметра должен передаваться полный путь к файлу, который открывается. Делается это настройкой ключа реестра "MyApplication\Shell\Open\command".

[HKEY_CLASSES_ROOT\MyApplication\Shell\Open\command]
@="\"D:\\DEMO\\association.exe\" \"%1\""

Для отмены ассоциаций достаточно удалить ключи "HKEY_CLASSES_ROOT\MyApplication" и "HKEY_CLASSES_ROOT\.pcl". Вот и вся премудрость.

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

Установка окна по центру с учетом нескольких мониторов

24.06.2018 | Категория: Образ мышления: Assembler | Автор: ManHunter
И вновь работа над ошибками. На этот раз переосмысление статьи об установке окна по центру экрана. Приведенный там код работает без проблем, но только для единственного монитора, при наличии двух и более мониторов результат получается неправильным. Основные принципы работы с несколькими мониторами я расписал в предыдущей статье, повторять не буду.
  1. ;-------------------------------------------------------------------------
  2. ; Процедура перемещения окна в центр экрана. Если окно развернуто или
  3. ; его размеры превышают размеры экрана, то окно не перемещается
  4. ; Параметры:
  5. ;   hwnd - хэндл окна
  6. ;   mode - относительно каких координат центровать окно (1 - только
  7. ;          рабочая область экрана с учетом размеров панели задач и
  8. ;          различных тулбаров, 0 - относительно размеров всего экрана)
  9. ;-------------------------------------------------------------------------
  10. proc    WindowToCenterEx hwnd:DWORD, mode:DWORD
  11.  
  12.         MONITOR_DEFAULTTONEAREST = 2
  13.  
  14.         struct MONITORINFO
  15.           cbSize    dd ?
  16.           rcMonitor RECT
  17.           rcWork    RECT
  18.           dwFlags   dd ?
  19.         ends
  20.  
  21.         locals
  22.           minfo MONITORINFO
  23.           coord RECT
  24.         endl
  25.  
  26.         ; Сохранить все регистры
  27.         pusha
  28.  
  29.         ; Такое окно существует?
  30.         invoke  IsWindow,[hwnd]
  31.         or      eax,eax
  32.         jz      .loc_ret
  33.         ; Окно развернуто на весь экран?
  34.         invoke  IsZoomed,[hwnd]
  35.         or      eax,eax
  36.         jnz     .loc_ret
  37.  
  38.         ; Получить размеры окна
  39.         lea     eax,[coord]
  40.         invoke  GetWindowRect,[hwnd],eax
  41.  
  42.         ; Монитор, на котором находится окно
  43.         invoke  MonitorFromWindow,[hwnd],MONITOR_DEFAULTTONEAREST
  44.  
  45.         ; В регистре ESI указатель на структуру информации о мониторе
  46.         lea     esi,[minfo]
  47.         mov     [esi+MONITORINFO.cbSize],sizeof.MONITORINFO
  48.         invoke  GetMonitorInfo,eax,esi
  49.  
  50.         ; Весь экран
  51.         lea     esi,[minfo.rcMonitor]
  52.         cmp     [mode],0
  53.         je      @f
  54.         ; Рабочая область экрана
  55.         lea     esi,[minfo.rcWork]
  56. @@:
  57.         mov     eax,[esi+RECT.right]
  58.         sub     eax,[esi+RECT.left]
  59.  
  60.         lea     edi,[coord]
  61.         mov     ebx,[edi+RECT.right]
  62.         sub     ebx,[edi+RECT.left]
  63.  
  64.         ; Окно шире монитора
  65.         cmp     ebx,eax
  66.         jg      .loc_ret
  67.  
  68.         mov     ecx,[esi+RECT.bottom]
  69.         sub     ecx,[esi+RECT.top]
  70.  
  71.         mov     edx,[edi+RECT.bottom]
  72.         sub     edx,[edi+RECT.top]
  73.  
  74.         ; Окно выше монитора
  75.         cmp     edx,ecx
  76.         jg      .loc_ret
  77.  
  78.         shr     ebx,1
  79.         shr     eax,1
  80.         add     eax,[esi+RECT.left]
  81.         sub     eax,ebx
  82.  
  83.         shr     edx,1
  84.         shr     ecx,1
  85.         add     ecx,[esi+RECT.top]
  86.         sub     ecx,edx
  87.  
  88.         ; Разместить окно по центру монитора
  89.         invoke  SetWindowPos,[hwnd],NULL,eax,ecx,NULL,NULL,\
  90.                 SWP_NOSIZE+SWP_NOZORDER
  91.  
  92. .loc_ret:
  93.         ; Восстановить все регистры
  94.         popa
  95.         ret
  96. endp
Параметры вызова точно такие же, как и у старой функции: hwnd - хэндл окна, которое надо отцентровать, mode - режим центровки: 0 - установить окно по центру всего экрана, 1 - установить окно по центру рабочей области, то есть с учетом размеров панели задач и различных тулбаров.

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

Магнитное окно с учетом нескольких мониторов

04.06.2018 | Категория: Образ мышления: Assembler | Автор: ManHunter
Продолжаем работу над ошибками. Несколько лет назад в одной из статей я рассказывал, как сделать окно, которое при перемещении будет прилипать ко краям экрана. Этот способ рабочий, но он не учитывает ситуацию, когда у пользователя более одного монитора. Дело в том, что функция SystemParametersInfo с параметром SPI_GETWORKAREA возвращает координаты рабочей области только основного монитора. Для поддержки нескольких мониторов, в том числе произвольных размеров, надо сперва определить, на каком мониторе находится окно. Затем надо будет получить характеристики этого монитора, точнее координаты его рабочей области. Но сперва придется определить структуру и константу, про которую не знает коробочный FASM.
  1. MONITOR_DEFAULTTONEAREST = 2
  2.  
  3. struct MONITORINFO
  4.     cbSize    dd ?
  5.     rcMonitor RECT
  6.     rcWork    RECT
  7.     dwFlags   dd ?
  8. ends 
Теперь немного теории. Чтобы узнать положение окна, надо воспользоваться функцией MonitorFromWindow с флагом MONITOR_DEFAULTTONEAREST, которая, в случае успеха, вернет хэндл монитора, на котором находится указанное окно, или хэндл дефолтного монитора в случае неудачи. Зная этот хэндл, можно получить параметры монитора при помощи функции GetMonitorInfo. В структуру MONITORINFO записываются размеры монитора и размеры его рабочей области, на основании которых мы и будем работать.

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

Извлечение главной иконки из исполняемого файла

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

Извлечение главной иконки из исполняемого файла

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

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

Замена главной иконки исполняемого файла

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

Замена главной иконки исполняемого файла

Продолжаем тему иконок. Сегодня разберем способ, как можно заменить главную иконку приложения на другую. Зачем это надо? Например, может возникнуть потребность заменить иконку в неком исполняемом файле на иконку документа Word или PDF ;) Или надо перенести в свежесобранный патч иконку из обрабатываемой им софтины. Или, как в моем случае, вам не нравится оригинальная иконка какого-нибудь приложения и вы хотите поменять ее на что-нибудь свое. Применение этой технологии вы определите для себя сами. Как говорила Масяня в одноименном мультике: "Мое дело подарок подарить, а ты уж думай, что с этой хренью делать".

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

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2019
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.09 сек. / MySQL: 3 (0.0204 сек.) / Память: 4.75 Mb
Наверх