Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » Плагин IrfanView для Total Commander

Модерирует : gyra, Maz

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11

Открыть новую тему     Написать ответ в эту тему

AkulaBig

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TCIrfanView 1.71
   
Плагин просмотра изображений для Total Commander.
Поддерживаются форматы: ACR,ANI,ARW,AWD,B3D,BMP,CDR,CLP,CRW,CR2,CR3,CRW,CUR,DCM,DCR,DDS,DCX,DIB,DJVU,DNG,
ECW,EMF,ERF,EXR,G3,GIF,HDP,HEIC,ICO,IFF,IMA,IMG,IW44,J2K,JFIF,JPC,JP2,JPE,JPEG,JPF,JPG,JPM,JLS,JNG,JXR,KDC,LBM,MNG,
MOS,MPO,MRW,MSK,NEF,OFR,PBM,PCD,PCX,PEF,PGM,PNG,PPM,PSD,PSB,PSP,RAF,RAS,RAW,RGB,RLE,RW2,RWL,SFF,SGI,SID,SRF,
SRW,SUN,SWF,TIF,TIFF,TGA,WBMP,WEBP,WDP,WMF,X3F,XBM,XPM.
Плагин поддерживает анимацию в файлах и горячие клавиши IrfanView.
 
TCIrfanView 2.51
Линейка плагина 2.Х отличается от линейки 1.Х тем, что по F3 запускается чистый
IrfanView, без интеграции с Lister Total Commander. Это позволяет использовать
полностью весь инструментарий IrfanView, увеличивает плавность при отображении
изображения. Также теперь можно использовать Total Commander и IrfanView
несовпадающей разрядности. Линейки развиваются параллельно.
 
Сборка Total Commander автора плагина с установленным и настроенным плагином Скачать


Всего записей: 2257 | Зарегистр. 11-03-2003 | Отправлено: 13:15 24-09-2021 | Исправлено: AkulaBig, 16:14 29-12-2021
DimmY



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AkulaBig
Я хочу сказать, что переписываюсь с автором в течение многих лет.

Всего записей: 4176 | Зарегистр. 22-04-2002 | Отправлено: 12:29 13-10-2021
AkulaBig

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Понятно. Давайте закроем тему обсуждения ирфана. Тут не вселенская помойка.

Всего записей: 2257 | Зарегистр. 11-03-2003 | Отправлено: 15:30 13-10-2021
Lagris

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Что-то я запутался: мне нужно, чтобы в моем Тотале64 запускался Ирфан32. Согласно ридми пишу в ини-файле плагина path64= путь к ирфан32. Запускается 32-битный ирфан, но без заголовка и фокуса. Так и должно быть. А мне надо, чтобы Ирфан32 из под ТСх64 был с заголовком и фокусом, а от 64-битной версии программы я , в принципе, могу отказаться. Вы, вроде, как-то упоминали, что в личной сборке приоритетным будет использование ирфан32, так что если такой вариант готов, то поделитесь, если можно.

Всего записей: 516 | Зарегистр. 26-08-2007 | Отправлено: 16:56 13-10-2021
AkulaBig

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вы действительно запутались. В версии 1.5 при применении ТС и ирфана разной разрядности все работает именно как вы описали. В ридми это подробно расписано. То-есть хоткеи не работают, имя файла в заголовке не меняется. Работают только стрелки ПИ и прокрутка мышкой. Соответственно и фокус не устанавливается, потому что он не нужен.
Полноценно ТС и ирфан разной битности будут работать только в версии 2.0, если я ее когда-нибудь сделаю. Но там не будет связи с Листером по Ф3. То-есть ирфан будет запускаться отдельным окном. Но в БП все будет как сейчас. В общем-то версия 2.0 готова, но есть большая проблема кратковременного мелькания окна Листера при запуске. Если я не решу эту проблему, то версия 2.0 будет только в моей сборке. На оффорум я ее выкладывать не буду.
Сейчас в моей сборке обе версии ирфана занимают места меньше, чем до этого одна 64-битная. Практически без потери функционала. Чтобы использовать все плагины, достаточно запустить батники. Тогда все расширения будут подхватываться.    
 
Добавлено:
DimmY

Цитата:
сложно увеличить это поле из-за каких-то вычислений, связанных с разными параметрами экрана в разных версиях Windows

