Знания никогда не бывают лишними, или как Unchecky с Punto Switcher-ом не подружились

Иногда я мысленно ругаю себя за то, что бесцельно трачу время в интернете в поисках новых идей и интересуюсь всем подряд. Особенно я люблю интересоваться тем, что происходит в разных open-source и freeware проектах.

Буквально вчера мое внимание привлекла программа Unchecky, которая снимает всякие "галочки" в различных инсталляторах, не позволяя нежелательным приложениям устанавливаться. Про эту программу я знал давно, благодаря Хабру, и хоть она у меня не установлена, и в её эффективности я сомневаюсь, мне захотелось более подробно ознакомиться с её сайтом. Мне было интересно узнать, какие отзывы о ней пишут другие пользователи, поэтому зашел на ее баг-трекер. 

Мое внимание привлек этот баг http://unchecky.userecho.com/topic/819469-unchecky-conflict-with-browsers-and-windows-7-64-bit/

И вот уже сегодня получаю от пользователя жалобу на глюки при отображении окна Image Uploader под бетой Windows 10:

Unchecky bugs

По специфике артефактов видно, что Unchecky (возможно, в сочетании с Punto Switcher) негативно влияет на отображение диалоговых окон winapi (а в Image Uploader они используются повсеместно для построения интерфейса, в т.ч. используются вложенные диалоги). В других окнах такие глюки не наблюдаются. Видимо, автор перемудрил со своими хуками.

В общем, я с недоверием отношусь к программам с закрытым кодом, которые создают сомнительные сервисы и внедряют свои DLL в другие процессы, пусть и с декларируемой благой целью. Хуки - эта такая хрупкая вещь, которая при неграмотном использовании может привести к непредвиденным последствиям. Что интересно, программа Unchecky не смогла справиться со своей основной задачей - не смогла снять галочки Яндекса при установке Punto Switcher, с которым она конфликтует, чем доказала неэффективность такого подхода в борьбе с нерадивыми производителями программного обеспечения. В конце концов, создатели инсталляторов перейдут на использование элементов GUI, которые не создают нативных win32-контролов. Существует множество фреймворков, которые сами рисуют окна с нуля. И автору придется писать нереальные костыли, чтобы справиться с поставленной задачей. Правда, на помощь может прийти т.н. Acessibility и UI Automation, но ненадолго.

Так моя любознательность позволила мне сэкономить несколько часов на выявления бага не в моем коде и под операционной системой, которая у меня не установлена.

Как передать множество файлов одной команде из контекстного меню проводника Windows

You can archive it with my program called singleinstance (sourcecode).
No shell extensions involved.

The main idea is that one instance of my program will be launched per file you have selected. It is checking if another instance of singleinstance program is running, and using Inter-Process Communication to notify the existing instance that other files have been selected.

Do not forget to set option MultiSelectModel=Player, otherwise number of files will be limited.

Usage:

Usage: singleinstance.exe "%1" {command} $files [arguments]

Optional arguments for singleinstance (not passed to command):

--si-timeout {time to wait in msecs}

Sample registry file:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\Shell\p4merge]
"MultiSelectModel"="Player"

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\Shell\p4merge\Command]
@="\"d:\\singleinstance.exe\" %1 \"C:\\Program Files\\Perforce\\p4merge.exe\" $files --si-timeout 400"