Pull to refresh

Comments 31

А почему вы просто не взяли какой-нибудь скриншоттер, их же полно и они решат вашу проблему на 100%.
Но согласитесь, это куда круче выглядит! Месье знает толк.
Не знаю, давно пользуюсь paint.Net вместо обычного, он умеет вставлять в скайп, я даже сначала удивился, что встроенный пейнт этого не умеет. Думал, скайп так работает с любым изображением в буфере. Проверил сейчас — очень удивился. Разве что названия он генерирует не очень, по схеме i%number%^cimgpsh
Я понимаю, что пост не об этом, но просто хочу порекомендовать Clip2net для этих целей.
Clip2net — одна из самых ужасных утилит такого плана. Обилие рекламы, попапы, ограниченный срок хранения изображений (в некоторых случаях — всего сутки!) и прочие прелести.

В то-же время существую отличные opensource альтернативы типа ShareX _https://getsharex.com/
Умеет сохранять на диск и/или разные хостинги на выбор (imgur, dropbox, еще 22 других варианта и настраиваемый свой)
Имеет довольно удобный редактор (размытие, подсветка, рамочки, стрелочки, вот это всё) и можно подключить сторонний редактор.
Я уж молчу про хоткеи

Из минусов — разве что многовато настроек, и по умолчанию включено слишком много свистелок.
За sharex спасибо. Сам использовал долгое время droplr, но про известными причинами отказался в пользу monosnap.
ShareX классный, но к сожалению как-то коряво иногда работает с FTP. На работе стоит FTP-сервер с довольно специфическими настройками, например, можно заливать файлы, но нельзя просматривать список файлов. И походу крышу сносит ShareX от этого. Исключение выплёвывает, а описания исключения нет.
Но есть исходники, и если очень хочется — можно разобраться что к чему. Я заливаю на imgur — всё отлично раздается и хранится вечно.
Да, я качал исходники. И проект даже запустился. Но так и не смог понять где баг. Походу где-то в либах .NET.
Кстати, исходные коды первой версии Gyazo доступны здесь. Код небольшой (хоть и с комментариями на японском), поэтому можно достаточно быстро адаптировать под свои нужды. Я, например, научил его пробовать сжимать в JPG и PNG, и выбирать из этого то что лучше справилось с задачей, и добавил запуск редактирования выбранного участка экрана в Paint если выделение было сделано с зажатой кнопкой Shift :) Правда, писалось это исключительно под себя, поэтому там ещё для максимального сжатия изображения запускаются консольные truepng и кодер mozjpeg с моими любимыми настройками. Хотя это делалось уже достаточно давно (как только Gyazo заменил прямые ссылки на файлы изображений страницами с левым контентом помимо изображения), и наверняка новые Open Source скриншотилки уже научились делать всё что нужно без ковыряния в коде :)
UFO just landed and posted this here
В программах в том-то и плюс, что не нужно пользоваться заливальщиками. Обвел область, накидал если надо пометок, нажал одну кнопку и отправил. Если нужно просто область, то чуть другой хоткей (у меня ctrl+alt+4 например), после этого сразу можно уже разворачивать скайп/мессенджер и вставлять туда ссылку на изображение.

Сравните с тем, что я раньше с imgur'ом парился: скриншот, открыть пейнт, вставить его, обрезать нужную область, сделать по необходимости пометки, сохранить файл (потом научился прямо из пейнта копировать), зайти на сайт, вставить туда картинку, дождаться, пока скачается (в моноснапе качается намного быстрее, и то, пока вы разворачиваете программу/ищете вкладку, куда вставить хотите), после этого копируете url на картинку и вставляете куда хотели. Отличие от одного шортката на мой взгляд достаточно существенное.
UFO just landed and posted this here
JMP непонятно куда, перенос части удалённых инструкций в совсем в другое место исполняемого файла и JMP обратно в исходную точку на мой взгляд выглядит грязно. Если это делается автоматически для перехвата вызовов каких-то функций — это одно. Но здесь же вы работаете вручную и вполне можете придумать более красивое решение.

В вашем случае, например, вы могли бы просто подменить адрес вызова функции, результат работы которой вы хотите изменить, на вызов своей функции, дописанной в конце секции кода (обычно там достаточно много свободного пространства), внутри которой вы могли бы вызвать и оригинальную функцию, и выполнить нужный вам дополнительный код, и вернуться обратно стандартным retn без танцев с бубном. То есть это выглядело бы так, будто в исходном коде вместо прямого вызова функции «A» программист вызвал функцию «B», которая в свою очередь вызвала бы искомую функцию «A» сделала что-то ещё.

