Идея
Привет. Я начинающий C# .NET разработчик (уже как второй год начинающий). Мне надоело писать всякие калькулято��ы и т.п., поэтому я спросил себя: «А чего мне не хватает в Windows?». И ответ, к которому я пришёл, дал мне идею: «Всего». Так и появился Binder, проект, позволивший мне узнать много нового в C#, .NET и WPF, и давший мне неплохой софт, который так мне понравился, что я решил его показать всем.
О самой программе
Binder предназначен, неожиданно, для биндов. Эти бинды можно настроить на любое сочетание клавиш: кнопка + 2 модификатора (CTRL, Shift, ALt, Win), а также прилепить на них скрипты. Скрипт пишется на внутреннем языке, который я пытался сделать максимально похожим на C#.
Принцип такой же, как и в AutoHotKey. С программой идёт DLL, в которую я потихоньку добавляю различные функции(сейчас их там 49). По моему мнению, язык Binder уже можно считать интерпретируемым языком программирования, хоть и мало на что способным, т.к. там уже есть конструкция if-else, циклы while и repeat, функции (асинхронные тоже), операторы break и return, типы данных int, double, bool, string.
В программе бинды работают глобально по всему ПК, а имитация клавиш, взятая из AHK, может имитировать нажатия почти во всех приложениях.
Первая задача которую я хотел решить с помощью Binder — это показать/скрыть значки рабочего стола. И поэтому первый скрипт который я добавил — ShowHideDesktopIcons(bool show). Но тут встаёт вопрос, как сделать и скрытие и показ на одну кнопку? Его я решил добавив биндам параметр «Бинд-переключатель», который позволяет на 1 бинд навесить 2 скрипта сразу, которые выполняются по-очереди. Уже сейчас на Binder можно сделать автокликер, или например, бинд, Ctrl + Shift + C, который выделенный текст добавит в буфер обмена, а не заменит, или бинд на выключение/перезагрузку ПК. Одним из самых полезных считаю бинд «Супер Alt+F4», который получает процесс активного окна и убивает его. В программе есть поддержка переменных: Можно сохранить любое значение с помощью SetVar(), и получить его GetVar(). Сегодня с сделал атрибуты для выполнения скриптов, и первым стал Block, который блокирует нажатие клавиш бинда, пока не завершиться его основной поток. В скоре планируется добавить пространства имён, чтобы перекидывать переменные из одного скрипта в другой.
Полезным дополнением считаю функцию «Запись», которая записывает все действия с клавиатуры и мыши, сразу превращая их в скрипт для Binder.
В окне помощи можно найти все доступные функции, а вскоре там появятся и атрибуты для скриптов.
Все бинды можно сохранять в файл, чтобы не потерять.
В настройках можно включить запуск программы вместе с Windows, настроить открываемый по умолчанию файл биндов.

Хочу отметить удобную вещь: при использовании вложенных конструкций (например if внутри while), после нажатия кнопки «Сохранить» скрипт красиво отформатируется.
Синтаксис
В Binder привычный всем программистам синтаксис, делался по подобию C#.
Например вызов функции MsgBox (как и любой другой) выглядит так:
MsgBox("Это заголовок", "Этот текст будет в теле");
При выполнении этой строки будет такой результат:

MsgBox() принимает параметры, посмотреть их для каждой функции можно в окне помощи.
В помощи все функции отсортированы по типу возвращаемого значения:

Всем, кто писал на C++/C# будет сразу понятно как это работает, за исключением первого типа: функции из группы «Не возвращающие значения» возвращают параметры, переданные в них.
Например:
MsgBox(MsgBox("Hello"));
2 раза выведет сообщение с текстом «Hello».
Из этой строки можно понять ещё одну важную деталь: одни функции могут передаваться в параметры другим.
Помимо встроенных функций, в программе существуют различные конструкции. Следует отметить, что у меня любая целая конструкция считается как 1 команда, поэтому в конце каждой из них нужно ставить ;. Я уберу это позже.
Конструкция if-else.
Она работает точно так же как и в любом другом языке:
if(<условие1>)
{
<действие1>
}
else if(<условие2>)
{
<действие2>
}
....
else
{<действие, если все условия false>};
Можно писать сколько угодно else if, писать/не писать else, вообщем как угодно. Главное, чтобы в круглых скобках <условие> было типа Boolean. Например, можно туда написать true, и условие всегда будет выполняться.
Конструкция repeat
repeat — это самый простой цикл в программе, в круглых скобках должно быть значение типа Int, и он просто повторяет действия указанное число раз, например:
repeat(SumInt(2,3))
{
MsgBox("Привет");
};
5 раз выведет сообщение «Привет».
У него есть 2 модификации:
1) async repeat(). Под его выпо��нение выделится отдельный поток, т.е. сразу после его начала будут выполняться функции, стоящие после него.
2) allasync repeat() сразу запустит выполнение кода внутри себя указанное число раз, например:
allasync repeat(5)
{
MsgBox("Hello");
};
Одновременно выведет 5 сообщений:

Конструкция while
While — дословно с англ. — пока верно условие. Выполняет функции внутри себя до тех пор, пока верно условие в круглых скобках. Это условие должно быть типа Boolean.
Можно принудительно прервать выполнения цикла с помощью оператора break; Пример:
SetVar("i", 0);
while(true)
{
SetVar("i", SumInt(GetVar("i"), 1));
MsgBox(GetVar("i"));
if(MoreThan(GetVar("i"), 10))
{
break;
};
};
MsgBox("Вышли");
Выведет сообщения с числами от 1 до 11, и завершит работу.
У while также есть модификация async while, которая просто выполняет его в отдельном потоке, позволяя продолжить выполнение основного кода.
Функции
В Binder можно объявлять и использовать свои функции и передавать в них параметры
func f1(text)
{
MsgBox(ReplaceString(text, "\", " habr "));
};
f1(GetDesktopPath());
У меня выводит:
Так же функции могут возвращать значения, для этого нужно использовать оператор return:
func f1(text)
{
return MsgBox(ReplaceString(text, "\", " habr "));
};
MsgBox(f1(GetDesktopPath()));
Теперь тот же результат, только сообщение выводится 2 раза.
О группе
Таким образом можно создать что угодно на основе Binder, нужны лишь функции в библиотеке, которые мне добавлять очень просто, для этого мне нужны лишь идеи. Это одна из причин создания группы ВКонтакте vk.com/public192980751. Binder абсолютно бесплатен, а я готов помочь с любым вопросом о программе. Пожалуйста, поддержите меня, просто посоветовав что добавить, потестируя проект, или просто подписавшись на группу.
P.S. Проект появился на GitHub github.com/Electrominch/Binder