| View previous topic :: View next topic |
| Author |
Message |
AkulaBig
Joined: 03 Dec 2008 Posts: 616
|
(Separately) Posted: Sun Sep 27, 2026 12:01 Post subject: |
|
|
| Orion9 wrote: | | Может я не ту версию скачал |
У меня одна версия.
| Orion9 wrote: | | Для работы кнопки по алгоритму, который был выше, ControlSetMouseAction должен вызываться (назначаться) только один раз |
Я это уже понял.
| Orion9 wrote: | | Вместо этого кнопка просто меняет состояние глобальной переменной |
Ну у меня значение из инишника читается. Переменная не позволяет запомнить значение.
Ладно, надеюсь все равно разберусь. Я уже понял, что невнимательно разобрался с алгоритмом с первого раза. Назначение должно происходить один раз.
Добавлено спустя 56 минут:
Orion9
Ну все, разобрался. Все отлично работает. Спасибо за помощь. |
|
| Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 1267
|
(Separately) Posted: Sun Sep 27, 2026 13:26 Post subject: |
|
|
| AkulaBig wrote: | | Я уже понял, что невнимательно разобрался с алгоритмом с первого раза |
Да бывает. Я тоже сейчас на трезвую голову посмотрел свой вчерашний алгоритм и увидел в нем косяки. Все-таки видимо два стопарика с утра лишними были.
Более простая и правильная версия функции хука (хотя насколько она правильная еще вопрос)
 Hidden text | Code: | Func KeyboardProc(nCode, wParam, lParam)