Для интереса посмотрел другие ПИ. Оказывается надо просто подобрать ПИ по размерам иконок и разрешению экрана. Например, на моем 1920х1680 в ПИ с иконками 24х24 цифры масштаба видны полностью.

Всего записей: 2257 | Зарегистр. 11-03-2003 | Отправлено: 17:19 13-10-2021 | Исправлено: AkulaBig, 17:21 13-10-2021
AkulaBig

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Наконец-то получилась цивильно сделать версию без Листера https://drive.google.com/file/d/1iVVBFxa-dxtJ0RruK8z79VfeQ8Q8BHSw/view?usp=sharing
---------------------
Линейка плагина 2.Х отличается от линейки 1.Х тем, что по F3 запускается чистый
IrfanView, без интеграции с Lister Total Commander. Это позволяет использовать
полностью весь инструментарий IrfanView, увеличивает плавность при отображении
изображения. Также теперь можно использовать Total Commander и IrfanView
не совпадающей разрядности. Линейки развиваются параллельно.
-----------------
 
Добавлено:
Сборку тоже обновил.
 
Добавлено:
К сожалению в обоих линейках плагина остается неразрешенной проблема с потерей фокуса. Решена она только для ТС, работающего с админскими правами. А в 2.0 вообще никак не решена. Так как функция АПИ, которая позволяет решить этот вопрос, напрямую зависит от прав доступа.  

Всего записей: 2257 | Зарегистр. 11-03-2003 | Отправлено: 20:59 15-10-2021
AkulaBig

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Наконец-то нашел, где затык с потерей фокуса.

Всего записей: 2257 | Зарегистр. 11-03-2003 | Отправлено: 18:14 22-10-2021
destiny child



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AkulaBig (пост)
Цитата:
Наконец-то нашел, где затык с потерей фокуса.

в обоих версиях? круууто))) бум ждать)))

Всего записей: 1784 | Зарегистр. 01-04-2006 | Отправлено: 19:22 22-10-2021
AkulaBig

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Он один для обоих версий. Но на решение проблемы время не мало уйдет. Интересно, что вроде решил эту проблему. На большинстве компов с любой осью и правами доступа все норм. Но вот на моем дохленьком малыше, хоть и с 10-ой, эффект остался. Причем это не тот-же самый, а как-бы еще один. Зависит от скорости компа. Там уже не ТС начинает моргать, а экземпляр запускаемой проги зависает.
 
Добавлено:
Кстати, вам поподробнее опишу. Чтобы процесс выдавал правильное окно, приходится применять цикл вайл. Он ищет правильное окно и завершает работу. А если быстро нажимать клавиши, он не находит правильное окно и просто зависает. Надо придумать, как выйти из цикла.

Всего записей: 2257 | Зарегистр. 11-03-2003 | Отправлено: 20:57 22-10-2021 | Исправлено: AkulaBig, 20:58 22-10-2021
destiny child



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AkulaBig (пост)
Цитата:
Надо придумать, как выйти из цикла.

таймер? как контрольный выстрел.  
любой поиск окон не должен проходить дольше 1 секунды/ну 1,5.  
просто нечего ТААААК долго перебирать... объектов "Окно" в любой системе ооочень считанное кол-во)))
 
P.S. не имею  ничего против, если прям кусочком кода "кинетесь")) с поиском.
мож что и другое просто в глаза бросится. Ну, знаете как это бывает - сам писал-писал, и не замечал, что дважды одну и туже переменную переприсваивал в совершенно разных циклах и в итоге ни один цикл не отработал положенного кол-во итераций....

Всего записей: 1784 | Зарегистр. 01-04-2006 | Отправлено: 11:54 23-10-2021 | Исправлено: destiny child, 12:31 23-10-2021
AkulaBig

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
таймер?

Грубо.

Цитата:
просто нечего ТААААК долго перебирать...

Это понятно. Всего три окна, если сторонний ирфан не открыть. Причем после второго, как только найдется правильный, я выхожу. Но хитрость в том, что если давить часто стрелки, то правильное окно просто не успевает находится. Выплевываются только неправильные окна и цикл не может завершиться.

Цитата:
сам писал-писал, и не замечал

