===================================================================== AJPapps - Screen grabber 2.02 Линда Кайе 2007-2016. Посвящается Ариэль ===================================================================== Ещё одна программа для снятия скриншотов ^_^ Пожалуй, отличительной особенностью её является то что она почти ни чем не напоминает о своём присутствии. Она маленькая, не грузит огромные окна всяких Studio и Suite и многометровые файлы данных с одной лишь целью: снять скриншот. Она вообще не показывает ни каких окон. У неё лишь маленькая иконка с трее и ни чего более. Напоминает старые добрые резидентные DOS программы подобного типа, неправда ли? История создания ---------------- Давным-давно для того чтобы делать скриншоты из хорошей игры Grandia II я написала программу AJPapps - Screen grabber. В те времена я делала скриншоты так: нажму во время игры PrintScreen, поиграю, когда выхожу из игры, открываю Paint и сохраняю картинку в нём. Естественно это было очень неудобно, поэтому я и написала программу, которая делала одну очень важную вещь: копировала изображение с экрана и сохраняла его на диске. Программа имела окно, куда копировалась картинка, и минимум настроек. В этой программе я столкнулась с двумя интересными проблемами. Во-первых, как перехватывать нажатие кнопки, которая отвечает за снятие скриншота? Ещё во времена программирования для DOS (ах, молодость...) я нашла один аппаратный порт, в котором появлялись некие данные, когда пользователь нажимал некую клавишу. На основе этого я и перехватывала нажатие, если мне не изменяет память, Scroll Lock. Я даже добавила возможность сохранения по таймеру через те же порты. Почему я не отслеживала нажатие клавиш более цивилизованным способом? Ну, как работают глобальные горячие клавиши я не знала, а получение асинхронного состояния клавиш не очень работало из-за того что таймер вечно пропускал их. Вот я и сделала программу для Windows 98, которая использует особенности ядра DOS ^^ Вторая проблема была связана с тем, что при то что программа работала, периодически попадались скриншоты, когда модели в игре не успевали дорисовываться. Должно быть это как-то связано с DirectX, потому как при нажатии PrintScreen, модели всегда успевали дорисовываться. Немного подумав, я добавила режим, в котором данные не копировались прямо с экрана, а сначала симулировалось нажатие на PrintScreen, а потом картинка забиралась из буфера обмена. И оно работало даже надёжнее! А код я и нагло утащила из примера в книжке Дэна Эпплмана ^^ Всё меня устраивало, но однажды копаясь в Win32 SDK, я нашла раздел о цепочках буфера обмена. Выглядит это так: в буфер обмена что-то копируется, и все программы, зарегистрированные в цепочке друг другу передают сообщение о том, что нужно перерисовать данные. Так работает встроенный просмотрщик буфера обмена. Также заработала и моя программа, без всяких портов сохраняя всё что попадает в буфер. Естественно, она сохраняла только картинки, но всё же сохраняла всё, независимо от того, скриншот это или нет. Прошло время, машина умерла, я купила ноутбук и не стала на нём восстанавливать все старые программы и библиотеки с ещё полуживого винта. Я поначалу воспринимала буку как временную машину, но потом просто понаписала кучу всего под неё. Потом бука умерла и переродилась, первую машину я восстановила, но пришлось поставить туда Windows XP. Старые программы я так и не восстановила... И вот, на днях я решила снова поиграть в Grandia II. Угадайте, что мне захотелось? ^^ Но PrintScreen'ом таскать скриншоты было лень, поэтому я начала писать вторую версию программы. Я решила сделать её как можно компактнее и незаметнее. Сначала я хотела сделать только метод цепочек буфера обмена, но потом решила не мелочиться и сделала все три метода. Кстати, в этот раз методы эти не взаимоисключающие, поэтому можно одновременно включить все три. Для двух других я просто сделала поддержку горячих клавиш - использовала наработки AJPapps - Global hotkeys ^^ Собственно, эту программу я писала очень быстро, хоть код писала практически с нуля. Всего день, большую часть которого я потратила на (наконец-то!) настройки. Да. У программы есть диалог настроек ^_^ Шли годы... Программа работала почти прекрасно, но всё же чего-то не хватало. Сначала я добавила возможность снятия скриншотов с Microsoft Virtual PC, ибо очень часто хочется запомнить, что там творится в виртуальной системе, но не всегда работают горячие клавиши, да и нужен-то скриншот окна VPC, а не всего рабочего стола. А потом появилась проблема другого характера. Оказалось, что при использовании нескольких рабочих столов (например, моей программой Private desktops), скриншоты не всегда сохраняются правильно, если включен другой рабочий стол. А ещё периодически сбивались цепочки буфера обмена, что автоматическое сохранение переставало работать даже на том же рабочем столе, на котором была запущена программа. Всё было правильно - рабочие столы изолированы друг от друга. Поэтому я написала ещё один метод, при котором программа сама заглядывает в буфер обмена и смотрит, появилась ли там новая картинка. Теперь преграды между рабочими столами побеждены ^_^ Надеюсь, моя метода поможет DDD улучшить его JPG Saver ^_^ История изменений ----------------- • 2.00.0011 Первый публичный релиз второй версии. • 2.00.0012 [-] Теперь программа запускается в Windows 95 и Windows NT 4.0 без Microsoft Internet Explorer 4.0 Desktop Update. • 2.00.0013 [-] Ошибочное значение кода горячей клавиши теперь не принимается при загрузке настроек. • 2.00.0014 [-] Исправлено самопроизвольное включение Clipboard copy mode. • 2.00.0015 [-] Настройки теперь сохраняются, если программа работала на момент завершения работы Windows или выхода пользователя из системы. • 2.00.0017 [+] В меню появился пункт "Скриншоты", который открывает каталог с картинками. • 2.00.0018 [+] Добавила функцию снятия скриншотов с окна виртуальной машины Microsoft Virtual PC. • 2.00.0019 [-] Исправила ошибку, делающую невозможным снятие скриншотов с Microsoft Virtual PC 2007. • 2.00.0021 [+] Добавила Clipboard query mode для тех, кто использует несколько рабочих столов. [-] Поправила вывод иконки при пересоздании панели задач. [+] Статистика показывает ещё и отклонённые картинки. • 2.00.0022 [+] Улучшена совместимость с программами, которые могут что-то записать в заголовок окна VPC. • 2.01.0028 [+] Появился интерфейс командной строки. [+] Появилась поддержка форматов PNG, JPG и GIF. [+] Переделано окно настроек. • 2.01.0037 [-] Расширение по умолчанию не соответствовало формату файла по умолчанию. [-] Наблюдались некоторые глюки в прорисовке фреймов. • 2.01.0039 [-] Программа могла неправильно определять размеры экрана при смене разрешения. [+] Настройки сохраняются в реестр сразу после закрытия диалога настроек. • 2.01.0045 [+] По какой-то непонятной причине программа не всегда могла получить доступ к буферу обмена. Добавила небольшой способ обхода этого ("Предупреждения" в статистике). • 2.01.0047 [+] Теперь в мультимониторной конфигурации скриншот снимается со всех экранов разом. • 2.01.0048 [-] Если верхний левый угол экрана имел отрицательные координаты, программа методом Screen Copy делала неправильно скриншот. [+] Появилась настройка, с какого монитора делать скриншот методом Screen Copy. • 2.01.0049 [-] В настройках порядок переходов между элементами был нарушен. [-] В настройках фокус мог уходить на скрытые вкладки. [+] В настройках можно ввести каталог сохранения скриншотов вручную. [+] Валидация каталога сохранения скриншотов в настройках. [+] Появилась иконка 48x48. • 2.01.0050 [-] В настройках комбобокс выбора монитора не блокировался при отключении режима копирования экрана. • 2.02.0052 [+] Небольшие косметические изменения в диалоге настроек. [-] После закрытия диалога настроек фокус мог скакать между окнами. [+] Возможность выдавать стандартный звук после создания (или ошибки создания) скриншота. По умолчанию опция включена. [+] Возможность выдавать звук через PC-спикер после создания (или ошибки создания) скриншота. Зависимости ----------- Для работы этой программы нужны следующие компоненты: • AJPapps - AJPapps support library 1.00 Файл AJPappsSupport0100.DLL • AJPapps - Библиотека общих функций 3.01 Файл CommonFunctions0301.DLL • AJPapps - Subclasser 1.00 Файл Subclasser0100.DLL • AJPapps - System tray icon control 2.01 Файл SysTray0201.OCX • janGraphics [http://jansfreeware.com/jfobjects.htm] Файл janGraphics.DLL • VideoSoft VSOCX6 Файл VsOcx6.OCX • Microsoft Visual Basic Virtual Machine Файл MSVBVM60.DLL Эти компоненты обязательны. Они уже включены в программу установки ^_^ Информация о разработке ----------------------- Язык: Microsoft Visual Basic 6.0 SP6 Платформа: Windows XP Professional SP3 Установка --------- Просто запустите Setup.ScreenGrabber.EXE, и программа установки сама создаст все необходимые ярлыки. Использование ------------- После первого запуска программы, ни одна из функций не будет задействована, поэтому для начала её надо настроить. После запуска иконка программы появится в трее. Щелчок по ней открывает меню. Первые четыре пункта - статистика снятия скриншотов с момента запуска программы. Пункт "Скриншоты" открывает каталог, куда программа сохраняет скриншоты. Пункт "Настройки..." открывает диалог настроек. "Clipboard chain mode". Эта опция включает режим, в котором программа отслеживает все изменения в буфере обмена, и при появлении там картинки немедленно сохраняет её как скриншот. Это удобно тем, что в любом случае при нажатии PrintScreen скопированная картинка будет сохранена. Из недостатков метода стоит отметить то, что любая картинка в буфере обмена будет считаться скриншотом. Кроме того, если картинка уже была там при запуске программы, она будет немедленно сохранена. Также есть зависимость от других программ подобного типа (обычно это программы для просмотра содержимого буфера обмена) - если в них есть ошибки, программа просто не узнает что появился скриншот. "Сохранять только изображения, размер которых совпадает с размером экрана". Эта настройка помогает отфильтровать работу предыдущей. Так, сохраняться будут только картинки, размер которых совпадает с размером экрана. Остальные будут проигнорированы. "Clipboard query mode". Эта опция включает режим, похожий на предыдущий, но при этом программа постоянно опрашивает буфер обмена и, если там появилась новая картинка, сохраняет её. Этот метод является альтернативой предыдущему, поскольку метод цепочек отслеживает события только на одном рабочем столе и не узнает о снятии скриншота на другом. Также при долгом использовании программы, иногда цепочка может сбиваться, и сообщение о новой картинке до программы просто не доходит. Поэтому в данном методе программа сама проверяет буфер обмена. Обратите внимание, что не рекомендуется использовать этот метод и предыдущий одновременно, поскольку сначала сработает предыдущий, потом этот, а потом снова предыдущий. Это не ошибка, а особенности реализации. "Сохранять только изображения, размер которых совпадает с размером экрана". Смысл этой настройки такой же, как и настройки для предыдущего метода. В мультимониторной конфигурации этот и предыдущий метод с установленной галочкой "Сохранять только изображения, размер которых совпадает с размером экрана" будут работать только если нажатие PrintScreen делает снимок со всех мониторов разом. MSDN говорит, что скриншот снимается с монитора, в котором находится мышиный курсор, но у меня это не так. Ещё говорят, что это настраивается в свойствах видеокарты, но проверить я не могу. "Screen Copy Mode". В этом режиме скриншот будет сниматься копированием картинки на экране. Способ надёжный, но может плохо работать с DirectX играми и приложениями (для обхода этого есть третий способ). В частности замечены случаи, когда снимались скриншоты с недорисованных сцен, например, в игре Grandia 2 попадались скриншоты, где у персонажей были только ноги ^^ Ниже настраивается горячая клавиша, по которой будет сниматься этим способом скриншот. Она будет работать в любой программе, которая явно не блокирует горячие клавиши (например, оно не будет работать в программах вроде VMWare и Virtual PC). Если она уже определена другой программой или произойдёт ошибка при её регистрации, настройка будет отключена. Ещё ниже можно выбрать, с какого монитора делать скриншот в мультимониторной конфигурации. Тут есть одна интересная хитрость. Если скриншот делается сразу со всех мониторов, то при переключении на другой рабочий стол картинку этим методом получить не удастся - так было и в предыдущих версиях программы. Но если скриншот делается только с определённого монитора, то картинка будет получена даже с другого рабочего стола. Это особенность Windows - я не виновата ^^ "Clipboard copy mode". Этот метод работает также по собственной горячей клавише. Он похож на Clipboard chain mode, но при этом сохраняет не всё подряд. Он симулирует нажатие PrintScreen, так что система копирует изображение экрана в буфер обмена, а программа потом просто сохраняет картинку из буфера. Обратите внимание, что если программа была запущена на другом рабочем столе, скриншот этим методом не получится. Скорее всего, будет сохранено чёрное изображение. Это не ошибка, а, опять же, особенности реализации. Для преодоления этой проблемы и был придуман Clipboard query mode. "Virtual PC 2007 window copy mode". Этот метод предназначен для снятия скриншотов с виртуальной машины, запущенной под Microsoft Virtual PC 2007 (остальные версии я не проверяла). При этом виртуальная машина может работать в оконном или полноэкранном режиме. Однако на этот метод накладываются некоторые ограничения. Например, окно снимаемой виртуальной машины должно быть активно. Во-вторых, если поверх него будет какое-то другое окно, то оно тоже попадёт на скриншот. В-третьих, есть одна маленькая проблема с VPC. Она захватывает управление мышью и клавиатурой, в связи с чем всякие клавиатурные комбинации вроде Win+Ctrl+B она перехватывает. Однако существует лазейка в виде так называемой Host Key, которая не обрабатывается VPC. Например, это может быть правая Alt. Если на горячую клавишу назначить комбинацию вроде Alt+F5, то при нажатии правой Alt+F5, Screen Grabber обработает её и сделает скриншот. Но эта же комбинация может конфликтовать с другими программами. Так, скажем, в FAR по нажатию Alt+F5 документ не уйдёт на печать - Screen grabber перехватит команду и звуковым сигналом сообщит, что произошла ошибка. Заметьте, что для третьего, четвёртого и пятого метода используются свои горячие клавиши. Это сделано для того чтобы оба метода могли быть включены одновременно. Однако не рекомендуется использовать вместе первый и четвёртый методы, так как скриншот может быть сохранён дважды. "Каталог для сохранения скриншотов" определяет папку, куда будет сохраняться каждая картинка. Картинки сохраняются в выбранном в настройках формате, и если этот формат - BMP, то на NTFS томах имеет смысл включить файловое сжатие для этой папки. Разумеется, можно в качестве папки указать сетевой ресурс. Для выбора каталога, нажмите кнопку с тремя точками. По умолчанию в качестве этой папки выбирается папка "Мои рисунки". В системах, где нет этой папки (Windows 98, например), выбирается папка "Мои документы". Обратите внимание, что эта папка принадлежит текущему пользователю так что каждый пользователь получает скриншоты в собственной папке (что вовсе не значит что все не могут складировать скриншоты в одну кучу). В Windows NT 4.0 может выйти заминка. Хотя папка "Мои документы" там отсутствует, по умолчанию выбирается возвращаемая системой папка "Личная" из каталога профиля текущего пользователя. В принципе, на неё можно вынести ярлык на рабочий стол и использовать её как полноценную папку "Мои документы". Ах да, совсем забыла. Если так получится, что файл скриншота с таким именем уже существует, он будет заменён без вопросов - это сделано чтобы не тревожить игры лишними переключениями на рабочий стол. "Формат имени файла". Здесь указывается начало имени файла (по умолчанию "Screenshot ") и расширение. Между началом имени файла и датой программа сама не ставит пробелы. Расширение может быть любым, но лучше, если оно будет соответствовать выбранному формату. Дата файла строится по маске указанной тут же. Пока она не редактируется. Так, если скриншот был снят 12 января 1969 года в 11:22:33 PM, то дата будет сформирована вот так: 1969-01-12 23-22-33. Год идёт первым для лучшей сортировки по имени файла - старые скриншоты будут идти первыми в списке. Ниже можно выбрать формат сохраняемого файла. Доступны форматы BMP, PNG, JPG и GIF. Для JPG можно указать качество (от 10 до 100). По умолчанию устанавливается 85 - это компромиссный вариант между качеством и размером файла. 100 обеспечит наивысшее качество, а 10 - наименьший размер файла. Я рекомендую в качестве формата выбирать PNG. Он сохраняет исходное качество картинки, обеспечивая хорошее сжатие по сравнению с BMP. Однако использование форматов отличных от BMP занимает некоторое время на конвертацию картинок. Заметьте, что может случиться так, что программа не сможет сохранить скриншот в формате отличном от BMP. В этом случае она сохранит его как BMP с расширением BMP (то есть настройки будут проигнорированы). "Запускать с Windows". Эта опция включает или отключает автозапуск программы для текущего пользователя. "Звуки (Настраиваются через Панель управления)". Эта опция включает поддержку звуков, которые можно настроить в Панели управления, в апплете "Звук" или "Звуковые или аудиоустройства". Ищите в списке приложение AJPapps - Screen garbber. "Стандартные звуки". Эта опция включает поддержку стандартных звуков, которые можно настроить в Панели управления, в апплете "Звук" или "Звуковые или аудиоустройства". Ищите в списке стандартные события "Восклицание" и "Критическая ошибка". По умолчанию включено. "Писк PC-спикером". Эта опция включает поддержку писка PC-спикером. Работает только если PC-спикер присутствует в компьютере или звуковая карта эмулирует его. Рекомендуется в случаях вроде отсутствия колонок или даже звуковой карты. Командная строка ---------------- Для любителей заходить к себе на компьютер через SSH и телнет я добавила интерфейс командной строки. Он работает только если программа уже запущена. Когда вы запускаете её второй раз с определёнными параметрами, уже запущенная программа делает скриншот. Метод зависит от параметров. Чтобы получить краткую справку, запустите программу с параметром "/?" (без кавычек). /SendPrintScreen - программа эмулирует нажатие PrintScreen. Если в настройках включено отслеживание содержимого буфера обмена, то она сохранить картинку. То есть всё происходит так, как если бы пользователь сам нажал PrintScreen. /ScreenCopy - задействовать метод Screen Copy. /ClipboardCopy - задействовать метод Clipboard Copy. На самом деле это работает почти как /SendPrintScreen, но при этом программа в любом случае сохранит скриншот. /VPCCopy - задействовать метод Virtual PC 2007 window copy. Удаление -------- Удаление самой программы производится обычным способом - через Установку и удаление программ. Однако рекомендуется перед этим запустить программу, снять в настройках галочки отвечающие за автозапуск и звуки, и закрыть программу. Маленький копирайт ------------------ 1. Программа распространяется бесплатно. 2. Вы имеете право распространять её на тех же условиях. 3. При распространении вы не имеете права менять авторство программы, присваивать его себе или каким-либо иным способом искажать его. 4. Разрешено коммерческое использование программы (в офисе, на производстве) за исключением её платного распространения или сдачи в аренду. 5. Программа распространяется как есть. Автор не несёт ответственности за любые трагедии или несчастные случаи, вызванные использованием программы. 6. Вы имеете право использовать ActiveX компоненты, поставляемые с программой, в собственных программах. При этом автор не гарантирует совместимость будущих версий компонентов. 7. Для любого пункта данного соглашения может быть сделано исключение с разрешения автора программы. 8. По любым вопросам, связанным с данной программой, обращайтесь по адресу lindaoneesama@gmail.com Загружено с http://purl.oclc.org/Linda_Kaioh/Homepage/