Static HC_ACTION = 0
Static hasHintCaps = gHintCaps
Static keyDown = 0, keyUp = 0, isHint = 0, T1, T2
# Передача сообщения следующему хуку
If nCode < HC_ACTION Then
Return DllCall("CallNextHookEx", "Ptr", 0, "Int", nCode, "wParam", wParam, "Ptr", lParam, "Ptr")
EndIf
# OutputDebugString("nCode: " & nCode & " wParam: " & wParam & " lParam: " & lParam)
Local bitUp, bitRepeat
If auX64 Then
bitUp = lParam > 2147483647 ? 1 : 0
Else
bitUp = BitAND(BitShift(lParam, 31), 1)
EndIf
# bitUp = BitAND(BitShift(lParam,16), 0x8000) = 0x8000 ? 1 : 0
# bitRp = BitAND(BitShift(lParam,16), 0x4000) = 0x4000 ? 1 : 0
# Перехват CTRL
If wParam = 0x11 Then
# OutputDebugString("Repeat Count: " & BitAND(lParam, 0xffff) & " bitRepeat: " & bitRp & " bitUp: " & bitUp)
If Not bitUp Then
keyDown += 1
If auX64 And keyDown > 4 Then # отключение CTRL для ТСх64 через 5 повторов
If hasHintCaps Then
Global gHintCaps = false # флаг подсказки MediaInfo для ТСх64
EndIf
If isHint = 0 Then
ShowHint("CTRL отключен", "", "", 400, 1)
isHint = 1
EndIf
Return 1
EndIf
Else
keyUp += 1
keyDown = 0
isHint = 0
If auX64 And hasHintCaps Then
Global gHintCaps = true
EndIf
If Round(GetUptime() - T1, 0) < 400 Then
Local sPath = GetCurrentPath(ItemAtCursor("panel"))
Local sName = sPath & ItemAtCursor("name")
RunThread("MediaInfoHint", sName)
#MsgBox("Файл под курсором: " & sName)
EndIf
T1 = GetUptime()
EndIf
EndIf
# Передача управления следующему хуку в цепочке
Return DllCall("CallNextHookEx", "Ptr", 0, "Int", nCode, "wParam", wParam, "lParam", lParam, "Ptr")
EndFunc
|
Но все работает лучше. Плюс бонус с миганием подсказки о выключеном котроле при долгом зажатии. Теперь сразу видно, когда он срабатывает. Двойной Ctrl тоже работает лучше: пока не видел больше несрабатываний. Если бы еще мультяшную подсказку доделать со страницами и прочим, вообще был бы шик. Но на это пока у меня времени наверное не будет. |
|
| Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 616
|
(Separately) Posted: Sun Sep 27, 2026 13:56 Post subject: |
|
|
Orion9
Надо будет посмотреть. У меня-же важный вопрос с зависанием подсказок из ExifTool так и не решен. Может этот алгоритм как-то поможет. |
|
| Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 1267
|
(Separately) Posted: Sun Sep 27, 2026 14:37 Post subject: |
|
|
| AkulaBig wrote: | | У меня-же важный вопрос с зависанием подсказок из ExifTool так и не решен |
Тут без Loopback не получится. Но он гуляет где-то в ночи, завидую ему. |
|
| Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 616
|
(Separately) Posted: Sun Sep 27, 2026 16:06 Post subject: |
|
|
| Orion9 wrote: | | Тут без Loopback не получится. |
Да не, я не про косяки с разрядностью. Проблема в скорости ExifTool. Она и сама не быстрая и количество обрабатываемой ей инфы для некоторых расширений огромно. В качестве пользовательских столбцов она норм работает. А подсказки-же надо быстро выводить. И вот тут возникает проблема. Если навести и ждать, пока подсказка появится, то-есть скрипт отработает, все норм. А если быстро перемещать от файла к файлу, ТС вешается наглухо. А то и вовсе крашит. Я думаю надо как-то прерывать обработку скрипта, если курсор мыши с него ушел. Скорей всего без хуков здесь не обойтись. Но пока даже идей нет. |
|
| Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 1267
|
(Separately) Posted: Mon Sep 28, 2026 12:10 Post subject: |
|
|
AkulaBig
Похоже Loopback все предусмотрел Есть же отложенная загрузка полей. После Pragma AutorunPluginFields попробуйте поставить SetFieldsParam("Delayed", 1), кажись работает. Я только не понял почему в два прохода, но панель обновляется как надо и в ТС х64.
| AkulaBig wrote: | | А подсказки-же надо быстро выводить |
Да вроде подсказка Exiftool быстро выводится за счет того, что процесс висит в памяти. Я чуть позже еще напишу. |
|
| Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 616
|
(Separately) Posted: Mon Sep 28, 2026 13:27 Post subject: |
|
|
| Orion9 wrote: | | Да вроде подсказка Exiftool быстро выводится |
Не в Exiftool дело, а в огромном количестве данных, которое содержится в обрабатываемых ЕТ расширениях. Представьте, в djvu хранится инфа о каждой странице. Если вам интересно, я могу включить подсказки от ЕТ в сборке, чтобы вы протестировали. У меня они давно сделаны, но сейчас отключены до устранения проблем.
| Orion9 wrote: | | SetFieldsParam("Delayed", 1) |
Спасибо, надо будет попробовать. |
|
| Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 1267
|
|
| Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 616
|
(Separately) Posted: Mon Sep 28, 2026 14:57 Post subject: |
|
|
| Orion9 wrote: | | Это не важно на самом деле. |
Я вам уже приводил пример запароленного файла. Вы назвали это частным случаем И таких файлов полно, на которых подсказка не мгновенно появляется. Не надо тестить файлы изображений и медиа. Тестите файлы документов. На файлах изображений можно сравнить скорость работы MI и ET, но никак ни скорость обработки файлов разных форматов. Если надо, я подготовлю вам небольшой архивчик для тестирования тяжелых файлов.
Блин, представляете. Я-же написал, что и на оф. форуме вопрос про вкл/откл меню задал. Сами понимаете, там в основном Флешер темой владеет. И он мне подсказал ответ. Но его вариант у меня не работал, к тому-же он был для хоткея с клавиатурой. А тут он поинтересовался результатами и я решил проверить. И его вариант работает! И причем как для мыши, так и для клавы. И этот вариант:... ту-ту, бум-бум, напряженная пауза - Return -1! В справке про это написано, но из-за неправильного алгоритма это не работало. Сейчас при правильном алгоритме все работает!
Добавлено спустя 2 часа 26 минут:
Orion9
Блин, подключил для тестирования колонки ЕТ для картинок и у меня скорость вывода не такая быстрая, как у вас. Выложите, пожалуйста. свой код. У меня полностью оформлен. То-есть с перекодировкой крякозябров. Может как-то с этим связано. В общем надо сравнивать с вашим кодом. |
|
| Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 1267
|
(Separately) Posted: Mon Sep 28, 2026 20:13 Post subject: |
|
|
| AkulaBig wrote: |
Я вам уже приводил пример запароленного файла. Вы назвали это частным случаем |
Я потом вспомнил. И правда было такое
Именно для таких случаев и есть таймаут. Когда exiftool.exe не успевает выдавать информацию (по тем или иным причинам), то в тексте подсказки это должно быть как-то видно. А причины могут быть разные, не только зашифррованные и запароленные книги. Это может быть и просто медленный накопитель или битый файл или перегруженный процессор (конкретно в этот период). В общем таймаут в любом случае должен быть.
Мне пришлось немного постараться, чтобы его создать, поэтому на картинке чуть-чуть вырезано
 Hidden text
