Образ мышления: Assembler
То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал
Образ мышления: Assembler - Карта сайта
Разделение ввода от нескольких клавиатур
23.09.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Разделение ввода от нескольких клавиатур
В одной из прошлых статей мы научились получать список всех устройств, реальных и виртуальных, которые используются для ввода. А можно ли каким-то образом разделять данные, полученные от разных источников? Например, к компьютеру подключены несколько клавиатур и надо определить, на какой именно клавиатуре была нажата клавиша. Ответ - да, можно. Приложение может подписаться на нужные устройства ввода при помощи функции RegisterRawInputDevices. При получении "сырого" ввода от каждого из устройств выбранного типа, система будет посылать приложению сообщение WM_INPUT, а приложению останется его правильно обработать.
Читать статью целиком »
Просмотров: 1385 | Комментариев: 7
Управление отображением программы на панели задач
07.09.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
При скрытии главного окна программы при помощи функции ShowWindow, программа также убирается с панели задач. Тут ничего сложного. А как сделать так, чтобы окно отображалось на экране, но при этом программа не отображалась на панели задач? В некоторых случаях это можно сделать определенной комбинацией стилей окна, например, добавив в расширенный стиль параметр WS_EX_TOOLWINDOW. Но это не всегда приемлемо, чаще всего стиль окна должен оставаться привычным, то есть с заголовком, иконкой, кнопками сворачивания и т.д. Значит нужны программные способы добавить или убрать программу с панели задач.Наиболее простой в реализации способ, который чаще всего рекомендуют использовать, основан на изменении родительского окна. Если у главного окна приложения нет родительского окна, то оно отображается на панели задач. Если в качестве родительского окна указан рабочий стол, то программа убирается из панели задач. На этапе инициализации окна ему присваивается нулевое значение в качестве хэндла родительского окна.
Code (Assembler) : Убрать нумерацию
- .wminitdialog:
- ; Если окно уже имеет родителя, то сбросить значение
- invoke GetWindowLong,[hwnddlg],GWL_HWNDPARENT
- or eax,eax
- jz @f
- invoke SetWindowLong,[hwnddlg],GWL_HWNDPARENT,0
- @@:
Code (Assembler) : Убрать нумерацию
- .taskbar_show:
- ; Добавить программу на панели задач
- invoke SetWindowLong,[hwnddlg],GWL_HWNDPARENT,0
- ...
- .taskbar_hide:
- ; Убрать программу с панели задач
- invoke GetDesktopWindow
- invoke SetWindowLong,[hwnddlg],GWL_HWNDPARENT,eax
- ...
Читать статью целиком »
Просмотров: 1233 | Комментариев: 9
Как убрать прямоугольник фокуса с элемента BUTTON
04.09.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Как убрать прямоугольник фокуса с элемента BUTTON
При получении фокуса элементами диалогового окна типа BUTTON, они выделяются прямоугольной пунктирной рамкой. К таким элементам относятся простые кнопки, чекбоксы или радиопереключатели. Это хорошо и правильно, так как является стандартным поведением системы. Но сегодня я расскажу, как избавиться от этой рамки при фокусировке. Зачем это нужно? Ну, например, если вы используете собственную стилизацию элементов управления диалогового окна и не хотите, чтобы система влияла на их отображение. Или же вам просто не нравятся пунктирные прямоугольники на элементах. Лично я как раз отношусь к этой категории :)
Читать статью целиком »
Просмотров: 1134 | Комментариев: 4
Получение списка удаленных файлов в Корзине
22.08.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Удалять файлы в Корзину мы уже научились, теперь давайте разберем, как можно получить список удаленных объектов, которые в этой Корзине находятся. С чего начнем? Ну конечно же с описания кучи структур, интерфейсов и констант, которые нам понадобятся.Code (Assembler) : Убрать нумерацию
- ; GUID {43826D1E-E718-42EE-BC55-A1E261C37BFE}
- IID_IShellItem dd 043826D1Eh
- dw 0E718h
- dw 042EEh
- db 0BCh, 055h, 0A1h, 0E2h, 061h, 0C3h, 07Bh, 0FEh
- ; GUID {93F2F68C-1D1B-11D3-A30E-00C04F79ABD1}
- IID_IShellFolder2 dd 093F2F68Ch
- dw 01D1Bh
- dw 011D3h
- db 0A3h, 00Eh, 000h, 0C0h, 04Fh, 079h, 0ABh, 0D1h
- ; IID_IShellFolder2 Interface
- struct IShellFolder2
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- ; IShellFolder
- ParseDisplayName dd ?
- EnumObjects dd ?
- BindToObject dd ?
- BindToStorage dd ?
- CompareIDs dd ?
- CreateViewObject dd ?
- GetAttributesOf dd ?
- GetUIObjectOf dd ?
- GetDisplayNameOf dd ?
- SetNameOf dd ?
- ; IShellFolder2
- GetDefaultSearchGUID dd ?
- EnumSearches dd ?
- GetDefaultColumn dd ?
- GetDefaultColumnState dd ?
- GetDetailsEx dd ?
- GetDetailsOf dd ?
- MapColumnToSCID dd ?
- ends
- ; IID_IEnumIDList Interface
- struct IEnumIDList
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- Next dd ?
- Skip dd ?
- Reset dd ?
- Clone dd ?
- ends
- struct STRRET
- uType dd ?
- union
- pOleStr dd ?
- uOffset dd ?
- cStr rb 260
- ends
- ends
- struct SHCOLUMNID
- fmtid rb 16
- pid dd ?
- ends
- S_OK = 0
- CSIDL_BITBUCKET = 0Ah
- SHCONTF_FOLDERS = 20h
- SHCONTF_NONFOLDERS = 40h
- SHGDN_NORMAL = 0
- SHGDN_INFOLDER = 1
- SHGDN_FOREDITING = 1000h
- SHGDN_FORPARSING = 8000h
- PID_DISPLACED_FROM = 2
- PID_DISPLACED_DATE = 3
- PKEY_SIZE = 12
- PSGUID_DISPLACED dd 09B174B33h
- dw 040FFh
- dw 011D2h
- db 0A2h, 07Eh, 000h, 0C0h, 04Fh, 0C3h, 008h, 071h
- PKEY_Size dd 0B725F130h
- dw 047EFh
- dw 0101Ah
- db 0A5h, 0F1h, 002h, 060h, 08Ch, 09Eh, 0EBh, 0ACh
Code (Assembler) : Убрать нумерацию
- ; Инициализировать COM-объект
- invoke CoInitialize,NULL
- invoke SHGetSpecialFolderLocation,NULL,CSIDL_BITBUCKET,pidl
- invoke SHGetDesktopFolder,psfDesktop
- ; Получить объект папки Корзины
- mov eax,[psfDesktop]
- mov eax,[eax]
- stdcall dword [eax+IShellFolder2.BindToObject],[psfDesktop],\
- [pidl],NULL,IID_IShellFolder2,psfRecycleBin
- ; Обработать содержимое Корзины
- mov eax,[psfRecycleBin]
- mov eax,[eax]
- stdcall dword [eax+IShellFolder2.EnumObjects],[psfRecycleBin],\
- NULL,SHCONTF_FOLDERS+SHCONTF_NONFOLDERS,peidl
- loc_next:
- ; Очередной элемент содержимого Корзины
- mov eax,[peidl]
- mov eax,[eax]
- stdcall dword [eax+IEnumIDList.Next],[peidl],1,pidlItem,NULL
- ; Больше ничего нет
- or eax,eax
- jnz loc_done
- ; Выполнить необходимые действия с объектом
- ...
- ...
- ...
- jmp loc_next
- loc_done:
- ; Прибраться за собой
- mov eax, [psfRecycleBin]
- mov eax, [eax]
- stdcall dword [eax+IShellFolder2.Release],[psfRecycleBin]
- mov eax, [psfDesktop]
- mov eax, [eax]
- stdcall dword [eax+IShellFolder2.Release],[psfDesktop]
- invoke CoTaskMemFree,[pidl]
- ; Удалить объект
- invoke CoUninitialize
Читать статью целиком »
Просмотров: 1188 | Комментариев: 7
Программное удаление файла в Корзину
18.08.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Небольшой сниппет - удаление файла или группы файлов в Корзину. Делается это при помощи функции SHFileOperation, но сперва нам надо будет определить необходимую структуру SHFILEOPSTRUCT и несколько констант.Code (Assembler) : Убрать нумерацию
- struct SHFILEOPSTRUCT
- hwnd dd ?
- wFunc dd ?
- pFrom dd ?
- pTo dd ?
- fFlags dw ?
- fAnyOperationsAborted dd ?
- hNameMappings dd ?
- lpszProgressTitle dd ?
- ends
- FO_DELETE = 3h
- FOF_ALLOWUNDO = 40h
- FOF_NOCONFIRMATION = 10h
- FOF_SILENT = 4h
Code (Assembler) : Убрать нумерацию
- mov [fos.hwnd],HWND_DESKTOP
- mov [fos.wFunc],FO_DELETE
- mov [fos.pFrom],fname
- mov [fos.fFlags],FOF_ALLOWUNDO+FOF_NOCONFIRMATION+FOF_SILENT
- invoke SHFileOperation,fos
Читать статью целиком »
Просмотров: 1112 | Комментариев: 1