Второе решение будет работать, однако, по моему мнению, выглядит не очень элегантным.
Любопытно. В этом предложении вы ведёте рассуждение об элегантности, но при этом всё ваше решение заключается в запуске внешнего исполняемого файла, написанного на C#, при каждой операции копирования.
JMP непонятно куда

Что значит «непонятно куда»? Как раз в «конец секции кода», упомянутый Вами, и осуществляется прыжок.

JMP обратно в исходную точку на мой взгляд выглядит грязно

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

В вашем случае, например, вы могли бы просто подменить адрес вызова функции, результат работы которой вы хотите изменить

Согласен, так я и делал в некоторых других статьях.
Если приводить аналогии из обычного программирования, это выглядит как прямо посреди какой-то фукнции вставлен goto на какой-то код внутри совершенно другого файла, а затем из того файла идёт goto обратно в код этой функции. То есть выходит, что линейный код одной функции находится не в одном месте, а разнесён на несколько частей в совершенно разных частях файла. Понятно, что будет работать и так, но выглядит не очень красиво. А при серьёзной модификации исполняемого файла с сотнями правок (типа этого патча NFS3) подобное «размазывание» кода функций по исполняемому файлу на мой взгляд усложняет дальнейшую модификацию (особенно для тех, кто потом будет изучать ваши правки и дорабатывать код дальше).

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

Решаемая костылём проблема заключалась в том, что разработчики NFS4 в одной из функций забыли инициализировать одну из переменных в стеке. Для корректной работы функции эта переменная должна была иметь ненулевое значение. И по совершенно случайному стечению обстоятельств после всего кода, который отрабатывал до вызова этой функции, в той ячейке памяти оказывалось значение, которое было в регистре esi при старте приложения. В ранних версиях Windows видимо при старте программы регистры не обнулялись, поэтому всё работало. А в Windows 7 сразу после старта в esi всегда 0, поэтому та функция работала ошибочно и игра отказывалась запускаться. В исследуемом патче была решена изменением точки входа, где в esi устанавливалось 0xFFFFFFFF и управление отдавалось оригинальной точке входа. Таким образом, малейшее изменение в коде программы до вызова функции с ошибкой просто поломало бы этот «фикс». А ведь надо было всего-то добавить корректную инициализацию этой переменной ненулевым значением. Тут конечно всегда возникает вопрос, а как вставить эту строку — и отдельный интерес придумать красивое решение. В итоге я сместил пролог функции на -6 байт (там как раз из-за выравнивания было свободное пространство), добавил инструкцию инициализации проблемной переменной сразу после пролога и исправил адрес этой функции в месте, где она изначально вызывалась. В итоге исправление получилось даже проще, трюк с esi, но при этом этот код не рухнет ни при каких других изменениях.

Машинный код тоже может быть как красивым, так и кошмарным. Понятно, что один небольшой костыль погоды не сделает, но мне кажется, что для статей всё же стоит подбирать какие-то более элегантные и интересные решения, на которые можно было бы равняться. Не количеством, а качеством.
А обрезать как?
Кроме того, если два монитора, PrtScr делает скриншот сразу двух. Я не помню случая, когда мне нужно было отослать скриншот обоих мониторов.
Alt+PrtScr же! Получается скрин только активного окна.
Ctr+мышкой выделяете прямоугольную область.
Правой кнопкой мыши можно еще что-нибудь обозначить.
Ctr+Правой кнопкой — выделить прямоугольную область.
Backspace — удалить если что не так выделили.
Подробнее тут www.fiastarta.com/PrtScr/Help.html
Попробуйте Ctrl+мышкой выделить например наши два сообщения в браузере, без всего остального окна?
Я вот не хочу, чтобы список всех моих закладов наверху было видно, как и например названия других открытых табов.
У Яндекс.Диска для Windows похожая возможность есть. Правда нет возможности делать снимок произвольной области, но зато есть встроенный редактор, который и Ctrl+Z поддерживает.
Ценность статьи не в самой доделке, а в описании процесса диагностики низкоуровневых вещей, в описании правильных утилит. Я как раз искал чем поковырять внутренности клипборда.
Sign up to leave a comment.

Articles