| AkulaBig wrote: | | Выложите, пожалуйста. свой код. У меня полностью оформлен. То-есть с перекодировкой крякозябров. Может как-то с этим связано. В общем надо сравнивать с вашим кодом. |
Код всё тот же. Ничего с тех пор не поменялось, кроме недавнего хука. Alt+F12 переключает поля подсказки на ExifHint. Кракозабры, как вы видите, есть (подсказка не до конца доделана), но тормоза связаны не с ними. Можете на сборке попробовать, там все настроено, кроме последнего хука, поэтому подсказка в сборке активируется по CapsLock для ТС х64. |
|
| Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 616
|
(Separately) Posted: Mon Sep 28, 2026 20:32 Post subject: |
|
|
| Orion9 wrote: | | Код всё тот же |
Понятно. Придется по новой разбираться. Вроде-же на его основе я и делал. Сейчас проверил в вашей сборке. Даже на документах летает. Насчет тайм-аута потом буду спрашивать. Очень интересно, но сейчас надо с существующим кодом разобраться.
Добавлено спустя 1 час 37 минут:
Orion9
Вроде первоначально разобрался, запустил. Но у вас там через доп. файлы, а не через входной поток. Это меня и смутило. Думал вы через входной поток сделали, раз про него писали. Через входной поток у меня тоже есть, но через DllCall. Через файлы вроде быстро работает. Буду разбираться, почему у меня с задержкой запускается. |
|
| Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 616
|
(Separately) Posted: Tue Sep 29, 2026 06:35 Post subject: |
|
|
Orion9
Нашел, что скорость замедляет. Для чего нужно условие If FieldIndex = 1? Без него и появляются тормоза. |
|
| Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 1267
|
(Separately) Posted: Tue Sep 29, 2026 13:05 Post subject: |
|
|
| AkulaBig wrote: | | там в основном Флешер |
Видимо, хорошо ему там за пазухой у Гислера, раз сюда возвращаться не хочет.
| AkulaBig wrote: | | ту-ту, бум-бум, напряженная пауза - Return -1 |
| AkulaBig wrote: | | И причем как для мыши, так и для клавы |
Наверное, все же только для клавы. Return -1 для ControlSetMouseAction ничего не делает.
| Code: | ControlSetMouseAction /L /K:C /K:S 0 "CompareToolShowMenu"
Func CompareToolShowMenu()
Return -1
EndFunc |
И ключа /S у этой команды тоже нет.
| AkulaBig wrote: | | Думал вы через входной поток сделали, раз про него писали. |
Я тоже так думал, а оказалось, что через файл
Код для stdin/stdout от болвана вроде был, но почему-то я не стал его делать в подсказке. Видимо, решил, что и так сойдет )
Подсказка недоделанная. Иногда в ней проскальзывает что-то лишнее (на последней картинке это хорошо видно). Возможно, как раз из-за временного файла, который не успевает удаляется, или из-за того, что два тотала были в этот момент запущены в одном и том же режиме, надо разбираться.
Как я это вижу, выхлоп нужно разобрать. А для этого нужно очень серьезно разобраться с тегами: какие из них нужны, а какие нет. В идеале можно сделать разделение панели на части и дополнительные модификаторы для фильтрации нужных полей. Например сейчас выхлоп такой.
 Hidden text | Code: | [File] Тип файла : JPEG
