Blog. Just Blog

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

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

Программное удаление файла в Корзину

18.08.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Небольшой сниппет - удаление файла или группы файлов в Корзину. Делается это при помощи функции SHFileOperation, но сперва нам надо будет определить необходимую структуру SHFILEOPSTRUCT и несколько констант.
  1. struct SHFILEOPSTRUCT
  2.         hwnd                  dd ?
  3.         wFunc                 dd ?
  4.         pFrom                 dd ?
  5.         pTo                   dd ?
  6.         fFlags                dw ?
  7.         fAnyOperationsAborted dd ?
  8.         hNameMappings         dd ?
  9.         lpszProgressTitle     dd ?
  10. ends
  11.  
  12. FO_DELETE = 3h
  13.  
  14. FOF_ALLOWUNDO      = 40h
  15. FOF_NOCONFIRMATION = 10h
  16. FOF_SILENT         = 4h
Сам код очень простой. Указываем тип операции FO_DELETE, то есть удаление, в параметре pFrom передаем список объектов на удаление, флагами настраиваем поведение - удалять с возможностью отката (то есть в Корзину), не показывать никаких подтверждений и диалогов.
  1.         mov     [fos.hwnd],HWND_DESKTOP
  2.         mov     [fos.wFunc],FO_DELETE
  3.         mov     [fos.pFrom],fname
  4.         mov     [fos.fFlags],FOF_ALLOWUNDO+FOF_NOCONFIRMATION+FOF_SILENT
  5.         invoke  SHFileOperation,fos
Обратите внимание, что список объектов должен заканчиваться двойным нулевым символом, даже если удаляется один файл. Также при удалении файлов со съемных носителей они могут удаляться без попадания в Корзину, но это как и при удалении через Проводник Windows.

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

Использование мультимедийного таймера

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

Использование мультимедийного таймера

Интересная разновидность системных событий - высокоточный мультимедийный таймер. Гарантированный интервал срабатывания мультимедийных таймеров - около 10 миллисекунд против 50 миллисекунд обычных таймеров, устанавливаемых при помощи функции SetTimer. Кроме того, мультимедийные таймеры позволяют использовать обработчики, которые будут срабатывать в нужные интервалы, тогда как сообщения WM_TIMER от обычных таймеров идут через общую очередь. Если главный поток подвис, заснул или продолжительное время реагирует на какое-нибудь тяжелое сообщение, то таймеру придется ожидать, пока обработчик дойдет до него. Таким образом, добиться предсказуемой периодичности таймера будет очень сложно. Мультимедийные таймеры выполняются в собственном потоке, поэтому лишены перечисленных недостатков.

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

Передача данных приложению с помощью WM_DROPFILES

09.07.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Обрабатывать перетаскивание файлов в окно программы мы уже умеем, а сегодня узнаем, как сэмулировать это действие, то есть передать стороннему приложению список файлов через отправку сообщения WM_DROPFILES.

Начинаем с описания структуры DROPFILES, потому что FASM про нее ничего не знает. Так часто приходится писать подобное, что впору уже вводить какую-нибудь аббревиатуру, типа "Самостоятельно Описываем Структуры, Недостающие Интерфейсы, Константы Ассемблера" - "С.О.С.Н.И.К.А". Шутка.
  1. struct DROPFILES
  2.         pFiles dd ?
  3.         pt     POINT
  4.         fNC    dd ?
  5.         fWide  dd ?
  6. ends
Перед отправкой сообщения окну надо заполнить структуру DROPFILES. Значимыми полями являются pFiles - указатель на список файлов относительно начала структуры, и fWide - в каком формате передаются имена файлов, ASCII или юникод. Хотя на расположение списка файлов в памяти нет явных ограничений, обычно этот список размещается прямо за структурой и завершается нулевым байтом. Соответственно, указатель на этот список будет равен размеру структуры DROPFILES. Память под все это дело надо выделять с учетом нулевых разделителей между именами файлов и завершающим нулем.

Ну и сам код. Определяем размер и выделяем память, заполняем структуру и имена файлов, отправляем сообщение целевому окну.
  1.         ; Размер структуры DROPFILES
  2.         mov     ebx,sizeof.DROPFILES
  3.         inc     ebx
  4.  
  5.         ; Длина имени первого файла
  6.         invoke  lstrlen,file1
  7.         add     ebx,eax
  8.         inc     ebx
  9.  
  10.         ; Длина имени второго файла
  11.         invoke  lstrlen,file2
  12.         add     ebx,eax
  13.         inc     ebx
  14.  
  15.         ; Выделить память
  16.         invoke  GlobalAlloc,GMEM_SHARE+GMEM_MOVEABLE+GMEM_ZEROINIT,ebx
  17.         mov     [mem],eax
  18.         invoke  GlobalLock,eax
  19.         mov     [dfiles],eax
  20.  
  21.         ; Заполнить структуру DROPFILES
  22.         mov     edi,[dfiles]
  23.         mov     [edi+DROPFILES.pFiles],sizeof.DROPFILES
  24.         mov     [edi+DROPFILES.pt.x],0
  25.         mov     [edi+DROPFILES.pt.y],0
  26.         mov     [edi+DROPFILES.fNC],FALSE
  27.         mov     [edi+DROPFILES.fWide],FALSE
  28.         add     edi,sizeof.DROPFILES
  29.  
  30.         ; Дописать к ней передаваемые файлы
  31.         mov     esi,file1
  32. @@:
  33.         lodsb
  34.         stosb
  35.         or      al,al
  36.         jnz     @b
  37.  
  38.         mov     esi,file2
  39. @@:
  40.         lodsb
  41.         stosb
  42.         or      al,al
  43.         jnz     @b
  44.  
  45.         ; Завершающий нулевой байт
  46.         xor     eax,eax
  47.         stosb
  48.  
  49.         ; Отправить сообщение WM_DROPFILES
  50.         invoke  GlobalUnlock,[mem]
  51.         invoke  PostMessage,[destination_window],WM_DROPFILES,[mem],0
  52.         invoke  GlobalFree,[mem]
Обратите внимание, что отправка сообщения выполняется через PostMessage, иначе целевое приложение по какой-то причине может подвиснуть.

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

Как в Windows 7 установить разные обои на разные мониторы

04.07.2020 | Категория: Software | Автор: ManHunter

Как в Windows 7 установить разные обои на разные мониторы

Посмотрел как-то на свои два монитора с одинаковыми обоями и подумал: а можно ли поставить на каждый из мониторов свой рисунок? Как оказалось, официальный ответ - в Windows 7 это сделать нельзя. На более новых системах это делается штатными средствами, но это ни в коем случае не их преимущество, а всего лишь небольшая недоработка Windows 7. И сегодня я расскажу, как эту недоработку можно устранить.

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

Анимированные обои для рабочего стола Windows 7

22.06.2020 | Категория: Software | Автор: ManHunter

Анимированные обои для рабочего стола Windows 7

Одним из новшеств в Windows Vista стала возможность устанавливать видеофайлы в качестве обоев рабочего стола. Но в Windows 7 эту возможность по какой-то причине убрали. Тут я полностью соглашусь, что есть более интересные направления для применения мощностей компьютера, чем крутить видяшки на рабочем столе. Но спрос родил предложение, нашлись энтузиасты, которые выделили из Windows Vista необходимые компоненты для анимации и портировали их на Windows 7. Я знаю как минимум две программы, которые это делают.

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

01 ... 08 09 10 11 12 13 14 ... 37
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2025
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.25 сек. / MySQL: 3 (0.0299 сек.) / Память: 4.5 Mb
Наверх