Идея


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