[File] Расширение файла : jpg
[File] MIME тип : image/jpeg
[File] Exif – Порядок байтов : Порядок от младшего к старшему (Intel, II)
[File] Комментарий : comment in GIMP 2.4.5
[File] Ширина изображения : 100
[File] Высота изображения : 66
[File] Процесс кодирования : Базовое DCT, кодирование Хаффмана
[File] Количество бит на компонент : 8
[File] Цветовых компонентов : 3
[File] Коэффициент субдискретизации Y Cb Cr: YCbCr4:4:4 (1 1)
[JFIF] Версия JFIF : 1.01
[EXIF] Производитель : NIKON CORPORATION
[EXIF] Модель камеры : NIKON D70
[EXIF] Ориентация : Горизонтальная
[EXIF] Разрешение по X : 240
[EXIF] Разрешение по Y : 240
[EXIF] Единицы разрешения по X и Y : дюймы
[EXIF] Приложение : GIMP 2.4.5
[EXIF] Дата редактирования : 2008:07:31 10:03:44
[EXIF] Выдержка : 1/200
[EXIF] Диафрагменное число : 9.0
[EXIF] Программа экспозиции : Ручная
[EXIF] ISO : 200
[EXIF] Дата съёмки : 2008:03:15 09:52:01
[EXIF] Скорость срабатывания затвора : 1/200
[EXIF] Диафрагма : 9.0
[EXIF] Компенсация экспозиции : -1
[EXIF] Максимальное значение диафрагмы : 3.1
[EXIF] Экспозамер : Центрально-взвешенный
[EXIF] Фокусное расстояние : 100.0 mm
[EXIF] Цветовое пространство : sRGB
[EXIF] Exif – Ширина изображения : 100
[EXIF] Exif – Высота изображения : 66
[EXIF] Фокусное расстояние для 35-мм формата: 150 mm
[EXIF] Метод сжатия : JPEG (старый стиль)
[EXIF] Смещение миниатюры : 596
[EXIF] Строк в миниатюре : 1700
[EXIF] Миниатюра изображения : (Binary data 1700 bytes, use -b option to extract)
[XMP] Версия : 3.0
[XMP] Raw File Name : DSC_1801.NEF
[XMP] Баланс белого : As Shot
[XMP] Цветовая температура : 4250
[XMP] Tint : -3
[XMP] Экспозиция : -0.50
[XMP] Auto Shadows : True
[XMP] Тени : 2
[XMP] Яркость : 50
[XMP] Контрастность : 0
[XMP] Насыщенность : 0
[XMP] Резкость : 85
[XMP] Luminance Smoothing : 0
[XMP] Щумодав – Уменьшение цветных шумов: 25
[XMP] Chromatic Aberration R : 0
[XMP] Chromatic Aberration B : 0
[XMP] Vignette Amount : 0
[XMP] Shadow Tint : 0
[XMP] Red Hue : 0
[XMP] Red Saturation : 0
[XMP] Green Hue : 0
[XMP] Green Saturation : 0
[XMP] Blue Hue : 0
[XMP] Blue Saturation : 0
[XMP] Tone Curve Name : Medium Contrast
[XMP] Tone Curve : 0, 0, 32, 22, 64, 56, 128, 128, 192, 196, 255, 255
[XMP] Camera Profile : ACR 2.4
[XMP] Has Settings : True
[XMP] Has Crop : False
[XMP] Flash Fired : False
[XMP] Flash Return : No return detection
[XMP] Режим вспышки : Unknown
[XMP] Flash Function : False
[XMP] Flash Red Eye Mode : False
[XMP] Native Digest : 36864,40960,40961,37121,37122,40962,40963,37510,40964,36867,36868,33434,33437,34850,34852,34855,34856,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37396,41483,41484,41486,41487,41488,41492,41493,41495,41728,41729,41730,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,42016,0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,28,30;9FF381DCA66CCFA9339F21EAC0493883
[XMP] Объектив : 100.0 mm f/2.8
[XMP] Цветовая модель : RGB
[XMP] Создано в : Adobe Photoshop CS2 Windows
[XMP] Дата оцифровки : 2008:03:15 09:52:01-04:00
[XMP] Метаданные – Дата : 2008:03:15 15:18:33-04:00
[XMP] Document ID : uuid:7378C2F1C0F2DC1196C89D103988A03E
[XMP] Instance ID : uuid:7478C2F1C0F2DC1196C89D103988A03E
[XMP] Формат : image/jpeg
[XMP] Цветовая модель : RGB
[XMP] Название ICC-профиля : sRGB IEC61966-2.1
[XMP] История :
[ICC_Profile] Profile CMM Type : Linotronic
[ICC_Profile] Profile Version : 2.1.0
[ICC_Profile] Profile Class : Display Device Profile
[ICC_Profile] Color Space Data : RGB
[ICC_Profile] Profile Connection Space : XYZ
[ICC_Profile] Profile Date Time : 1998:02:09 06:49:00
[ICC_Profile] Profile File Signature : acsp
[ICC_Profile] Primary Platform : Microsoft Corporation
[ICC_Profile] CMM Flags : Not Embedded, Independent
[ICC_Profile] Device Manufacturer : Hewlett-Packard
[ICC_Profile] Device Model : sRGB
[ICC_Profile] Device Attributes : Reflective, Glossy, Positive, Color
[ICC_Profile] Методы цветового преобразования : Perceptual
[ICC_Profile] Connection Space Illuminant : 0.9642 1 0.82491
[ICC_Profile] Profile Creator : Hewlett-Packard
[ICC_Profile] Profile ID : 0
[ICC_Profile] Авторское право профиля : Copyright (c) 1998 Hewlett-Packard Company
[ICC_Profile] Profile Description : sRGB IEC61966-2.1
[ICC_Profile] Media White Point : 0.95045 1 1.08905
[ICC_Profile] Media Black Point : 0 0 0
[ICC_Profile] Red Matrix Column : 0.43607 0.22249 0.01392
[ICC_Profile] Green Matrix Column : 0.38515 0.71687 0.09708
[ICC_Profile] Blue Matrix Column : 0.14307 0.06061 0.7141
[ICC_Profile] Device Mfg Desc : IEC http://www.iec.ch
[ICC_Profile] Device Model Desc : IEC 61966-2.1 Default RGB colour space - sRGB
[ICC_Profile] Viewing Cond Desc : Reference Viewing Condition in IEC61966-2.1
[ICC_Profile] Viewing Cond Illuminant : 19.6445 20.3718 16.8089
[ICC_Profile] Viewing Cond Surround : 3.92889 4.07439 3.36179
[ICC_Profile] Viewing Cond Illuminant Type : D50
[ICC_Profile] Luminance : 76.03647 80 87.12462
[ICC_Profile] Measurement Observer : CIE 1931
[ICC_Profile] Measurement Backing : 0 0 0
[ICC_Profile] Measurement Geometry : Unknown
[ICC_Profile] Measurement Flare : 0.999%
[ICC_Profile] Measurement Illuminant : D65
[ICC_Profile] Technology : Cathode Ray Tube Display
[ICC_Profile] Red Tone Reproduction Curve : (Binary data 2060 bytes, use -b option to extract)
[ICC_Profile] Green Tone Reproduction Curve : (Binary data 2060 bytes, use -b option to extract)
[ICC_Profile] Blue Tone Reproduction Curve : (Binary data 2060 bytes, use -b option to extract)
[Composite] Диафрагма : 9.0
[Composite] Размер изображения : 100x66
[Composite] Мегапикселей : 0.007
[Composite] Скорость срабатывания затвора : 1/200
[Composite] Состояние вспышки при съёмке : Без вспышки
[Composite] Световое число : 13.0
[Composite] Коэффициент масштабирования к 35-мм формату: 1.5
[Composite] Круг нерезкости : 0.020 mm
[Composite] Поле зрения : 13.7 deg
[Composite] Фокусное расстояние : 100.0 mm (35 mm equivalent: 150.0 mm)
[Composite] Гиперфокальное расстояние : 55.47 m
[Composite] ID объектива : 100.0mm f/2.8
|
Или такой
 Hidden text | Code: | [File] Тип файла : MP3
