AHK: Определить процесс выделенного файла и закрыть его (Страница 1 из 2)
Доброго времени суток . Помогите определить процесс выделенного файла и закрыть его . Приведённый ниже скрипт работает, на активное окно.
2 Ответ от teadrinker 2014-03-08 10:43:11- teadrinker
- Администратор
- Неактивен
А какой конкретно файл — exe, скрипт, или другой какой?
3 Ответ от Ядрён 2014-03-08 15:40:17 (изменено: Ядрён, 2014-03-08 15:42:04)- Ядрён
- Участник
- Неактивен
Здравствуйте, а можно два варианта и exe и ahk. Но если очень трудно, то только exe.
4 Ответ от teadrinker 2014-03-08 17:57:46- teadrinker
- Администратор
- Неактивен
Сегодня не получится уже, завтра.
5 Ответ от Ядрён 2014-03-08 18:06:51- Ядрён
- Участник
- Неактивен
Сегодня не получится уже, завтра.
Завтра , значит завтра.
6 Ответ от teadrinker 2014-03-09 20:21:45- teadrinker
- Администратор
- Неактивен
Так примерно, но особо не тестировал:
Работает со множественным выделением.
7 Ответ от Ядрён 2014-03-09 22:58:37- Ядрён
- Участник
- Неактивен
Здравствуйте teadrinker ваш скрипт не работает.
8 Ответ от teadrinker 2014-03-09 23:02:55- teadrinker
- Администратор
- Неактивен
А как вы пробовали?
9 Ответ от Ядрён 2014-03-09 23:18:54 (изменено: Ядрён, 2014-03-09 23:32:34)- Ядрён
- Участник
- Неактивен
Не работает с ярлыками программ и на рабочем столе не работает , а так работает. Большое спасибо и извините за путаницу. А можно как нибудь сделать что бы на рабочем столе работало?
10 Ответ от teadrinker 2014-03-09 23:28:49- teadrinker
- Администратор
- Неактивен
Не работает с ярлыками программ и на рабочем столе не работает
А, да, забыл предупредить. Посмотрю, как на рабочем столе можно путь получить.
11 Ответ от Ядрён 2014-03-09 23:33:33- Ядрён
- Участник
- Неактивен
Не работает с ярлыками программ и на рабочем столе не работает
А, да, забыл предупредить. Посмотрю, как на рабочем столе можно путь получить.
Было бы неплохо если бы работало на рабочем столе.
12 Ответ от teadrinker 2014-03-10 02:05:47- teadrinker
- Администратор
- Неактивен
Вот так должно работать на рабочем столе и с ярлыками:
13 Ответ от Ядрён 2014-03-10 02:43:00- Ядрён
- Участник
- Неактивен
Огромное вам спасибо teadrinker.Скрипт надо бы в коллекцию закинуть.
14 Ответ от teadrinker 2014-03-10 03:10:47- teadrinker
- Администратор
- Неактивен
Скрипт надо бы в коллекцию закинуть.
Не знаю, способ получения выделенных файлов с рабочего стола — посыл Ctrl + C — считается "кривым", но лучшего не обнаружил, может, подскажет кто.
15 Ответ от Ядрён 2014-03-10 03:46:45 (изменено: Ядрён, 2014-03-10 23:55:48)- Ядрён
- Участник
- Неактивен
Скрипт надо бы в коллекцию закинуть.
Не знаю, способ получения выделенных файлов с рабочего стола — посыл Ctrl + C — считается "кривым", но лучшего не обнаружил, может, подскажет кто.
Я сделал через контекстное меню правой кнопки мыши , запуск скомпилированного скрипта. Получается файл уже выделен когда нажимаешь правую кнопку мыши. Кстати скрипт на добавление пункта в контекстное меню я тоже выложил у нас на форуме.
16 Ответ от многобанофф 2014-03-10 09:14:52- многобанофф
- Участник
- Неактивен
- Рейтинг : [ 0 | 0 ]
Скрипт надо бы в коллекцию закинуть.
Не знаю, способ получения выделенных файлов с рабочего стола — посыл Ctrl + C — считается "кривым", но лучшего не обнаружил, может, подскажет кто.
Скорее всего напишу глупость, но самому немного интересно. При выделении файла на рабочем столе в c:\Documents and Settings\Username\Рабочий стол\ что-нибудь меняется? И если нет, то чем исчерпывается соответствие - только наличием объектов?
17 Ответ от teadrinker 2014-03-11 14:35:37- teadrinker
- Администратор
- Неактивен
Выделение объекта в окне имеет отношение только к отображению этого объекта в данном окне, на сам объект и на отображение его в других окнах никак не влияет.
18 Ответ от serzh82saratov 2014-03-21 23:41:09- serzh82saratov
- Разработчик
- Неактивен
Скрипт надо бы в коллекцию закинуть.
Не знаю, способ получения выделенных файлов с рабочего стола — посыл Ctrl + C — считается "кривым", но лучшего не обнаружил, может, подскажет кто.
Мне такая библиотека помогает:
19 Ответ от teadrinker 2014-03-24 05:06:17- teadrinker
- Администратор
- Неактивен
Мне такая библиотека помогает
Не отличает ярлык на рабочем столе от обычного файла.
20 Ответ от stealzy 2014-03-24 18:50:50 (изменено: stealzy, 2014-03-25 18:38:12)- stealzy
- Разработчик
- Неактивен
определить процесс выделенного файла и закрыть его
Для ручного использования советую Unlocker 1.8.7 или IObitUnloker (может не знает человек)
21 Ответ от teadrinker 2014-03-24 19:13:17- teadrinker
- Администратор
- Неактивен
stealzy, а как здесь Unlocker поможет?
22 Ответ от teadrinker 2014-03-25 08:34:03- teadrinker
- Администратор
- Неактивен
У меня с Unlocker`ом так выглядит:
Файл скрипта при запуске не блокируется, да и из предложенных операций делать с ним ничего не нужно.
23 Ответ от serzh82saratov 2014-05-24 17:40:14- serzh82saratov
- Разработчик
- Неактивен
Скрипт надо бы в коллекцию закинуть.
Не знаю, способ получения выделенных файлов с рабочего стола — посыл Ctrl + C — считается "кривым", но лучшего не обнаружил, может, подскажет кто.
Возможно придумал способ, но банально не могу проверить наличие %info% в %Selected%, у строк почему то разная длинна, и так и эдак перекодировал строки, не понятно.
24 Ответ от serzh82saratov 2014-05-24 23:25:03 (изменено: serzh82saratov, 2014-05-25 00:43:48)- serzh82saratov
- Разработчик
- Неактивен
Без сравнения дат работает, по идее оно и не обязательно, повтора быть не должно. Определяет и папки и ярлыки. Активность или видимость окна Program Manager не требуется.
Но конечно очень любопытно, почему в контексте этого кода, тут ложь:
25 Ответ от teadrinker 2014-05-25 01:10:14- teadrinker
- Администратор
- Неактивен
serzh82saratov, интересно, посмотрю подробнее и добавлю попозже.
26 Ответ от teadrinker 2014-05-25 03:31:27- teadrinker
- Администратор
- Неактивен
не могу проверить наличие %info% в %Selected%, у строк почему то разная длинна
Там в ListSelected ещё какие-то непечатные символы добавлены перед датой и между её цифрами:
27 Ответ от serzh82saratov 2014-05-25 04:19:30- serzh82saratov
- Разработчик
- Неактивен
Видимо в SysListView так забито.
28 Ответ от teadrinker 2014-05-25 13:57:29- teadrinker
- Администратор
- Неактивен
В смысле, пробелы между строчками убрал?
29 Ответ от serzh82saratov 2014-05-25 14:05:35- serzh82saratov
- Разработчик
- Неактивен
Убрал определение папки, лишнее получение объекта.Заменил Program Manager ahk_class Progman ahk_exe explorer.exe на более простое % "ahk_id" DllCall("GetShellWindow").Кстати может лучше так:
30 Ответ от teadrinker 2014-05-25 14:16:15- teadrinker
- Администратор
- Неактивен
Не принципиально, лишь бы работало. А что за "Win+D mode"? Там класс окна меняется?
31 Ответ от serzh82saratov 2014-05-25 14:25:13- serzh82saratov
- Разработчик
- Неактивен
А что за "Win+D mode"? Там класс окна меняется?
Сначала сделал просто Program Manager ahk_class Progman ahk_exe explorer.exe.Потом заметил что если свернуть все окна кнопкой TrayShowDesktopButtonWClass1 справа внизу оно же Win+D, то не работает. Потом подсмотрел в библиотеке Explorer.Почему класс меняется - одну Биллу известно, сначала думал что задача определить хэндл ListView более тривиальна.
32 Ответ от teadrinker 2014-05-25 14:42:35- teadrinker
- Администратор
- Неактивен
Только что заметил, что objFolder.ParseName(A_LoopFileName) не все ярлыки видит. У меня есть один ярлык, созданный самой программой при установке (IE HTML Element Spy), его в упор не замечает.
33 Ответ от serzh82saratov 2014-05-25 14:47:44 (изменено: serzh82saratov, 2014-05-25 14:48:40)- serzh82saratov
- Разработчик
- Неактивен
В смысле его нет как файла в Loop, %A_Desktop%\*.*, 1, или GetDetailsOf пустое.И как он выглядит в ListSelected.
34 Ответ от teadrinker 2014-05-25 14:49:43- teadrinker
- Администратор
- Неактивен
Ага, точно, его нет в папке рабочего стола:
Зато он есть в папке C:\Users\Public\Desktop (общий рабочий стол):
Наверное, и её проверять нужно.
35 Ответ от serzh82saratov 2014-05-25 15:05:09- serzh82saratov
- Разработчик
- Неактивен
- teadrinker
- Администратор
- Неактивен
Ага, так работает.
37 Ответ от serzh82saratov 2014-05-25 15:22:29- serzh82saratov
- Разработчик
- Неактивен
Не совсем, если 2 файла одинаковых в этих папках Сейчас подумаю.
38 Ответ от serzh82saratov 2014-05-25 15:32:17- serzh82saratov
- Разработчик
- Неактивен
Если оба файла скрыты, то видимо ничего не поделаешь.
39 Ответ от teadrinker 2014-05-25 16:00:20- teadrinker
- Администратор
- Неактивен
Не совсем понял. Если они скрыты, то как их можно выделить?
40 Ответ от serzh82saratov 2014-05-25 19:05:32- serzh82saratov
- Разработчик
- Неактивен
Я про атрибут "скрытый". Вообщем не важно. Можно всё таки добавить сравнение дат, останется только вероятность что одинаковые файлы изменены в одну секунду.
41 Ответ от teadrinker 2014-05-25 21:09:47- teadrinker
- Администратор
- Неактивен
Можно, придётся сравнивать дату по частям.
42 Ответ от serzh82saratov 2014-05-25 23:29:07 (изменено: serzh82saratov, 2014-05-25 23:29:42)- serzh82saratov
- Разработчик
- Неактивен
Зачем по частям, можно привести ListSelected в "порядок", правда не очень симпатяшно:
43 Ответ от serzh82saratov 2014-05-25 23:44:34- serzh82saratov
- Разработчик
- Неактивен
- serzh82saratov
- Разработчик
- Неактивен
Check the command list exposed to SAPI by Windows Explorer. This may be a good candidate to solve with a file association if explorer exposes verbs from file associations.
Anyway, if you want to launch a program to find currently selected desktop items, you can use IFolderView2::GetSelectedItem on the desktop shell view to get the selected indices, then call IShellItem::GetDisplayName with SIGDN_FILESYSPATH on each item from IFolderView2::GetItem. On XP you can try send the undocumented WM_GETISHELLBROWSER message to the desktop window, then call IShellFolders::GetDisplayName on the items returned from IShellFolderView::GetSelectedObject.
Но примера создания объекта IFolderView2, нигде не видел.
45 Ответ от teadrinker 2014-05-26 00:45:56- teadrinker
- Администратор
- Неактивен
- serzh82saratov
- Разработчик
- Неактивен
Смеёшься, нет конечно, на тебя вся надежда.
47 Ответ от teadrinker 2014-05-26 00:49:05- teadrinker
- Администратор
- Неактивен
- serzh82saratov
- Разработчик
- Неактивен
- teadrinker
- Администратор
- Неактивен
Да нет, не поможет. То, о чём шла речь в той подсказке, не является "Scriptable Shell Objects". Это так называемые Raw Com-интерфейсы, использовать в скриптах которые можно только после некоторых танцев с бубнами. И я не уверен, что подсказка верная, никакой информации, как получить IFolderView2-интерфейс для рабочего стола не нашёл. Всё же, речь идёт о Shell-интерфейсах, а окно рабочего стола Shell-объектом не является, вроде.
50 Ответ от serzh82saratov 2014-05-26 13:40:37- serzh82saratov
- Разработчик
- Неактивен
Странно что упоминаний про IFolderView2 нет на офф форуме. Здесь может по теме - http://www.autohotkey.com/board/topic/5 … ntry434509
51 Ответ от serzh82saratov 2014-05-26 13:44:11 (изменено: serzh82saratov, 2014-05-26 13:52:55)- serzh82saratov
- Разработчик
- Неактивен
- serzh82saratov
- Разработчик
- Неактивен
Тут вроде тоже мучаются с IFolderView2.
53 Ответ от YMP 2014-05-26 14:04:00- YMP
- Разработчик
- Неактивен
А зачем мучиться, если можно почитать описание интерфейса?
54 Ответ от serzh82saratov 2014-05-26 14:16:15- serzh82saratov
- Разработчик
- Неактивен
YMP Можете привести пример получения объекта IFolderView2, и работы с ним?
55 Ответ от teadrinker 2014-05-26 14:27:21- teadrinker
- Администратор
- Неактивен
Так там речь, я так понимаю, не об окне "Рабочий стол", а о папке "Рабочий стол". Может, я ошибаюсь, конечно.
56 Ответ от serzh82saratov 2014-05-26 14:29:30- serzh82saratov
- Разработчик
- Неактивен
Тебе виднее, а по ссылке из #50 ничего?
57 Ответ от teadrinker 2014-05-26 14:32:56- teadrinker
- Администратор
- Неактивен
Ещё подробно не смотрел, но не похоже.
58 Ответ от serzh82saratov 2014-05-26 14:37:33- serzh82saratov
- Разработчик
- Неактивен
А это какое то отношение может иметь http://msdn.microsoft.com/en-us/library … s.85).aspx? Может где то в памяти процесса искать.
59 Ответ от teadrinker 2014-05-26 14:40:55- teadrinker
- Администратор
- Неактивен
А зачем мучиться, если можно почитать описание интерфейса?
К сожалению, в описаниях интерфейса ничего не сказано, как его получать.
60 Ответ от YMP 2014-05-26 15:12:56- YMP
- Разработчик
- Неактивен
Любой COM-объект имеет интерфейс IUnknown, а у него первый метод — QueryInterface, как раз для получения других интерфейсов.
61 Ответ от teadrinker 2014-05-26 15:25:45- teadrinker
- Администратор
- Неактивен
Так вопрос даже не столько в том, как его просто получить, а как привязать к конкретному объекту, в данном случае к окну рабочего стола (если это возможно, конечно).
62 Ответ от YMP 2014-05-26 15:50:22- YMP
- Разработчик
- Неактивен
Что значит привязать?
63 Ответ от teadrinker 2014-05-26 16:02:48- teadrinker
- Администратор
- Неактивен
Нас сейчас интересует интерфейс IFolderView2. У него есть методы GetSelectedItem и GetSelection. Нужно, чтобы они отражали состояние объектов окна Рабочий стол.
64 Ответ от YMP 2014-05-26 18:14:53- YMP
- Разработчик
- Неактивен
Да, это не скриптовый интерфейс. Кроме того он доступен только начиная с Висты. До этого использовался IShellFolderView, но он уже не работает в 7. В принципе методы можно вызывать через DllCall, но, конечно, возни больше, чем со скриптовыми объектами.
65 Ответ от teadrinker 2014-05-26 20:24:28- teadrinker
- Администратор
- Неактивен
Ну, как в принципе вызывать — уже более-менее понятно, хотелось эту задачку решить.
66 Ответ от YMP 2014-05-26 21:39:13- YMP
- Разработчик
- Неактивен
Вот так вроде удаётся получить указатель на IFolderView2. Дальше копать пока не стал, спать охота.
67 Ответ от ypppu 2014-05-26 22:18:49- ypppu
- Модератор
- Неактивен
Ядрён сумел напрячь умы лучших AHK-кодеров форума!
68 Ответ от teadrinker 2014-05-26 23:11:07- teadrinker
- Администратор
- Неактивен
Дальше копать пока не стал, спать охота.
Мне тоже, уже завтра посмотрю.
69 Ответ от YMP 2014-05-27 09:36:42- YMP
- Разработчик
- Неактивен
Попробовал вызывать методы — возвращают E_FAIL. Причина пока непонятна.
70 Ответ от YMP 2014-05-27 13:22:21- YMP
- Разработчик
- Неактивен
В общем, это всё фигня, наверно. Просто новый экземпляр объекта создаётся. То же самое, как открыть одну папку в двух окнах Проводника. Если в одном окне что-то выделить, другое об этом ничего не узнает.
71 Ответ от teadrinker 2014-05-28 00:29:42- teadrinker
- Администратор
- Неактивен
А ты вообще уверен, что вызывая
ты получаешь pShellFolder для окна рабочего стола, а не для папки "Рабочий стол"? И если да, то почему?
72 Ответ от YMP 2014-05-28 07:24:22 (изменено: YMP, 2014-05-28 07:29:45)- YMP
- Разработчик
- Неактивен
А что такое ShellFolder для окна Рабочего стола? Насколько я понял описательную часть, если программа хочет отобразить содержимое какой-то папки оболочки, она получает объект ShellFolder этой папки, создаёт окно и в нём отображает с помощью этого объекта содержимое папки. Вот это и делает Проводник на Рабочем столе.
Если ты в другом процессе (AutoHotkey) тоже получишь объект ShellFolder для этой папки, то это будет лично твой экземпляр объекта. Ты его можешь использовать для тех же целей, но никакой связи с тем экземпляром, что использует Проводник, у него нет, и, соответственно, тебе никак через него не узнать, что там у Проводника выделено. Поскольку в самой папке это выделение никак не отражается.
А если ты каким-то образом узнаешь указатель на объект, используемый Проводником, то что ты с ним будешь делать? Это адрес в адресном пространстве Проводника, а не в процессе AutoHotkey.