Да там замечать нечего. Код у меня очень компактный. Не на много длинней первоначального варианта. Собственно только хук добавлен. Ну и вот этот цикл принципиально изменен, чтобы знал свой поток. Но от этого он длинней не стал.
        // ищем окно внешнего приложения
        hAppHandle = FindWindowEx(NULL, NULL, AppWindowClass, NULL);
        // проверяем его на принадлежность к текущему потоку,
        // иначе подхватится первое попавшееся окно запущенного приложения
        while (pid != ProcessInfo.dwProcessId) {
            GetWindowThreadProcessId(hAppHandle, &pid);
            hAppHandle = FindWindowEx(NULL, NULL, AppWindowClass, NULL);
            //GetWindowTextA(hAppHandle, LPSTR(cln), sizeof(cln));
            //MessageBoxA(0, LPSTR(cln), 0, 0);
            if (pid == ProcessInfo.dwProcessId) break;
 
        };
Видите у меня закоменчено проверка заголовка. Вот в этом и есть проблема. Окно hAppHandle с пустым заголовком неправильное, а с заголовком два раза появляется. После первого я сразу выхожу. А вот с быстрыми стрелками заголовок всегда пустой и происходит зацикливание. Можно было-бы погрешить на то, что не успевает процесс загрузиться, но неправильные окна правильного класса.  

Всего записей: 2257 | Зарегистр. 11-03-2003 | Отправлено: 13:17 23-10-2021
destiny child



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AkulaBig (пост)
Цитата:
Ну и вот этот цикл принципиально изменен, чтобы знал свой поток.

Ээээ, но когда ищешь при помощи вызова FindWindowEx, то надо "продолжать" поиск
А не постоянно вызывать FindWindowEx(NULL, NULL, AppWindowClass, NULL);
 
Должно быть что-то типа такого:

Код:
 
// на входе один параметр - идентификатор нового процесса,  
// что был получен, когда вызывалась функция запуска Ирфана
// что в вашем коде прописано как: ProcessInfo.dwProcessId
HWND GetProcessWindow(DWORD processId)
{
  bool bFound = false;
  HWND prevWindow = NULL;
  wchar_t windowTitle[] = L"IrfanView"; // ну, или что мы там сейчас искать должны
  // "поймаем" хендл рабочего стола, по идее это полный аналог
  // передачи параметром NULL в hwndParent в вызове FindWindowEx
  // но так фигурально точнее )))
  HWND desktopWindow = ::GetDesktopWindow();
  if (!desktopWindow)
    break;
 
  while (!bFound)
  {
    // начинаем поиск на первой итерации и продолжаем его на следующих
    // за счет того, что используется переменная prevWindow )))
    HWND nextWindow = ::FindWindowEx(desktopWindow, prevWindow, AppWindowClass, NULL);
    if (!nextWindow)
      break;
 
    // наша проверка на то, что найденное окно принадлежит "верному" процессу
    DWORD procId = -1;
    ::GetWindowThreadProcessId(nextWindow, &procId);
 
    if (procId == processId)
    {
      // доп.проверки на то, что окно найдено с нужными параметрами,
      // в частности это заголовок окна.
      wchar_t windowText[300];
      if (::IsWindowVisible(nextWindow) && !::IsIconic(nextWindow) &&  
          ::GetWindowText(nextWindow, (LPWSTR)windowText, sizeof(windowText)/sizeof(wchar_t)))
          if (windowText == windowTitle)
              return nextWindow;
    }
    // гарантируем, что поиск именно что продолжится! и то, что у него будет конец! т.е. из цикла
    // мы гарантированно вылетим, т.к. мы точно переберем все окна, что на момент первого вызова
    // функции FindWindowEx были как бы "заморожены" для процедуры перебора, ведь в милли/нано
    // секунды выполнения самого поиска в системе могли появиться и другие окна.
    prevWindow = nextWindow;
  }
 
  return NULL;
}
 

Всего записей: 1784 | Зарегистр. 01-04-2006 | Отправлено: 23:06 23-10-2021 | Исправлено: destiny child, 23:07 23-10-2021
AkulaBig

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо. Посмотрю, что получится.
 
Добавлено:
С наскока ничего не получилось. Я думаю проблема в строчке char_t windowTitle[] = L"IrfanView"; Соль в том, что правильный заголовок мы не знаем. В общем буду думать.

