Blog. Just Blog

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

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

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

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.         ...
Если нужно с самого начала просто убрать программу из панели задач, то при инициализации окна вместо обнуления родительского хэндла на эту роль сразу назначается рабочий стол.

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

Получение списка удаленных файлов в Корзине

22.08.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Удалять файлы в Корзину мы уже научились, теперь давайте разберем, как можно получить список удаленных объектов, которые в этой Корзине находятся. С чего начнем? Ну конечно же с описания кучи структур, интерфейсов и констант, которые нам понадобятся.
  1. ; GUID {43826D1E-E718-42EE-BC55-A1E261C37BFE}
  2. IID_IShellItem      dd 043826D1Eh
  3.                     dw 0E718h
  4.                     dw 042EEh
  5.                     db 0BCh, 055h, 0A1h, 0E2h, 061h, 0C3h, 07Bh, 0FEh
  6.  
  7. ; GUID {93F2F68C-1D1B-11D3-A30E-00C04F79ABD1}
  8. IID_IShellFolder2   dd 093F2F68Ch
  9.                     dw 01D1Bh
  10.                     dw 011D3h
  11.                     db 0A3h, 00Eh, 000h, 0C0h, 04Fh, 079h, 0ABh, 0D1h
  12.  
  13. ; IID_IShellFolder2 Interface
  14. struct IShellFolder2
  15.     QueryInterface      dd ?
  16.     AddRef              dd ?
  17.     Release             dd ?
  18.  
  19.     ; IShellFolder
  20.     ParseDisplayName    dd ?
  21.     EnumObjects         dd ?
  22.     BindToObject        dd ?
  23.     BindToStorage       dd ?
  24.     CompareIDs          dd ?
  25.     CreateViewObject    dd ?
  26.     GetAttributesOf     dd ?
  27.     GetUIObjectOf       dd ?
  28.     GetDisplayNameOf    dd ?
  29.     SetNameOf           dd ?
  30.  
  31.     ; IShellFolder2
  32.     GetDefaultSearchGUID  dd ?
  33.     EnumSearches          dd ?
  34.     GetDefaultColumn      dd ?
  35.     GetDefaultColumnState dd ?
  36.     GetDetailsEx          dd ?
  37.     GetDetailsOf          dd ?
  38.     MapColumnToSCID       dd ?
  39. ends
  40.  
  41. ; IID_IEnumIDList Interface
  42. struct IEnumIDList
  43.     QueryInterface      dd ?
  44.     AddRef              dd ?
  45.     Release             dd ?
  46.  
  47.     Next                dd ?
  48.     Skip                dd ?
  49.     Reset               dd ?
  50.     Clone               dd ?
  51. ends
  52.  
  53. struct STRRET
  54.     uType dd ?
  55.     union
  56.         pOleStr dd ?
  57.         uOffset dd ?
  58.         cStr    rb 260
  59.     ends
  60. ends
  61.  
  62. struct SHCOLUMNID
  63.      fmtid rb 16
  64.      pid   dd ?
  65. ends
  66.  
  67. S_OK               = 0
  68. CSIDL_BITBUCKET    = 0Ah
  69. SHCONTF_FOLDERS    = 20h
  70. SHCONTF_NONFOLDERS = 40h
  71. SHGDN_NORMAL       = 0
  72. SHGDN_INFOLDER     = 1
  73. SHGDN_FOREDITING   = 1000h
  74. SHGDN_FORPARSING   = 8000h
  75. PID_DISPLACED_FROM = 2
  76. PID_DISPLACED_DATE = 3
  77. PKEY_SIZE          = 12
  78.  
  79. PSGUID_DISPLACED   dd 09B174B33h
  80.                    dw 040FFh
  81.                    dw 011D2h
  82.                    db 0A2h, 07Eh, 000h, 0C0h, 04Fh, 0C3h, 008h, 071h
  83.  
  84. PKEY_Size dd 0B725F130h
  85.           dw 047EFh
  86.           dw 0101Ah
  87.           db 0A5h, 0F1h, 002h, 060h, 08Ch, 09Eh, 0EBh, 0ACh
Для доступа к Корзине сперва надо получить объект рабочего стола, а уже через него определить объект Корзины. После этого поочередно получаем объекты ее содержимого и выполняем с ними нужные действия.
  1.         ; Инициализировать COM-объект
  2.         invoke  CoInitialize,NULL
  3.         invoke  SHGetSpecialFolderLocation,NULL,CSIDL_BITBUCKET,pidl
  4.         invoke  SHGetDesktopFolder,psfDesktop
  5.  
  6.         ; Получить объект папки Корзины
  7.         mov     eax,[psfDesktop]
  8.         mov     eax,[eax]
  9.         stdcall dword [eax+IShellFolder2.BindToObject],[psfDesktop],\
  10.                 [pidl],NULL,IID_IShellFolder2,psfRecycleBin
  11.  
  12.         ; Обработать содержимое Корзины
  13.         mov     eax,[psfRecycleBin]
  14.         mov     eax,[eax]
  15.         stdcall dword [eax+IShellFolder2.EnumObjects],[psfRecycleBin],\
  16.                 NULL,SHCONTF_FOLDERS+SHCONTF_NONFOLDERS,peidl
  17.  
  18. loc_next:
  19.         ; Очередной элемент содержимого Корзины
  20.         mov     eax,[peidl]
  21.         mov     eax,[eax]
  22.         stdcall dword [eax+IEnumIDList.Next],[peidl],1,pidlItem,NULL
  23.         ; Больше ничего нет
  24.         or      eax,eax
  25.         jnz     loc_done
  26.  
  27.         ; Выполнить необходимые действия с объектом
  28.         ...
  29.         ...
  30.         ...
  31.  
  32.         jmp     loc_next
  33.  
  34. loc_done:
  35.         ; Прибраться за собой
  36.         mov     eax, [psfRecycleBin]
  37.         mov     eax, [eax]
  38.         stdcall dword [eax+IShellFolder2.Release],[psfRecycleBin]
  39.  
  40.         mov     eax, [psfDesktop]
  41.         mov     eax, [eax]
  42.         stdcall dword [eax+IShellFolder2.Release],[psfDesktop]
  43.  
  44.         invoke  CoTaskMemFree,[pidl]
  45.  
  46.         ; Удалить объект
  47.         invoke  CoUninitialize
Получив очередной объект, можно узнать его свойства. Это может быть имя файла, его исходное месторасположение, нынешнее имя в Корзине, дата удаления, размер файла.

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

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

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.

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

Как получить список ярлыков на рабочем столе

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

Как получить список ярлыков на рабочем столе

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

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

Как узнать, что системе требуется перезагрузка после установки обновлений

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

Как узнать, что системе требуется перезагрузка после установки обновлений

Ранее я рассказывал, как можно отключить принудительную перезагрузку при установке обновлений Windows. Сегодня копнем немного глубже, а именно научимся программно определять, что система ожидает эту самую перезагрузку. Зачем это нужно? Например, такое состояние означает, что некоторые файлы из пакета обновлений установлены не до конца, а значит лучше не производить никаких рискованных действий типа массированных инсталляций.

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

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