1

Тема: AHK: Проверка содержимого корзины

Возможно ли узнать, есть ли что-то в Корзине, и, если да, что именно?
Если второе нереализуемо, то интересует хотя бы первая часть.

2 (изменено: creature.ws, 2012-03-20 23:29:56)

Re: AHK: Проверка содержимого корзины

VarSetCapacity(SHQRB,20)
NumPut(20,SHQRB)
DllCall("shell32\SHQueryRecycleBinA","STR","C:\Windows","Uint",&SHQRB)
MsgBox % "`nTotal Bytes: " NumGet(SHQRB,4,"Int64") " (" Round(NumGet(SHQRB,4,"Int64")/1024/1024,0) " MB)"

Пример с офсайта, работающий, вероятно, на ahk-basic.
Возможно, кто-то адаптирует под ahk-l unicode x86-x64

3

Re: AHK: Проверка содержимого корзины

Если нужно узнать размер корзины на всех дисках, первым параметром нужно послать 0, иначе — путь к диску, например "C:" (обязательно в кавычках).

GetRecycleBinContent(0, Size, NumItems)
MsgBox, % "Размер в байтах — " Size "`nКоличество объектов — " NumItems

GetRecycleBinContent(RootPath, ByRef Size, ByRef NumItems)
{
   VarSetCapacity(SHQRB, 20)
   NumPut(20, SHQRB)
   DllCall("shell32\SHQueryRecycleBin" . (A_IsUnicode ? "W" : "A")
      , RootPath = 0 ? "UInt" : "Str" , RootPath, Ptr, &SHQRB)
   Size := NumGet(SHQRB, 4, "Int64")
   NumItems := NumGet(SHQRB, 12, "Int64")
}

Или через COM (для всех дисков):

oShell := ComObjCreate("Shell.Application")
oFolder := oShell.NameSpace(ssfBITBUCKET := 0xA)
 
for Item in oFolder.Items
   Items .= Item.Name . "   Size in bytes = " . Item.Size . "`n"
 
MsgBox, % SubStr(Items, 1, -1)

В последнем случае размеры для папок не определяются (по-крайней мере на XP).

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4 (изменено: creature.ws, 2012-03-21 03:03:03)

Re: AHK: Проверка содержимого корзины

Первый пример отображает размер и количество файлов в корзине при использовании ahk_l unicode x86 win XP, но не ahk_l unicode x64 win7.
Второй и на win7 размеры папок не определяет.

5

Re: AHK: Проверка содержимого корзины

GetRecycleBinContent(0, Size, NumItems)
MsgBox, % "Размер в байтах — " Size "`nКоличество объектов — " NumItems
 
GetRecycleBinContent(RootPath, ByRef Size, ByRef NumItems)
{
   NumPut(VarSetCapacity(SHQRB, A_PtrSize = 4 ? 20 : 24), SHQRB)
   DllCall("shell32\SHQueryRecycleBin" . (A_IsUnicode ? "W" : "A")
      , RootPath = 0 ? "UInt" : "Str", RootPath, Ptr, &SHQRB)
   Size := NumGet(SHQRB, A_PtrSize = 4 ? 4 : 8, "Int64")
   NumItems := NumGet(SHQRB, A_PtrSize = 4 ? 12 : 16, "Int64")
}

А так?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6 (изменено: creature.ws, 2012-03-21 03:19:40)

Re: AHK: Проверка содержимого корзины

Так — работает корректно. Спасибо
Заодно стало понятно зачем в начало SHQRB записывается некое число.

7

Re: AHK: Проверка содержимого корзины

Про выравнивание забыл

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Проверка содержимого корзины

А получится перемещать из Корзины в определённую папку последний удалённый в неё объект? Нужно для перемещения файлов из окон тех программ, которые перемещение не поддерживают.
Вопрос, кажется, специфический, потому тему решил не создавать.

9

Re: AHK: Проверка содержимого корзины

На правах метода альтернативного перемещению через корзину

Если из окна программы файл можно поместить в корзину, вероятно его возможно и скопировать?
После «копирования в буфер» в Clipboard можно увидеть путь к «скопированным файлам».

10

Re: AHK: Проверка содержимого корзины

Я чаю, обжекция сия на момент перемещения может программой вельми использоваться, окромя того, останется видна в ея списке. Но что уже сверх того не пригоже — путь до обжекции отнюдь не будет удалён из базы, если программа оную ведёт.
Зело могу ошибаться

11

Re: AHK: Проверка содержимого корзины

С помощью COM скорее всего можно. Подождём специалистов.