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

Использование мультимедийного таймера
16.08.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Интересная разновидность системных событий - высокоточный мультимедийный таймер. Гарантированный интервал срабатывания мультимедийных таймеров - около 10 миллисекунд против 50 миллисекунд обычных таймеров, устанавливаемых при помощи функции SetTimer. Кроме того, мультимедийные таймеры позволяют использовать обработчики, которые будут срабатывать в нужные интервалы, тогда как сообщения WM_TIMER от обычных таймеров идут через общую очередь. Если главный поток подвис, заснул или продолжительное время реагирует на какое-нибудь тяжелое сообщение, то таймеру придется ожидать, пока обработчик дойдет до него. Таким образом, добиться предсказуемой периодичности таймера будет очень сложно. Мультимедийные таймеры выполняются в собственном потоке, поэтому лишены перечисленных недостатков.Слова словами, но давайте проверим это на практике. Для этого в простом оконном приложении установим обычный таймер на интервал 1 миллисекунду, вместе с этим создадим мультимедийный таймер с таким же интервалом срабатывания. При каждом срабатывании каждого из этих таймеров будет увеличен соответствующий счетчик. По истечении определенного времени, например, 5 секунд, сравним результаты.
Обработчик окна будет выглядеть примерно так. Для удобства я оставил только минимально необходимый код.
Code (Assembler) : Убрать нумерацию
- cmp [msg],WM_INITDIALOG
- je wminitdialog
- cmp [msg],WM_TIMER
- je wmtimer
- ...
- ...
- wminitdialog:
- ; Обнулить счетчики
- mov [dCntTim],0
- mov [dCntMM],0
- ; Получить начальное время
- invoke GetTickCount
- mov [dTime],eax
- ; Установить обычный таймер на интервал 1 мс
- invoke SetTimer,[hwnddlg],1,1,NULL
- ; Установить мультимедийный таймер на интервал 1 мс
- TIME_PERIODIC = 0x0001
- invoke timeSetEvent,1,1,TimeProc,777,TIME_PERIODIC
- ...
- ...
- wmtimer:
- ; Увеличить счетчик по событию WM_TIMER
- inc [dCntTim]
- ; Прошло 5 секунд?
- invoke GetTickCount
- sub eax,[dTime]
- cmp eax,5000
- jb processed
- jmp wmclose
- wmclose:
- ; Удалить оба счетчика
- invoke KillTimer,[hwnddlg],1
- invoke timeKillEvent,[hTimer]
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; Обработчик высокоточного таймера
- ;-----------------------------------------------------------
- proc TimeProc uTimerID:DWORD,uMsg:DWORD,dwUser:DWORD,dw1:DWORD,dw2:DWORD
- ; Увеличить счетчик по системному событию
- inc [dCntMM]
- ret
- endp
Читать статью целиком »
Просмотров: 312 | Комментариев: 3

Передача данных приложению с помощью WM_DROPFILES
09.07.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Обрабатывать перетаскивание файлов в окно программы мы уже умеем, а сегодня узнаем, как сэмулировать это действие, то есть передать стороннему приложению список файлов через отправку сообщения WM_DROPFILES.Начинаем с описания структуры DROPFILES, потому что FASM про нее ничего не знает. Так часто приходится писать подобное, что впору уже вводить какую-нибудь аббревиатуру, типа "Самостоятельно Описываем Структуры, Недостающие Интерфейсы, Константы Ассемблера" - "С.О.С.Н.И.К.А". Шутка.
Code (Assembler) : Убрать нумерацию
- struct DROPFILES
- pFiles dd ?
- pt POINT
- fNC dw ?
- fWide dw ?
- ends
Ну и сам код. Определяем размер и выделяем память, заполняем структуру и имена файлов, отправляем сообщение целевому окну.
Code (Assembler) : Убрать нумерацию
- ; Размер структуры DROPFILES
- mov ebx,sizeof.DROPFILES
- inc ebx
- ; Длина имени первого файла
- invoke lstrlen,file1
- add ebx,eax
- inc ebx
- ; Длина имени второго файла
- invoke lstrlen,file2
- add ebx,eax
- inc ebx
- ; Выделить память
- invoke GlobalAlloc,GMEM_SHARE+GMEM_MOVEABLE+GMEM_ZEROINIT,ebx
- mov [mem],eax
- invoke GlobalLock,eax
- mov [dfiles],eax
- ; Заполнить структуру DROPFILES
- mov edi,[dfiles]
- mov [edi+DROPFILES.pFiles],sizeof.DROPFILES
- mov [edi+DROPFILES.pt.x],0
- mov [edi+DROPFILES.pt.y],0
- mov [edi+DROPFILES.fNC],FALSE
- mov [edi+DROPFILES.fWide],FALSE
- add edi,sizeof.DROPFILES
- ; Дописать к ней передаваемые файлы
- mov esi,file1
- @@:
- lodsb
- stosb
- or al,al
- jnz @b
- mov esi,file2
- @@:
- lodsb
- stosb
- or al,al
- jnz @b
- ; Завершающий нулевой байт
- xor eax,eax
- stosb
- ; Отправить сообщение WM_DROPFILES
- invoke GlobalUnlock,[mem]
- invoke PostMessage,[destination_window],WM_DROPFILES,[mem],0
- invoke GlobalFree,[mem]
Читать статью целиком »
Просмотров: 248 | Комментариев: 0

Как в Windows 7 установить разные обои на разные мониторы
04.07.2020 | Категория: Software | Автор: ManHunter

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

Анимированные обои для рабочего стола Windows 7
22.06.2020 | Категория: Software | Автор: ManHunter

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

Как отключить блокировку компьютера в Windows
04.06.2020 | Категория: Software | Автор: ManHunter

Как отключить блокировку компьютера в Windows
Блокировка компьютера - обычная мера защиты системы от посторонних глаз и шаловливых рук, когда вам надо ненадолго отойти от компьютера. А можно ли вообще отключить эту блокировку? Честно говоря, я не придумал, для каких случаев это может понадобиться, но на всякий случай расскажу, как это сделать.
Читать статью целиком »
Просмотров: 876 | Комментариев: 5
