Идея


Привет. Я начинающий 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