Всего записей: 2257 | Зарегистр. 11-03-2003 | Отправлено: 07:40 24-10-2021
AkulaBig

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
И парент окон у этих окон нет. Так что возвращаемся в начало.

Всего записей: 2257 | Зарегистр. 11-03-2003 | Отправлено: 11:01 24-10-2021
destiny child



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AkulaBig (пост)
Цитата:
 Соль в том, что правильный заголовок мы не знаем. В общем буду думать.
AkulaBig (пост)
Цитата:
И парент окон у этих окон нет.  

если честно - перестал понимать. парент у ЛЮБОГО окна есть - ибо окно "Рабочий стол" - безусловно первый узел в иерархии окон.
Т.е. все остальные идут ТОЛЬКО после него. Так что утверждение неверно. И как можно заголовок-то не знать? я запутался по итогу(((
так ЧТО и для ЧЕГО мы ищем???? можно уточнение? в виде скрина с того же WinSpy++ или любого аналога, что используется. Выделите на скрине нужные хендлы...

Всего записей: 1784 | Зарегистр. 01-04-2006 | Отправлено: 11:41 24-10-2021 | Исправлено: destiny child, 11:51 24-10-2021
AkulaBig

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
безусловно первый узел в иерархии окон

Видимо не все так просто. Не зря-же приходится применять команду SetParent, чтобы установить окну родительское окно, даже при условии, что мы его объявляем CHILD.

Цитата:
И как можно заголовок-то не знать?

Очень просто. В заголовке помимо названия проги отображается название файла, а в случае с ирфаном еще и путь может быть, а может и не быть. В этом-то вся и проблема.

Всего записей: 2257 | Зарегистр. 11-03-2003 | Отправлено: 12:16 24-10-2021
destiny child



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AkulaBig (пост)
Цитата:
Видимо не все так просто. Не зря-же приходится применять команду SetParent, чтобы установить окну родительское окно, даже при условии, что мы его объявляем CHILD.

если мы просто скажем CHILD - то окно привяжется именно к Рабочему столу. А Сказав SetParent - мы переназначаем родителя на ТОЧНО ТО окно, которое нам и было нужно, чтобы именно ОНО стало родительским по отношению к настраиваемому окну.
AkulaBig (пост)
Цитата:
В заголовке помимо названия проги отображается название файла, а в случае с ирфаном еще и путь может быть, а может и не быть

И что? Оно всегда содержит подстроку " - IrfanView". Ищем не по полному совпадению, а по частичному. Это раз.  
Во-вторых - а ЗАЧЕМ нам в этом случае подтверждение с текстом в заголовке? мы же искали по классу окна!
HWND nextWindow = ::FindWindowEx(desktopWindow, prevWindow, AppWindowClass, NULL);
и при поиске мы учитываем НУЖНЫЙ DWORD processId!
а это перекрывает наши потребности в поиске))) другого такого сочетания в системе нет и не будет))
так что то - что выдаст наша функция - это точно нужное нам окно.
 
P.S. сравнение заголовка окна у Ирфана можно построить по двум признакам:
1) Текст либо заканчивается на подстроку " - IrfanView"
2) либо Текст содержит в себе подстроку " - IrfanView (Zoom: "

Всего записей: 1784 | Зарегистр. 01-04-2006 | Отправлено: 14:17 24-10-2021 | Исправлено: destiny child, 15:09 24-10-2021
AkulaBig

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Сказав SetParent - мы переназначаем родителя на ТОЧНО ТО окно, которое нам и было нужно

У меня так и сделано. Иначе окно не встроишь в Листер. В версии 2.0 такого нет, но лучше найти универсальное решение.

Цитата:
мы же искали по классу окна!

В том-то и дело, что класс у них совпадает. Неправильное окно от правильного отличается только отсутствием у него заголовка.

Цитата:
сравнение заголовка окна у Ирфана можно построить по двум признакам

Собственно окно с непустым заголовком является уже правильным. Но мне это не надо. С заголовком цикл и так заканчивается. Зацикливаются именно окна без заголовка. Вот в чем проблема. Я-бы мог отследить два окна без заголовка и закончить цикл. Но кто знает, сколько их может быть. Надо-бы знать количество открытых окон, вот тогда можно было-бы решить проблему. Пробовал через EnumWindow. Тоже не получается.