[File] Расширение файла : mp3
[File] MIME тип : audio/mpeg
[File] Размер блока данных ID3 : 72178
[MPEG] Версия MPEG аудио : 1
[MPEG] Уровень аудио : 3
[MPEG] Битрейт аудио : 320 kbps
[MPEG] Частота дискретизации : 44100
[MPEG] Режим канала : Объединённое стерео
[MPEG] MS стерео : Включено
[MPEG] Интенсивное стерео : Off
[MPEG] Флаг авторского права : Нет
[MPEG] Оригинальный носитель : Да
[MPEG] Акцент : Нет
[MPEG] Кодер : LAME3.98r
[MPEG] Lame – Качество переменного битрейта: 4
[MPEG] Lame – Качество : 3
[MPEG] Lame – Метод кодирования : CBR – Постоянный битрейт
[MPEG] Lame – Фильтр нижних частот : 20.5 kHz
[MPEG] Lame – Битрейт : 255 kbps
[MPEG] Lame – Режим стерео : Объединённое стерео
[ID3] Band : Òàíÿ Áóëàíîâà è ãð.Ëåòíèé ñàä
[ID3] Название : Ïðîñòè ìåíÿ
[ID3] Исполнитель : Òàíÿ Áóëàíîâà è ãð.Ëåòíèé ñàä
[ID3] Альбом : Èçìåíà
[ID3] Трек : 07
[ID3] Авторское право : Abaddon
[ID3] Закодировал : Abaddon
[ID3] MIME тип изображения : image/jpeg
[ID3] Тип изображения : Передняя обложка
[ID3] Описание изображения :
[ID3] Картина : (Binary data 71847 bytes, use -b option to extract)
[ID3] Год :
[ID3] Комментарий :
[ID3] Жанр : None
[Composite] Продолжительность : 0:03:49 (approx) |
Но что в нем действительно может быть нужно - вопрос большой. Разобрать-то этот выхлоп несложно, гораздо сложнее определиться, что и как выводить. Можно, конечно, просто все сгруппировать и устранить кракоябры, типа
| Code: | [MPEG]
Версия MPEG аудио: 1
Уровень аудио: 3
Битрейт аудио: 320 kbps
Частота дискретизации: 44100
...
...
[ID3]
Band: Òàíÿ Áóëàíîâà è ãð.Ëåòíèé ñàä
Название: Ïðîñòè ìåíÿ
...
...
[Composite]
Продолжительность: 0:03:49 (approx)
...
... |
Но это еще проверить нужно, будет ли от этого польза.
Скорее всего, выводить нужно только важные теги, но для каждого пользователя и конкретного формата они свои, и в этом большая сложность. Можно, конечно, сделать дополнительный вывод всего сразу по модификаторам, но тогда информации будет слишком много. В общем хз как это делать
| AkulaBig wrote: | | Для чего нужно условие If FieldIndex = 1? |
Поля, объявленные в Pragma AutorunPluginFields, могут вызывать одну и ту же функцию. Чтобы внутри функции можно было отличить из какого поля происходит вызов используется параметр FieldIndex. Объявив три таких поля "C1:::MediaHint" "C2:::MediaHint" "C3:::MediaHint", получится три индекса. Когда подсказка запускается происходит вызов 60-ти полей. Поэтому только для первого поля формируется выхлоп и сохраняется в переменной для последующего разбора в остальных полях. |
|
| Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 616
|
(Separately) Posted: Tue Sep 29, 2026 16:30 Post subject: |
|
|
| Orion9 wrote: | | AkulaBig wrote: | | там в основном Флешер |
Видимо, хорошо ему там за пазухой у Гислера, раз сюда возвращаться не хочет.
|
А разве он здесь не в бане?
| Orion9 wrote: |
Наверное, все же только для клавы. Return -1 для ControlSetMouseAction ничего не делает.
|
Да, с этим разобрались. Но так как у меня сочетание для мыши нигде не применяется, я оставил его. Главное меню отключается. Почему-то у вас этот хоткей для мыши выделяет файлы.
| Orion9 wrote: |
Код для stdin/stdout от болвана вроде был, но почему-то я не стал его делать в подсказке. Видимо, решил, что и так сойдет )
|
Он у вас есть в варианте для DllCall. Я его тестировал, работает медленнее, чем через файлы.
| Orion9 wrote: |
Подсказка недоделанная.
|
У меня она полностью рабочая сделана на AutoIt. Но есть проблема перехлеста при одновременном выводе колонок и подсказки. Эту проблему я и пытаюсь решить с помощью Авторан. У нас ведь с MI тоже эти операциип разнесены. Подсказки через Авторан, а колонки через плагин. Но тут эта дурацкая опция StayOpen не дает нормально решить вопрос.
| Orion9 wrote: |
| AkulaBig wrote: | | Для чего нужно условие If FieldIndex = 1? |
Поля, объявленные в Pragma AutorunPluginFields, могут вызывать одну и ту же функцию. Чтобы внутри функции можно было отличить из какого поля происходит вызов используется параметр FieldIndex. Объявив три таких поля "C1:::MediaHint" "C2:::MediaHint" "C3:::MediaHint", получится три индекса. Когда подсказка запускается происходит вызов 60-ти полей. Поэтому только для первого поля формируется выхлоп и сохраняется в переменной для последующего разбора в остальных полях. |
Просто без этого тоже работает, но очень медленно. |
|
| Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 616
|
(Separately) Posted: Tue Sep 29, 2026 23:03 Post subject: |
|
|
Orion9
Вот код по созданию подсказки из ET с применением DllCall с потоками. За основу брал ваш, но приделал перевод крякозябров и сделал отдельным. Он работает жутко медленно. Я не могу тестировать его с одновременным использованием просмотра пользовательских колонок. Теперь я понимаю, что скорей всего проблема в отсутствии условия If FieldIndex = 1 Then. Но когда я пытаюсь дописать это условие, выводится только первая запись. Подскажите, пожалуйста, куда правильно вставить это условие, чтобы все заработало.
 Hidden text
| Code: |
Static hChildStdInWr = 0
Static hChildStdOutRd = 0
Static hChildStdInRd = 0
Static hChildStdOutWr = 0
Static hProcess = 0
Static hThread = 0
Func ET(FileName, FieldIndex, UnitIndex)
# Расположение файла Autorun.ini
# Location of Autorun.ini file
Local ini_TypeHints = COMMANDER_PATH & "\Ini\Autorun.ini"
# Читаем номер вида
# Reading type number
Local TypeHintsNum = IniRead(ini_TypeHints, "TypeHints", "CurrVal", 0)
# 0 - стандартный вид подсказки над файлами
# 1 - расширенный вид подсказки над файлами
If TypeHintsNum = 0 Then Return
If StrPos(FileGetAttr(FileName), "D") Then Return
Local sFile = "", j, files = 0, str
Local sPath = RequestCopyDataInfo("SP")
Local sName = RequestCopyDataInfo("SN")
Static aSel = List()
aSel.Count = 0
aSel.Text = GetSelectedItems(3, 0)
If aSel.Count = 0 Then aSel.Add(sName)
# Настройка атрибутов безопасности для наследования дескрипторов
Local Sec = Buffer(auX64 ? 24 : 12)
Sec.Zero()
Sec.SetNum(0, "UInt", Sec.size) # nLength
If auX64 Then
Sec.SetNum(8, "Ptr", 0) # lpSecurityDescriptor
Sec.SetNum(16, "Int", 1) # bInheritHandle
Else
Sec.SetNum(4, "Ptr", 0)
Sec.SetNum(8, "Int", 1)
EndIf
# Создаем Pipe для STDIN (Запись из Autorun -> Чтение в ExifTool)
If Not DllCall("CreatePipe", "Ptr*", @hChildStdInRd, "Ptr*", @hChildStdInWr, "Ptr", Sec.Ptr, "UInt", 0) Then
MsgBox("Error CreatePipe STDIN")
Return 0
EndIf
# Создаем Pipe для STDOUT (Запись из ExifTool -> Чтение в Autorun)
if Not DllCall("CreatePipe", "Ptr*", @hChildStdOutRd, "Ptr*", @hChildStdOutWr, "Ptr", Sec.Ptr, "UInt", 0) Then
DllCall("CloseHandle", "Ptr", hChildStdInRd)
DllCall("CloseHandle", "Ptr", hChildStdInWr)
MsgBox("Error CreatePipe")
Return 0
EndIf
# Запрещаем наследование нашей (записывающей/читающей) стороны каналов
DllCall("SetHandleInformation", "Ptr", hChildStdInWr, "UInt", 1, "UInt", 0)
DllCall("SetHandleInformation", "Ptr", hChildStdOutRd, "UInt", 1, "UInt", 0)
# Настройка STARTUPINFO
Local SI = Buffer(auPtrSize = 8 ? 104 : 68)
SI.Zero()
SI.SetNum(0, "UInt", SI.Size)
SI.SetNum(auX64 ? 60 : 44, "UInt", 0x00000101) # STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW
SI.SetNum(auX64 ? 64 : 48, "UShort", 0) # SW_HIDE (скрывает окно консоли)
SI.SetNum(SI.Size - 3 * auPtrSize, "Ptr", hChildStdInRd)
SI.SetNum(SI.Size - 2 * auPtrSize, "Ptr", hChildStdOutWr)
SI.SetNum(SI.Size - auPtrSize, "Ptr", hChildStdOutWr) # Дублируем stdout в stderr
# Настройка PROCESS_INFORMATION
PI = Buffer(auPtrSize = 8 ? 24 : 16)
PI.Zero()
# Командная строка запуска
Local cmdLine = '"' & util_ET & '" -stay_open True -@ -'
# Флаг CREATE_NO_WINDOW (0x08000000) полностью блокирует создание консольного окна
If Not DllCall("CreateProcessW", "Ptr", 0, "WStr", cmdLine, _
"Ptr", 0, "Ptr", 0, "Int", 1, "UInt", 0x08000000, _
"Ptr", 0, "Ptr", 0, "Ptr", SI.Ptr, "Ptr", PI.Ptr) Then
# Закрываем все открытые дескрипторы при ошибке
DllCall("CloseHandle", "Ptr", hChildStdInRd)
DllCall("CloseHandle", "Ptr", hChildStdInWr)
DllCall("CloseHandle", "Ptr", hChildStdOutRd)
DllCall("CloseHandle", "Ptr", hChildStdOutWr)
MsgBox("Error CreateProcess")
Return 0
EndIf
# Сохраняем нужные дескрипторы
hProcess = PI.GetNum(0, "Ptr")
hThread = PI.GetNum(auPtrSize, "Ptr")
# Закрываем дескрипторы, которые больше не нужны родительскому процессу
DllCall("CloseHandle", "Ptr", hChildStdInRd)
DllCall("CloseHandle", "Ptr", hChildStdOutWr)
WriteLine("-lang")
WriteLine("ru")
WriteLine("-m")
WriteLine("-q")
WriteLine("-q")
WriteLine(FileName)
WriteLine("-echo3")
WriteLine("{ready}")
WriteLine("-execute")
#MsgBox(hProcess & " " & hChildStdInWr & " " & hChildStdOutRd & " " & hChildStdInRd & " " & hChildStdOutWr )
Local output = "", chunk = ""
# Буфер для побайтового/посимвольного чтения из пайпа
Static readBuf = Buffer(1024*2)
readBuf.Zero()
While 1
Local bytesRead = 0
If Not DllCall("ReadFile", _
"Ptr", hChildStdOutRd, _
"Ptr", readBuf.Ptr, "UInt", readBuf.Size, "UInt*", @bytesRead, "Ptr", 0) Then
Break
EndIf
If bytesRead <= 0 Then Break
chunk = readBuf.GetStr(0, bytesRead, "ANSI")
output &= chunk
If StrPos(chunk, "{ready}") Then
Break
EndIf
Wend
# Очищаем результат от маркеров
output = StrReplace(output, "{ready}", "")
If hChildStdInWr Then
WriteLine("-stay_open")
WriteLine("False")
DllCall("CloseHandle", "Ptr", hChildStdInWr)
hChildStdInWr = 0
EndIf
If hChildStdOutRd Then
DllCall("CloseHandle", "Ptr", hChildStdOutRd)
hChildStdOutRd = 0
EndIf
if hProcess Then
DllCall("CloseHandle", "Ptr", hProcess)
hProcess = 0
EndIf
If hThread Then
DllCall("CloseHandle", "Ptr", hThread)
hThread = 0
EndIf
Return TrimSpaces1(StrPart(output, auLF, FieldIndex))
EndFunc
Func WriteLine(text)
rawString = text & auCRLF
# ExifTool ожидает UTF-8 или системную кодировку (зависит от настроек, UTF-8 наиболее универсален)
bufLen = StrLen(rawString) * 2
buf = Buffer(bufLen)
buf.Zero()
bufWr = buf.SetStr(rawString, 0, bufLen, "ANSI")
# Запись через WinAPI WriteFile
Local bytesWritten = 0
DllCall("WriteFile", "Ptr", hChildStdInWr, "Ptr", buf.ptr, "UInt", bufWr, "UInt*", @bytesWritten, "Ptr", 0)
Free(buf)
EndFunc
Func TrimSpaces1(String)
Local a, b
If Not StrPos(String, ":") Then Return String
a = StrPart(String, ": ", 1)
b = StrPart(String, ": ", 2)
Return StrTrim(FixCPET(a)) & ": " & StrTrim(FixCPET(b))
EndFunc
Func FixCPET(String)
Static a = List(), u = List()
Local ansi = String, utf8, wrong = Chr(0xFFFD)
Local nSize = StrLen(ansi)
Local buf = Buffer(nSize)
buf.Zero()
buf.SetStr(ansi, 0, nSize, "ANSI")
utf8 = buf.GetStr(0, nSize, "CP:65001")
Free(buf)
a.Count = 0
u.Count = 0
a.Text = ansi
u.Text = utf8
For i = 0 to u.Count - 1
If StrPos(u[i], wrong) Then u[i] = a[i]
Next
Return u.text
EndFunc
|
Кстати, с применением временных файлов тоже не могу до конца доделать по этой-же причине. Но там уже ясно, что вывод перехлестывается с выводом колонок и все зависает. Но чтобы дальше тестировать, тоже надо решить проблему с If FieldIndex = 1 Then. Иначе скорость очень маленькая. |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|