Всего записей: 2257 | Зарегистр. 11-03-2003 | Отправлено: 16:44 24-10-2021
destiny child



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AkulaBig (пост)
Цитата:
В версии 2.0 такого нет, но лучше найти универсальное решение.

AkulaBig (пост)
Цитата:
В том-то и дело, что класс у них совпадает. Неправильное окно от правильного отличается только отсутствием у него заголовка.

AkulaBig (пост)
Цитата:
Собственно окно с непустым заголовком является уже правильным. Но мне это не надо. С заголовком цикл и так заканчивается. Зацикливаются именно окна без заголовка. Вот в чем проблема.

ничего не понимаю по прежнему. соррри. или я совсем в голове другой код представляю, или вы сталкиваетесь совсем с другими проблемами, но не с теми, что я смог вычленить из описаний:
какая универсальность не работает и там и сям? откуда берутся понятия "правильное" и "неправильное" окна??? Что значит пустой и непустой заголовок???
можете, еще раз говорю, показать на примере живой иерархии окон нужные состояния/типа окон?
имхо, у вас УЖЕ все решено, но просто акцент анализа в какой-то да, существующей, мини-ошибке не туда направлен.
 
Я мимоходом наткнулся на комп с Core 2 Duo Е6300 и 2 гигами оперативы. На вин7. Думаю, это вполне можно назвать динозавром эпохи 2010х. И даже там вполне адекватно версия плага линейки 1.5 себя повела на моей портативке тотала. Даже не представляю - что еще желать))))

Всего записей: 1784 | Зарегистр. 01-04-2006 | Отправлено: 17:49 24-10-2021
AkulaBig

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
или я совсем в голове другой код представляю

Думаю, что вы представляете принципиально другой код. Мне не надо искать окно с заголовком в котором присутствует слово ирфанвью и класса ирфанвью. Это и так у меня реализовано и прекрасно работает. А мне наоборот, нужно, если не найдено окно с непустым заголовком, выйти из цикла. Причем не первое попавшееся окно, а среди всех класса ирфанвью. То-есть:
1. Я нахожу первое окно с заполненным заголовком в текущем потоке и выхожу из цикла (это реализовано).
2. Я не нахожу окно с заполненным заголовком среди всех найденных окон класса ирфанвью и тоже выхожу из цикла (полностью все окна без заголовка появляются при быстром листании клавишами стрелок).
То-есть проблема заключается в том, чтобы выйти из цикла при всех найденных окнах без заголовка, а не первого попавшегося.
Надеюсь теперь все ясно стало?

Цитата:
версия плага линейки 1.5 себя повела на моей портативке тотала.

Да, я тоже выяснил, что дело не в скорости компьютера. Просто этот баг проявлялся только на одном моем слабеньком компе. Но тут выяснилось, что и на весьма нехилом ноуте у меня тоже проявляется этот баг.

Всего записей: 2257 | Зарегистр. 11-03-2003 | Отправлено: 19:12 24-10-2021 | Исправлено: AkulaBig, 19:13 24-10-2021
destiny child



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AkulaBig (пост)
Цитата:
Надеюсь теперь все ясно стало?

если честно, то нет. почему вообще речь идет о МНОЖЕСТВЕ окон?? Ирфана что ли множество окон? это тогда вообще как? откуда им браться во множестве, отличном от 1, ну 2 максимум?
даже если речь идет о быстром просмотре, то там при движении стрелок вперед-назад по коду всё равно же вначале создается экземпляр ирфана, а потом закрывается. и, следовательно, ток от быстродействия компа зависит - как быстро исчезнет старый экземпляр и откроется новый. НО! Максимум - это два варианта окно от двух экземпляров может оказаться в системе. Один - от закрывающегося ирфана, второй - от вновь открытого.
 
Т.е. какой именно сценарий использования плагина, и для простоты возьмем только линейку 1.5, мы рассматриваем и пытаемся ДОчинить??? И для какой ошибки?

Всего записей: 1784 | Зарегистр. 01-04-2006 | Отправлено: 22:26 24-10-2021
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11

Компьютерный форум Ru.Board » Компьютеры » Программы » Плагин IrfanView для Total Commander


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2020

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru

Рейтинг.ru