<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Александр Мусин</title><generator>teletype.in</generator><description><![CDATA[Небольшие заметки об автоматизации повседневной работы на компьютере]]></description><image><url>https://img1.teletype.in/files/4a/be/4abe2563-9fae-4888-b949-811c3a186dc4.gif</url><title>Александр Мусин</title><link>https://teletype.in/@ttach</link></image><link>https://teletype.in/@ttach?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/ttach?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/ttach?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Sun, 05 Apr 2026 16:43:46 GMT</pubDate><lastBuildDate>Sun, 05 Apr 2026 16:43:46 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@ttach/anbur-android</guid><link>https://teletype.in/@ttach/anbur-android?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach</link><comments>https://teletype.in/@ttach/anbur-android?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach#comments</comments><dc:creator>ttach</dc:creator><title>Анбур для андроид</title><pubDate>Mon, 09 Jun 2025 16:45:16 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/e4/0f/e40f8376-1419-45f7-a9e9-d7b69dd4e915.png"></media:content><category>VBA</category><tt:hashtag>vba</tt:hashtag><tt:hashtag>android</tt:hashtag><tt:hashtag>anbur</tt:hashtag><description><![CDATA[<img src="https://img2.teletype.in/files/d6/49/d6496903-547a-4d6e-a874-0f64e085b769.png"></img>Установите клавиатуру Jbak2 Keyboard. С помощью Excel преобразуйте русскую раскладку клавиатуры в древнепермскую]]></description><content:encoded><![CDATA[
  <section>
    <p id="plyu"><a href="/@ttach/in_nuce">🌰</a> Установите клавиатуру <a href="https://jbak2.ucoz.net/load/1" target="_blank">Jbak2 Keyboard</a>. С помощью <a href="https://gitflic.ru/project/yabalak/anbur-android" target="_blank">Excel</a> преобразуйте русскую раскладку клавиатуры в древнепермскую. Также можно скачать <a href="https://gitflic.ru/project/yabalak/anbur-android" target="_blank">готовую раскладку</a>.</p>
  </section>
  <figure id="hX1z" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/d6/49/d6496903-547a-4d6e-a874-0f64e085b769.png" width="1600" />
    <figcaption>Древнепермская раскладка в ландшафтном режиме</figcaption>
  </figure>
  <h2 id="Ml8H">Введение</h2>
  <p id="1FKb">В Android Nougat (2016 год) появилась поддержка Unicode 7.0.<br /><a href="https://teletype.in/@ttach/anbur" target="_blank">В отличие от Windows</a> в Android предустановлены шрифты Noto, включающие, в том числе, символы древнепермской азбуки (анбура). В данной статье рассмотрим метод ввода символов анбура на андроид-устройствах.</p>
  <h2 id="yDl6">Существующие решения</h2>
  <p id="08tj">В google play представлено приложение <a href="https://play.google.com/store/apps/details?id=com.majbyr.keyboard&hl=ru" target="_blank">Anbur keyboard</a>, позволяющее набирать символы анбура.</p>
  <figure id="cd3i" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/ba/fe/bafe65c9-4c7f-4fbe-917c-2ff378720653.png" width="800" />
    <figcaption>Приложение Anbur keyboard</figcaption>
  </figure>
  <p id="zGqP">В этой клавиатуре буквы расположены несколько странным образом, не хватает букв Я,  Ю, джой, дзита, щой. Для переключения на русскую/английскую раскладку требуется менять способ ввода нажатием на ⌨.</p>
  <h2 id="GJ2B">Предлагаемое решение</h2>
  <p id="eQ7N">Обсуждаемый метод предполагает использование приложения Jbak2 Keyboard для ввода символов. Установить приложение можно из следующих источников:</p>
  <ul id="7zjR">
    <li id="RzAr">Сайт программы <a href="https://jbak2.ucoz.net/load/1" target="_blank">https://jbak2.ucoz.net/load/1</a></li>
    <li id="veoi">Телеграм-канал <a href="https://t.me/Jbak2" target="_blank">https://t.me/Jbak2</a></li>
    <li id="IHt6">RuStore <a href="https://www.rustore.ru/catalog/app/com.jbak2.JbakKeyboard" target="_blank">https://www.rustore.ru/catalog/app/com.jbak2.JbakKeyboard</a></li>
  </ul>
  <p id="20N9">Приложение Jbak2 Keyboard представляет собой профессиональную клавиатуру-конструктор для лиц, набирающих большие объёмы текста (журналисты, программисты, редакторы, писатели...). Приложение функционирует на всех устройствах с ОС Android 4.4+. Малый объём (~1,5 МБ) и высокая скорость работы делают её программой первого выбора для устройств с малым объёмом памяти, для маломощных устройств вроде электронных книг и часов, а также телефонов с Android GO.</p>
  <p id="MXuO">Широчайшие возможности тонкой настройки программы, оформления и функционала раскладок позволяют удовлетворить нужды наиболее требовательных пользователей.</p>
  <h3 id="kbzM">Порядок работы</h3>
  <p id="UvnX">Файл <a href="https://gitflic.ru/project/yabalak/anbur-android" target="_blank">Anbur android layout.xlsm</a> содержит таблицу соответствия русских букв и символов анбура. В данной таблице мы можем указать, какой символ будет вводиться по короткому и длинному нажатию каждой кнопки.</p>
  <p id="z8rE">По нажатию на кнопку «Генерировать» программа запрашивает файл русской раскладки <code>ru_***.xml</code> и заменяет буквы в нём в соответствии с указанной таблицей. Полученный в результате файл <code>an_ru_***.xml </code>следует загрузить на девайс в папку <code>/storage/emulated/0/jbak2Keyboard/keyboards</code> и выбрать его в настройках Jbak2 Keyboard (пункт «языки и раскладки») для афарского языка. Причём можно выбрать отдельную раскладку для портретной и ландшафтной ориентации.</p>
  <p id="lTJz">На картинке ниже показан принцип создания раскладки для портретной ориентации. В левой части картинки представлен скриншот окна выбора раскладки для русского языка. Любую из встроенных раскладок можно сохранить в файл xml. Полученный файл (в примере это <code>ru_qwerty.xml</code>) следует скопировать с телефона на компьютер и открыть в <a href="https://gitflic.ru/project/yabalak/anbur-android" target="_blank">Anbur android layout.xlsm.</a> В той же папке на ПК будет сформирован файл aa_исходное название файла.xml, например, <code>aa_ru_qwerty.xml</code>. В правой части картинки этот файл вырбан в качестве пользовательской раскладки: </p>
  <figure id="vPXc" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c8/a0/c8a08dc2-678f-41ac-9b83-3430be82692d.jpeg" width="1585" />
    <figcaption>После обработки в excel русские буквы заменились на символы анбура</figcaption>
  </figure>
  <p id="I12k">Так может выглядеть древнепермская раскладка на планшете:</p>
  <figure id="c5K1" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/9e/3a/9e3a7b02-7d0e-473b-a4a8-c14acc96a204.jpeg" width="1560" />
    <figcaption>Раскладка «qwerty для планшетов»</figcaption>
  </figure>
  <p id="k7KL">А так — на часах:</p>
  <figure id="rSC5" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/e0/41/e0417fd4-bc8d-4b00-8792-50b644195f20.jpeg" width="4228" />
    <figcaption>Раскладка «Для круглых часов»</figcaption>
  </figure>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Zeji">NB: у меня нет планшета и часов, это всё обработанные скриншоты с телефона</p>
  </section>
  <h3 id="F7TW">О подсказках</h3>
  <p id="QW0K">На всех скриншотах Вы можете видеть маленькие русские буквы в углах кнопок. Обратите внимание: они <strong>не будут печататься</strong> при долгом нажатии на кнопку, как это принято в JBak2kbd. Они служат только в качестве подсказок о том, какая буква соответствует данному символу анбура. Напротив, по длительному нажатию на кнопку может печататься другая буква, в соответствии с таблицей в excel, например, по короткому нажатию на О набирается 𐍩, а по длительному — 𐍩̈ </p>
  <figure id="KMWJ" class="m_retina" data-caption-align="center">
    <img src="https://img2.teletype.in/files/10/73/1073d8fd-73d9-4ece-8c0d-1183b8cebfa1.jpeg" width="351.5" />
    <figcaption>Указание символов для короткого и длительного нажатия в excel</figcaption>
  </figure>
  <h3 id="6Ada">Где взять исходную раскладку?</h3>
  <p id="h0TR">В качестве исходных файлов для конвертации можно взять файлы раскладок, встроенных в программу Jbak2 Keyboard. Их можно получить по нажатию на «Декомпилировать» на экране выбора раскладки. Кроме того, пользователи программы Jbak2 Keyboard самостоятельно создают раскладки и размещают их <a href="https://4pda.to/forum/index.php?showtopic=897533" target="_blank">на формуме 4pda</a>. Также существует приложение-компаньон <a href="https://jbak2.ucoz.net/load/" target="_blank">jbak2layout</a>, содержащее множество раскладок для клавиатуры со скриншотами.</p>
  <p id="G35l">Обратите внимание: телефонные раскладки этим инструментом не поддерживаются. «Телефонные» — это те, на кнопках которых указано сразу несколько букв, переключаемых путём многократного нажатия одной и той же клавиши:</p>
  <figure id="XRYG" class="m_retina">
    <img src="https://img3.teletype.in/files/29/c8/29c8bbdf-6a10-4155-aaa5-4d3a704ea713.png" width="360" />
    <figcaption>Такие раскладки не поддерживаются макросом</figcaption>
  </figure>
  <p id="rd55">После установки раскладки Вы сможете переключать языки ввода Ru→En→__ по клавише выбора языка.</p>
  <tt-tags id="gecF">
    <tt-tag name="vba">#vba</tt-tag>
    <tt-tag name="android">#android</tt-tag>
    <tt-tag name="anbur">#anbur</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ttach/powerpoint-speaks</guid><link>https://teletype.in/@ttach/powerpoint-speaks?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach</link><comments>https://teletype.in/@ttach/powerpoint-speaks?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach#comments</comments><dc:creator>ttach</dc:creator><title>Чтение вслух (TTS) презентаций PowerPoint</title><pubDate>Thu, 20 Jul 2023 17:22:36 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/02/13/02138bb4-89d4-46d9-8e84-ac470434b9a2.png"></media:content><category>VBA</category><tt:hashtag>powerpoint</tt:hashtag><tt:hashtag>vba</tt:hashtag><tt:hashtag>tts</tt:hashtag><tt:hashtag>speech</tt:hashtag><tt:hashtag>презентация</tt:hashtag><tt:hashtag>вслух</tt:hashtag><description><![CDATA[<img src="https://img2.teletype.in/files/da/35/da35a249-d25d-4f3e-9553-9147c21c0965.png"></img>В двух словах. Запустите надстройку. Компьютер сможет проговаривать текст слайдов с помощью системного TTS-движка windows. Слайды будут сами переключаться. Вместо текста слайдов можно проговаривать заметки докладчика.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="CPHV">В двух словах. Запустите <a href="https://gitflic.ru/project/yabalak/powerpoint-tts/release/latest" target="_blank">надстройку</a>. Компьютер сможет проговаривать текст слайдов с помощью системного TTS-движка windows. Слайды будут сами переключаться. Вместо текста слайдов можно проговаривать заметки докладчика.</p>
  </section>
  <figure id="m6qg" class="m_original">
    <img src="https://img2.teletype.in/files/da/35/da35a249-d25d-4f3e-9553-9147c21c0965.png" width="537" />
    <figcaption>Скриншот ленты powerpoint после запуска надстройки</figcaption>
  </figure>
  <h2 id="FaH4">Введение</h2>
  <p id="jKXU">В PowerPoint нет встроенного инструмента для произнесения вслух текста презентаций. В интернете Вы можете <a href="https://support.microsoft.com/ru-ru/office/%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8-%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0-%D0%B2-%D1%80%D0%B5%D1%87%D1%8C-%D0%BF%D1%80%D0%BE%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%D0%B8%D1%82%D1%8C-459e7704-a76d-4fe2-ab48-189d6b83333c" target="_blank">найти</a> <a href="https://www.makeuseof.com/how-to-use-powerpoint-speak/" target="_blank">способ</a> проговаривания выделенных текстовых блоков при редактировании презентации, но не всей презентации целиком. <br />Предлагаемый в данной статье инструмент решает эту задачу: компьютер проговаривает весь текст слайда и переходит к следующему слайду и так до конца презентации.</p>
  <h2 id="GwcN">Скачивание и запуск надстройки</h2>
  <p id="pNlM">Для того, чтобы заставить компьютер с windows 7 разговаривать по-русски, Вам понадобится установить на TTS-движок и русский голос к нему. А в комплект поставки windows 10 уже входят русские голоса Ирина и Павел. Выберите нужный  голос в настройках специальных возможностей.</p>
  <p id="2QHj">Для проговаривания презентаций настраивать и использовать программу чтения с экрана не потребуется. Надстройка работает напрямую с речевым API системы windows.</p>
  <p id="fFMn">Скачайте файл «Озвучивание презентаций.ppam» по ссылке <a href="https://gitflic.ru/project/yabalak/powerpoint-tts/release/latest" target="_blank">https://gitflic.ru/project/yabalak/powerpoint-tts/release/latest</a><br />При запуске требуется разрешить запуск макросов для работы надстройки:</p>
  <figure id="6pvx" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/9a/bd/9abdad80-b697-414a-8d99-96f22f7ff645.png" width="447" />
    <figcaption>внешний вид предупреждения зависит от версии PowerPoint</figcaption>
  </figure>
  <p id="iq1O">Разумеется, запуск случайных файлов из интернета способен привести к блокировке компьютера и краже Ваших личных данных, поэтому используйте антивирус. Также по указанной ссылке Вы найдёте исходный код данной надстройки.</p>
  <h2 id="UsXO">Описание работы</h2>
  <p id="afOk">«Надстройка» для PowerPoint — это специальный файл с расширением <code>ppam</code>, который не содержит слайдов, но содержит код программы и пользовательский интерфейс, расширяющий возможности PowerPoint.</p>
  <p id="gRrM">В нашем случае после запуска надстройки «Озвучивание презентаций.ppam» на вкладке «Главная» в интерфейсе PowerPoint появятся новые кнопки. Они будут доступны для всех презентаций, пока Вы не закроете PowerPoint. Далее следует описание каждой кнопки и порядок работы с программой.</p>
  <figure id="S50j" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/17/f8/17f8b196-b4d0-4149-a580-cc87de732146.png" width="987" />
    <figcaption>Скриншот панели озвучивания презентаций на вкладке «Главная»</figcaption>
  </figure>
  <h3 id="XIRZ">Кнопка «Говорить текст слайдов»</h3>
  <p id="W260">Первая кнопка на панели начинает показ слайдов с текущего слайда, при этом все текстовые объекты на слайде будут озвучены компьютером. Например, заголовок, подзаголовок слайда, а также все надписи, таблицы, графика SmartArt. Объекты слайда озвучиваются в порядке их добавления на слайд. Таблицы — по строкам. Между объектами компьютер будет делать паузу в 300 миллисекунд, а после произнесения всего текста слайда — в 3 секунды. Затем откроется следующий слайд и чтение продолжится. Смотрите далее, как отрегулировать данные задержки.</p>
  <p id="kXAL">Прервать показ слайдов и чтение текста можно обычным способом — нажатием Esc.</p>
  <p id="RPUa">Клавиатурное сочетание для вызова этой команды —  <strong><code>Alt+я, плюс</code> </strong>или <strong><code>F10, я, плюс</code>. </strong>То есть, для вызова команды чтения текста слайдов можно нажать сочетание Alt+я, а затем клавишу плюс, либо последовательно нажать клавиши <code>F10</code>, <code>я</code> и <code>плюс</code>. </p>
  <h3 id="KcZx">Кнопка «Говорить заметки докладчика»</h3>
  <p id="hZqA">Вторая кнопка на панели озвучивания работает аналогично, но компьютер проговаривает не тексты слайдов, а тексты заметок докладчика, вводимые в нижней части окна PowerPoint.</p>
  <figure id="wt7T" class="m_original" data-caption-align="center">
    <img src="https://cs10.pikabu.ru/post_img/big/2020/09/16/5/1600242695165782643.png" width="754" />
    <figcaption>Расположение зоны заметок докладчика</figcaption>
  </figure>
  <p id="B8eu">По-прежнему переключение слайдов происходит автоматически с задержкой в 3 секунды после окончания чтения.</p>
  <p id="aqRo">Клавиатурное сочетание для команды чтения заметок докладчика   —  <strong><code>Alt+я, звёздочка</code> </strong>или <strong><code>F10, я, звёздочка</code>.</strong></p>
  <h3 id="iSKD">Кнопка «Настройки речи»</h3>
  <p id="xeAy">Эта кнопка открывает настройки преобразования текста в речь системы windows.  Это же окно можно открыть через панель управления windows. Здесь можно выбрать голос, задать его скорость, тембр и другие параметры речи.</p>
  <p id="XAbz">Клавиатурное сочетание —<strong><code>Alt+я, минус</code> </strong>или <strong><code>F10, я, минус</code>.</strong></p>
  <figure id="Hq1v" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/a1/43/a143a067-1c4b-49d8-b633-adbceb0e74d7.png" width="486" />
    <figcaption>Окно настроек TTS в Windows 7</figcaption>
  </figure>
  <h3 id="r4q8">Задержка между объектами на слайде</h3>
  <p id="FBIQ">Это поле, обозначенное «<em>Зад. 1»</em> позволяет установить задержку в миллисекундах между произнесением текста отдельных элементов слайда, а также ячеек таблицы. По умолчанию — 300 миллисекунд. Этот параметр нигде не сохраняется и при перезапуске PowerPoint сбрасывается на 300 миллисекунд.</p>
  <p id="qSfj">Клавиатурное сочетание для быстрого доступа к этому полю —<strong><code>Alt+я, открывающая скобка</code> </strong>или <strong><code>F10, я, открывающая скобка</code></strong>. После указания значения нажмите Enter.</p>
  <h3 id="C1gY">Задержка между слайдами</h3>
  <p id="DYCS">Это поле («<em>Зад. 2»</em>) задаёт задержку при переключении слайдов, когда чтение данного слайда завершилось. По умолчанию установлено 3000 миллисекунд.</p>
  <p id="gNNe">Клавиатурное сочетание  —<strong><code>Alt+я, закрывающая скобка</code> </strong>или <strong><code>F10, я, закрывающая скобка</code></strong>. </p>
  <hr />
  <h2 id="n6ZN">Исходный код надстройки</h2>
  <p id="Pv2L">В отличие от надстроек Excel, исходный код надстроек PowerPoint скрыт от пользователей. Поэтому из проекта <a href="https://gitflic.ru/project/yabalak/powerpoint-tts" target="_blank">https://gitflic.ru/project/yabalak/powerpoint-tts</a> скачайте файл <code>Презентация вслух DEV.pptm</code>. В нём находятся несколько слайдов для примера, а по сочетанию клавиш Alt+F11 доступен исходный код на языке VBA. </p>
  <h2 id="3Xe3">Заключение</h2>
  <p id="ZhBg">При подготовке презентаций я рекомендую минимизировать количество текстовой информации на слайде, заменив её изображениями, схемами и графиками. В то же время, речь произносимую при демонстрации каждого конкретного слайда удобно размещать в области «Заметок докладчика», нежели в отдельном документе. При перемещении слайдов внутри презентации (например, если Вы решили перестроить порядок изложения) заметки докладчика будут перемещаться вместе с ними. </p>
  <p id="OCFF">В результате Вы получите презентацию, которая способна «сама себя рассказать» при нажатии на кнопку «Говорить заметки докладчика».</p>
  <p id="h2Gc">А если понадобится свести всю речь в единый документ (то есть подготовить шпаргалку со словами к презентации для лектора), то сделать это можно буквально одним нажатием, как описано в статье «<a href="https://teletype.in/@ttach/powerpoint-speaker-notes" target="_blank">Как выгрузить заметки докладчика в документ Word</a>».  Можете ознакомиться с другими статьями по PowerPoint в блоге по хештегу <a href="https://teletype.in/@ttach?search=%2523powerpoint" target="_blank">#powerpoint</a>.</p>
  <p id="Z71X">Если у Вас возникли вопросы по работе с надстройкой, Вы можете задать их в <a href="https://t.me/yabalak" target="_blank">телеграм</a>, <a href="https://vk.me/478385" target="_blank">ВК </a>или написать на почту <a href="mailto:alxm59@ya.ru" target="_blank">alxm59@ya.ru</a> .</p>
  <p id="u0Zm"></p>
  <p id="dG02"></p>
  <tt-tags id="KHZP">
    <tt-tag name="powerpoint">#powerpoint</tt-tag>
    <tt-tag name="vba">#vba</tt-tag>
    <tt-tag name="tts">#tts</tt-tag>
    <tt-tag name="speech">#speech</tt-tag>
    <tt-tag name="презентация">#презентация</tt-tag>
    <tt-tag name="вслух">#вслух</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ttach/ahk-multipress</guid><link>https://teletype.in/@ttach/ahk-multipress?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach</link><comments>https://teletype.in/@ttach/ahk-multipress?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach#comments</comments><dc:creator>ttach</dc:creator><title>Разные действия в зависимости от числа нажатий на клавишу в Autohotkey</title><pubDate>Mon, 20 Feb 2023 09:27:14 GMT</pubDate><category>Autohotkey</category><tt:hashtag>autohotkey</tt:hashtag><description><![CDATA[Назначаем несколько действий на одну клавишу, нажимаемую многократно.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="004r"><a href="/@ttach/in_nuce">🌰</a>Назначаем несколько действий на одну клавишу, нажимаемую многократно</p>
  </section>
  <p id="YKYY">В <a href="https://www.autohotkey.com/docs/v2/lib/SetTimer.htm" target="_blank">справке AHK</a> приводится пример определения количества нажатий на кнопку в течение определённого времени, но это не самый удобный метод.</p>
  <p id="rGwQ">Предлагаю использовать функцию MultiPress для этих целей. Она принимает в качестве параметров произвольное количество функций. Сколько раз клавиша была нажата, такая по счёту функция и запустится.</p>
  <p id="NCQp">Пример: </p>
  <pre id="nCk7" data-lang="clojure">$Esc:: MultiPress(
    () =&gt; Send(&quot;{Esc}&quot;),
    () =&gt; WinClose(&quot;A&quot;),
    () =&gt; DllCall(&quot;LockWorkStation&quot;))</pre>
  <ul id="BJYL">
    <li id="FOes">Однократное нажатие на Esc просто нажимает Esc. Чтобы скрипт не запускал себя по кругу, там стоит <a href="https://www.autohotkey.com/docs/v2/Hotkeys.htm#prefixdollar" target="_blank">значок доллара</a>.</li>
    <li id="p34j">Двукратное нажатие закрывает <a href="https://www.autohotkey.com/docs/v2/misc/WinTitle.htm#ActiveWindow" target="_blank">активное окно</a>.</li>
    <li id="HGl8">Троекратное (или многократное, или длительное) нажатие <a href="https://www.autohotkey.com/docs/v2/lib/DllCall.htm" target="_blank">блокирует</a> компьютер (как Win+L).</li>
  </ul>
  <p id="mqC0">Вместо <code>()<a href="https://www.autohotkey.com/docs/v2/Variables.htm#fat-arrow" target="_blank">=&gt;</a></code> можно писать <code>Function.<a href="https://www.autohotkey.com/docs/v2/lib/Func.htm#Bind" target="_blank">Bind</a>(...)</code>:</p>
  <pre id="gJvl" data-lang="clojure">$Esc:: MultiPress(
    Send.Bind(&quot;{Esc}&quot;),
    WinClose.Bind(&quot;A&quot;),
    DllCall.Bind(&quot;LockWorkStation&quot;))</pre>
  <p id="pcnt">результат тот же.</p>
  <p id="dCAp">Далее код функции. Замените задержку (400 мс) на комфортную Вам:</p>
  <pre id="dFwo" data-lang="clojure">#Requires AutoHotkey v2+
MultiPress(fun*) {
	static MULTIPRESS_DELAY := 400 ; время распознавания нажатий
	; Принимает в параметрах произвольное число Func-объектов:
	; SomeFunction или ()=&gt;DoSomeAction или SomeFunction.Bind(Parameters)  
	; В зависимости от того, сколько раз вызвана в течение MULTIPRESS_DELAY, та функция и запускается
	static count := 0
	Launcher() { ; Closure-замыкание
		; Запускает функцию № count
		if count &gt; fun.length {
			count := fun.length ; Слишком много нажатий
		}
		if fun.Has(count) {
			fun[count].Call()
		}
		count := 0
	}
	if count &gt; 0 { ; Таймер тикает, считаем нажатия
		count += 1
	} else { ; count = 0, запускаем таймер
		count := 1
		SetTimer Launcher, -MULTIPRESS_DELAY ; Минус, чтобы запустить таймер однократно
	}
}</pre>
  <p id="WX8u"></p>
  <tt-tags id="Fcw2">
    <tt-tag name="autohotkey">#autohotkey</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ttach/office-panning</guid><link>https://teletype.in/@ttach/office-panning?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach</link><comments>https://teletype.in/@ttach/office-panning?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach#comments</comments><dc:creator>ttach</dc:creator><title>Панорамирование/скроллинг/рука в Office</title><pubDate>Mon, 13 Feb 2023 20:04:28 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/64/2a/642a695d-9ea1-48c8-80f1-71341b2ebaf3.png"></media:content><category>Autohotkey</category><tt:hashtag>autohotkey</tt:hashtag><tt:hashtag>word</tt:hashtag><tt:hashtag>excel</tt:hashtag><tt:hashtag>powerpoint</tt:hashtag><tt:hashtag>visio</tt:hashtag><description><![CDATA[<img src="https://img1.teletype.in/files/0b/63/0b635014-eecc-432b-872d-8a274ddbde4f.jpeg"></img>🌰 Прокрутка офисных приложений нажатым колесом мыши, как принято в CAD]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="JINn"><a href="/@ttach/in_nuce">🌰</a> Прокрутка офисных приложений нажатым колесом мыши, как принято в CAD</p>
  </section>
  <figure id="xUnL" class="m_column">
    <img src="https://img1.teletype.in/files/0b/63/0b635014-eecc-432b-872d-8a274ddbde4f.jpeg" width="1099" />
  </figure>
  <nav>
    <ul>
      <li class="m_level_1"><a href="#AGuX">Введение</a></li>
      <li class="m_level_1"><a href="#5RQi">Word</a></li>
      <li class="m_level_1"><a href="#7CQb">Visio</a></li>
      <li class="m_level_1"><a href="#JhBD">Excel</a></li>
      <li class="m_level_1"><a href="#oOd3">PowerPoint</a></li>
      <li class="m_level_1"><a href="#Aj3D">Другие программы</a></li>
    </ul>
  </nav>
  <h2 id="AGuX">Введение</h2>
  <p id="gJWB">При работе в дизайнерских программах, при просмотре карт или PDF-документов Вы можете передвигать чертёж/карту/документ при зажатой кнопке мыши. В CADах это обычно средняя кнопка, в PDF — левая, в 2gis — левая или правая.</p>
  <p id="GCr7">Обычно за включение этого режима отвечает кнопка с иконкой руки (panning hand), вроде такой:</p>
  <figure id="whxH" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/40/bc/40bcd0ee-ad07-4871-be79-147606c3f83f.png" width="32" />
    <figcaption>Иконка руки</figcaption>
  </figure>
  <p id="xBaC">Однако в офисных приложениях нажатие на колесо вызывает режим прокрутки, когда документ начинает ползти в сторону перемещения мыши, что не всегда удобно. Попробуем вернуть «нормальное» поведение колеса в приложениях Microsoft Office.</p>
  <h2 id="5RQi">Word</h2>
  <p id="B0AW">С word-ом проще всего. Функция «рука» встроена в ворд, она называется «Режим панорамирования»:</p>
  <figure id="GYBy" class="m_original">
    <img src="https://img2.teletype.in/files/1f/ce/1fce1dc3-98ae-41f9-bed0-78b05c350aa5.png" width="342" />
  </figure>
  <p id="l76K">В этом режиме удобно редактировать графические элементы в word при большом увеличении. Если функция панорамирования в ворде нужна Вам периодически, то можно вынести её на панель быстрого доступа. А чтобы назначить эту функцию на среднюю кнопку мыши, используем следующий скрипт AHK:</p>
  <pre id="R8Ky" data-lang="clojure">#HotIf WinActive(&quot;ahk_class OpusApp&quot;) ; Когда открыт Word...
MButton:: WordPan()

WordPan(*) {
	if !(wd := GetWord()) ; Если ворд не берётся,
		return            ; то выход
	try {
		WD.ActiveWindow.View.Panning := True  ; рука вкл
		Click &quot;down&quot;                          ; зажали ЛКМ
		KeyWait &quot;MButton&quot;                     ; ждём отпускания колеса
		Click &quot;up&quot;                            ; отжали лкм
		WD.ActiveWindow.View.Panning := False ; рука выкл
	}
}

GetWord(Force:=0) {
	static wd := &quot;&quot;
	return GetComApp(&amp;wd, force, &quot;Word.Application&quot;, &quot;Word&quot;)
}</pre>
  <blockquote id="iMWx"><a href="https://gitflic.ru/project/yabalak/office-pan" target="_blank">Скачать все скрипты из статьи</a></blockquote>
  <p id="8TCw">В скрипте используется функция <a href="https://teletype.in/@ttach/ahk-get-com-app" target="_blank">GetComApp</a>.</p>
  <h2 id="7CQb">Visio</h2>
  <p id="Dbah">В visio тоже несложно использовать «руку», но она активируется странным сочетанием <strong>Ctrl+Shift+Правая кнопка мыши</strong>. Поменяем на среднюю кнопку:</p>
  <pre id="neJU" data-lang="clojure">#HotIf WinActive(&quot;ahk_class VISIOA&quot;)

MButton:: {
	SendInput &quot;{Ctrl down}{Shift down}&quot;
	Sleep 20
	Send &quot;{Rbutton down}&quot;
	KeyWait &quot;MButton&quot;
	Send &quot;{Rbutton up}&quot;
	SendInput &quot;{Ctrl up}{Shift up}&quot;
}</pre>
  <p id="nXZN">Для большего сходства с автокадом включите опцию «Панорамирование с помощью IntelliMouse» в настройках visio, чтобы поворот колеса менял увеличение:</p>
  <figure id="fuzB" class="m_column">
    <img src="https://img3.teletype.in/files/2d/a2/2da23fc6-74a2-4417-a481-7bf91e454f61.png" width="698" />
    <figcaption>Данный флажок активирует увеличение/уменьшение масштаба путём вращения колеса (без ctrl)</figcaption>
  </figure>
  <h2 id="JhBD">Excel</h2>
  <p id="lOIg">А теперь начинается самое интересное. В экселе режима руки нет, хотя он был бы очень кстати для прокрутки широких таблиц влево-вправо. С другой стороны, в Excel имеется поддержка клавиши ScrollLock. Когда Scroll Lock активен (индикатор на клавиатуре горит), клавиши управления курсором ↑↓←→ не передвигают выделение, а осуществляют прокрутку листа, при этом выделение не сбивается. Попробуйте сами. Excel — одна из немногих программ, где работает Scroll Lock.</p>
  <p id="EK9j">А ведь это решение! При зажатии колеса мыши мы будем активировать режим Scroll Lock, а при отжатии — снимать его. Останется периодически опрашивать положение мыши, и, если она передвинулась, сдвигать лист в соответствующую сторону клавишами ↑↓←→. Скрипт для Excel:</p>
  <pre id="28fb" data-lang="clojure">#HotIf WinActive(&quot;ahk_class XLMAIN&quot;) ; Excel
MButton:: ScrollLockPan ; Панорамирование СкроллЛоком

ScrollLockPan() {
	static XT := 30 ; Порог обнаружения движения мыши (пикселей)
	static YT := 30
	static MPOLLING := 50   ; Частота опроса мыши, мс
	mx0:=my0:=mx1:=my1 := 0 ; Начальные и конечные координаты мыши
	MouseGetPos &amp;mx0, &amp;my0
	SetScrollLockState 1    ; Скролл лок ВКЛ
	Loop {
		Sleep MPOLLING
		if !GetKeyState(&quot;MButton&quot;, &quot;P&quot;) { ; Если колесо отпущено,
			SetScrollLockState 0          ; отключаем скролл лок
			return                        ; и выходим
		}
		MouseGetPos &amp;mx1, &amp;my1
		dx := mx1-mx0
		dy := my1-my0
		dx := round(dx/XT*1) ; Здесь значения можно подобрать по вкусу
		dy := round(dy/YT*4) ; Я умножил на 4, чтобы по вертикали двигалось поживее
		;tooltip &quot;dx &quot; dx &quot; dy &quot; dy
		if dX &gt; 0 {
    		Send &quot;{Left &quot; dX &quot;}&quot; ; Нажимаем «влево» нужное число раз (в dX — число)
    	} else if dX &lt; 0 {
    		Send &quot;{Right &quot; abs(dX) &quot;}&quot;
    	}
    	if dY &gt; 0 {
    	    Send &quot;{Up &quot; dY &quot;}&quot;
    	} else if dY &lt; 0 {
            Send &quot;{Down &quot; abs(dY) &quot;}&quot;
    	}
		mx0 := mx1
		my0 := my1
	}
}
</pre>
  <blockquote id="CRe0"><a href="https://gitflic.ru/project/yabalak/office-pan" target="_blank">Скачать все скрипты из статьи</a></blockquote>
  <p id="t3ZE">Разумеется, перемещение листа будет не плавным, как в Word или Visio, а скачками: целыми колонками и строчками сразу. Также сдвиг не будет численно соответствовать количеству пикселей, на которые переместилась мышь. Да это и невозможно, ведь в общем случае все колонки имеют разную ширину, а строки отличаются по высоте.<br />Отрегулируйте параметры задержки (<code>MPOLLING</code>), порогов (<code>XT</code>, <code>YT</code>) и множители в формулах определения dX/dY так, как Вам будет удобнее.</p>
  <h2 id="oOd3">PowerPoint</h2>
  <p id="fAjE">В PowerPoint тоже нет функции «рука». Действуем аналогично: опрашиваем положение мыши, вычисляем сдвиг, но вместо ScrollLock вызываем функцию SmallScroll, передавая в неё величину сдвигов:</p>
  <pre id="cASe" data-lang="clojure">#HotIf WinActive(&quot;ahk_class PPTFrameClass&quot;) ; PowerPoint 2010+
MButton:: ComPanP(GetPoint())

#HotIf WinActive(&quot;ahk_class PP12FrameClass&quot;) ; PowerPoint 2007
MButton:: ComPanP(GetPoint())

ComPanP(App) { ; Панорамирование для PowerPoint
	static XT := 20 ; Это для панорамирования колёсиком
	static YT := 20
	static MPOLLING := 50
	mx0:=mx1:=my0:=my1:=0
	MouseGetPos &amp;mx0, &amp;my0
	if !GetKeyState(&quot;MButton&quot;, &quot;P&quot;)
		return
	loop {
		sleep MPOLLING
		MouseGetPos &amp;mx1, &amp;my1
		dx := mx1-mx0
		dy := my1-my0
		if !GetKeyState(&quot;MButton&quot;, &quot;P&quot;)
			return
		dx := round(dx/XT*2)
		dy := round(dy/YT*4)
		;tooltip &quot;dx &quot; dx &quot; dy &quot; dy
		if (dX||dY) {
			try {
				App.ActiveWindow.SmallScroll -dY, dY, -dX, dX  ; Отрицательные значения не воспринимает
			} catch {
				Tooltip &quot;Отпустите кнопку и начните ещё раз!&quot;
				KeyWait &quot;MButton&quot;
				Sleep 50
				SendLevel 1
				SendEvent &quot;^+{MButton}&quot;
				SendLevel 0
				Tooltip
				return
			}
			mx0 := mx1
			my0 := my1
		}
	}
}

GetPoint(Force:=0) {
	static pp := &quot;&quot;
	return GetComApp(&amp;pp, force, &quot;PowerPoint.Application&quot;, &quot;PowerPoint&quot;, &quot;PP_&quot;)
}</pre>
  <blockquote id="cB5p"><a href="https://gitflic.ru/project/yabalak/office-pan" target="_blank">Скачать все скрипты из статьи</a></blockquote>
  <p id="bJS6">Аналогично, параметры настраиваем по вкусу.</p>
  <p id="1JpA">В powerpoint есть неприятная особенность: слайд переключатся на следующий, если прокрутить в самый низ или верх слайда. См. <a href="https://teletype.in/@ttach/powerpoint-stay-on-slide" target="_blank">Как отключить переход к следующему слайду колёсиком в PowerPoint⁠⁠.</a></p>
  <h2 id="Aj3D">Другие программы</h2>
  <p id="dQso">Использованный приём с регулярным опросом мыши можно распространить и на другие приложения, где Вам хотелось бы добавить панорамирование. Вопрос в том, как сообщать программе, что мы хотим сдвинуть её окно. Один из способов сделать это — послать окну программы сообщение о прокрутке:</p>
  <pre id="ufZ1">;           0x114 — горизонтальная прокрутка
;           0x115 — вертикальная
;             |   1/0 — направление 
;             |    |     id элемента управления
;             |    |      |    HWND окна
;             |    |      |     |
;             ↓    ↓      ↓     ↓
PostMessage 0x114, 1, 0, ctrl, win</pre>
  <p id="BPrz">Узнать id элемента управления можно задав ClassNN, полученный с помощью утилиты Window spy из комплекта программы AutoHotKey:</p>
  <figure id="lOJf" class="m_original">
    <img src="https://img2.teletype.in/files/90/60/9060a04e-e5e5-4114-85da-edf61ae541cd.png" width="356" />
  </figure>
  <p id="Kwqv">Вот пример скрипта для WordPad:</p>
  <pre id="ogMB" data-lang="clojure">#HotIf WinActive(&quot;ahk_class WordPadClass&quot;) ; WordPad

MButton::PanWordPad()

PanWordPad(*) {
	static XT := 30
	static YT := 30
	static MOUSEPOLLING := 50
	mx0:=my0:=mx1:=my1:=0
	
	win := WinGetID(&quot;A&quot;) ; получим id активного окна
	ctrl := ControlGetHWND(&quot;RICHEDIT50W1&quot;, win) ; получим id основного элемента управления, который двигать будем
	
	MouseGetPos &amp;mx0, &amp;my0
	Loop {
		Sleep MOUSEPOLLING
		if !GetKeyState(&quot;MButton&quot;, &quot;P&quot;) {
			return
		}
		MouseGetPos &amp;mx1, &amp;my1
		dx := mx1-mx0
		dy := my1-my0
		dx := -round(dx/XT*3)
		dy := -round(dy/YT*1)
		;tooltip &quot;dx &quot; dx &quot; dy &quot; dy
        if (dX||dY) {
        	if dX &gt; 0 {
        		loop dX 
        			PostMessage 0x114, 1, 0, ctrl, win ; вправо
        	} else if dX &lt; 0 {
        		loop abs(dX)
        			PostMessage 0x114, 0, 0, ctrl, win ; влево
        	}
        	if dY &gt; 0 {
        		loop dY
        			PostMessage 0x115, 1, 0, ctrl, win ; вниз
        	} else if dY &lt; 0 {
        		loop abs(dY)
        			PostMessage 0x115, 0, 0, ctrl, win ; вверх
        	}
        }
		mx0 := mx1
		my0 := my1
	}
}</pre>
  <p id="QPnO"></p>
  <p id="uRvl"><a href="https://gitflic.ru/project/yabalak/office-pan" target="_blank">Файл со всем кодом из статьи</a></p>
  <p id="v744"></p>
  <tt-tags id="RSGt">
    <tt-tag name="autohotkey">#autohotkey</tt-tag>
    <tt-tag name="word">#word</tt-tag>
    <tt-tag name="excel">#excel</tt-tag>
    <tt-tag name="powerpoint">#powerpoint</tt-tag>
    <tt-tag name="visio">#visio</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ttach/powerpoint-stay-on-slide</guid><link>https://teletype.in/@ttach/powerpoint-stay-on-slide?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach</link><comments>https://teletype.in/@ttach/powerpoint-stay-on-slide?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach#comments</comments><dc:creator>ttach</dc:creator><title>Как отключить переход к следующему слайду колёсиком в PowerPoint⁠⁠</title><pubDate>Mon, 13 Feb 2023 19:57:45 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/58/28/58285ed5-426a-4965-9dd1-c82648e307e6.png"></media:content><category>Советы</category><tt:hashtag>powerpoint</tt:hashtag><description><![CDATA[<img src="https://cs12.pikabu.ru/post_img/2020/09/17/8/1600344535182973474.webp"></img>Вы увеличили масштаб в PowerPoint и прокрутили слайд мышкой в самый низ, например, для регулировки размеров изображения в этом месте. Одно неосторожное движение колёсиком и слайд переключается на следующий!]]></description><content:encoded><![CDATA[
  <p id="OXqx">Вы увеличили масштаб в PowerPoint и прокрутили слайд мышкой в самый низ, например, для регулировки размеров изображения в этом месте. Одно неосторожное движение колёсиком и слайд переключается на следующий!</p>
  <figure id="HSZQ" class="m_original">
    <img src="https://cs12.pikabu.ru/post_img/2020/09/17/8/1600344535182973474.webp" width="700" />
  </figure>
  <p id="raaF">Сейчас мы будем решать эту проблему. На ленте выберите Вид → Образец слайдов. Выберите самый первый образец в колонке слева, он чуть больше остальных. Поставьте маленький масштаб. Разместите сверху и снизу от слайда (подальше) какие-нибудь фигуры.</p>
  <figure id="EHB2" class="m_original">
    <img src="https://cs11.pikabu.ru/post_img/2020/09/17/8/160034497417114666.webp" width="700" />
  </figure>
  <p id="wufJ">Проделайте то же самое на других образцах слайдов, например, на образце титульного слайда, пустого слайда (по желанию). Нажмите «Закрыть режим образца» на первой вкладке.</p>
  <p id="5V7R">Готово! Теперь колесо мышки не переключает слайды при редактировании (а при демонстрации, как и положено, переключает).</p>
  <p id="9ZWX">Источник: <a href="https://superuser.com/a/1283911" target="_blank">superuser</a></p>
  <tt-tags id="dfro">
    <tt-tag name="powerpoint">#powerpoint</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ttach/ahk-get-com-app</guid><link>https://teletype.in/@ttach/ahk-get-com-app?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach</link><comments>https://teletype.in/@ttach/ahk-get-com-app?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach#comments</comments><dc:creator>ttach</dc:creator><title>GetObject в AutoHotKey</title><pubDate>Mon, 13 Feb 2023 18:29:35 GMT</pubDate><category>Autohotkey</category><tt:hashtag>autohotkey</tt:hashtag><description><![CDATA[🌰 Используйте ComObjActive(...), чтобы управлять программами]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="YVR8"><a href="/@ttach/in_nuce">🌰</a> Используйте ComObjActive(...), чтобы управлять программами</p>
  </section>
  <p id="vPmx">Функция <a href="https://www.autohotkey.com/docs/v2/lib/ComObjActive.htm" target="_blank">ComObjActive</a> — это аналог GetObject из Visual Basic, только в AutoHotKey. Она позволяет подключиться к программам, которые поддерживают интерфейс COM и управлять ими:</p>
  <pre id="IgKU" data-lang="clojure">word := ComObjActive(&quot;Word.Application&quot;)
if !word
    MsgBox &quot;Word не запущен.&quot;
else
    MsgBox &quot;Сейчас открыт документ &quot; word.ActiveDocument.FullName</pre>
  <p id="jcyw">Если программа ещё не запущена, то запустить её можно с помощью ComObject(...) — это аналог функции CreateObject из VisualBasic:</p>
  <pre id="F0Sb" data-lang="clojure">ie := ComObject(&quot;InternetExplorer.Application&quot;) ; запустить браузер
ie.Visible := true  ; Показать окно браузера</pre>
  <p id="yHRQ">Получив в переменную объект приложения (например, word), мы можем обращаться к свойствам и методам этого приложения. Кроме того, мы можем реагировать на события, которые происходят в приложении. Для этого создадим функции с именами по шаблону <code>ПрефиксСобытие</code>:</p>
  <pre id="rvdD" data-lang="clojure">WD_Quit(app) {
	; Word закрывается
}
WD_DocumentOpen(doc) {
    ; В ворде открыт новый документ
}</pre>
  <p id="QI81">В этом коде <code>WD_</code> — это префикс, а <code>Quit</code> и <code>DocumentOpen</code> — названия событий.</p>
  <p id="4wwv">Теперь укажем, что объект <code>word</code> должен реагировать на события путём запуска функций, начинающихся с <code>WD_</code>:</p>
  <pre id="tgxT" data-lang="clojure">ComObjConnect(word, &quot;WD_&quot;)</pre>
  <hr />
  <p id="rif7"></p>
  <p id="85qj">Чтобы управлять сразу несколькими приложениями из одного скрипта, я использую функцию <strong>GetComApp</strong>:</p>
  <pre id="4aKy" data-lang="clojure">GetComApp(&amp;app, force, className, descr, eventFunctionsPrefix := &quot;&quot;) {
	if force 
		app := &quot;&quot;
		if force = -1
			return   
	if app {
		return app
	}
	try {
		app := ComObjActive(className)
		Tooltip descr &quot;&#x60;nВерсия &quot; app.version
		SetTimer ()=&gt;Tooltip(), -1000
		if eventFunctionsPrefix {
			ComObjConnect app, eventFunctionsPrefix
		}
		return app
	} catch {
		Tooltip descr &quot; не найден&#x60;nGetComApp()&quot;
		SetTimer ()=&gt;Tooltip(), -2000
		return
	}
}</pre>
  <p id="mHqA">У этой функции такие параметры:</p>
  <ul id="bS3n">
    <li id="GM2c"><code>&amp;app</code> — переменная, в которую помещается объект, например <code>&amp;word</code>. Знак <strong>&amp;</strong> означает, что это указатель.</li>
    <li id="AFFr"><code>force</code> — если передать <code>1</code>, то произойдёт повторное подключение к объекту, даже если оно было выполнено ранее<br />а если передать <code>-1</code>, то вернётся пустой объект. Это можно использовать для отключения от объекта приложения.</li>
    <li id="XJWM"><code>className</code> — название класса приложения, например <code>&quot;Word.Application&quot;</code></li>
    <li id="8nk0"><code>descr</code> — понятное название приложения, например, <code>&quot;Ворд&quot;</code></li>
    <li id="6kec"><code>eventFunctionsPrefix</code> — префикс для обработки событий, например, <code>&quot;wd_&quot;</code> (необязательный).</li>
  </ul>
  <p id="31aH">Теперь добавим функции, которые получают ссылки на нужные приложения:</p>
  <pre id="KNyx" data-lang="clojure">GetWord(Force:=0) {
	static wd := &quot;&quot;
	return GetComApp(&amp;wd, force, &quot;Word.Application&quot;, &quot;Word&quot;)
}
GetPoint(Force:=0) {
	static pp := &quot;&quot;
	return GetComApp(&amp;pp, force, &quot;PowerPoint.Application&quot;, &quot;PowerPoint&quot;, &quot;PP_&quot;)
}
GetExcel(Force:=0) {
	static xl := &quot;&quot;
	return GetComApp(&amp;xl, force, &quot;Excel.Application&quot;, &quot;Excel&quot;, &quot;XL_&quot;)
}
GetAcad(Force:=0) {
	static acad := &quot;&quot;
	return GetComApp(&amp;acad, force, &quot;AutoCAD.Application&quot;, &quot;Автокад&quot;, &quot;acad_&quot;)
}</pre>
  <p id="9eh7">Как их использовать? Например, в Word:</p>
  <pre id="MdXF" data-lang="clojure">GetWord().PrintPreview := true ; Открыть предварительный просмотр в word</pre>
  <p id="WtuY">или так:</p>
  <pre id="Pw1j" data-lang="clojure">wd := GetWord()
wd.Dialogs(88).Show() ; Открыть диалоговое окно «Печать»</pre>
  <p id="S5i1">или в экселе:</p>
  <pre id="HyTQ" data-lang="clojure">xl := GetExcel()
xl.Activeworkbook.Close(false) ; Закрыть книгу без сохранения</pre>
  <p id="rnmw"></p>
  <p id="oAgo">А вот так можно освободить все переменные, хранящие ссылки на объекты приложений:</p>
  <pre id="obCO" data-lang="clojure">	FreeOleServers(*) {
		GetExcel(-1)
		GetWord(-1)
		GetAcad(-1)
		GetPoint(-1)
		Tooltip &quot;Ссылки на эксель, ворд, поинт, очищены.&quot;
		SetTimer(()=&gt;Tooltip(), 3000)
	}</pre>
  <p id="WXlk"></p>
  <tt-tags id="KGfV">
    <tt-tag name="autohotkey">#autohotkey</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ttach/access-new-sql-query</guid><link>https://teletype.in/@ttach/access-new-sql-query?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach</link><comments>https://teletype.in/@ttach/access-new-sql-query?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach#comments</comments><dc:creator>ttach</dc:creator><title>Как создать SQL-запрос в Access</title><pubDate>Sat, 11 Feb 2023 19:35:43 GMT</pubDate><category>Autohotkey</category><tt:hashtag>autohotkey</tt:hashtag><tt:hashtag>access</tt:hashtag><description><![CDATA[<img src="https://img2.teletype.in/files/11/26/11260faa-4e43-43bd-bc8b-8b06da492d5d.png"></img>🌰 Создаём новый запрос сразу в режиме SQL с помощью скрипта на AHK]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="aquW"><a href="/@ttach/in_nuce">🌰</a> Создаём новый запрос сразу в режиме SQL с помощью скрипта на AHK</p>
  </section>
  <figure id="JL9F" class="m_original">
    <img src="https://img2.teletype.in/files/11/26/11260faa-4e43-43bd-bc8b-8b06da492d5d.png" width="253" />
  </figure>
  <p id="BJgG">Если Вы решили создать новый запрос в Access, то нажимаете «Создание», «Конструктор запросов», Закрываете окошко с выбором таблиц, и только потом кнопку «SQL». Как можно ускорить этот процесс, чтобы сразу перейти к вводу SQL-кода? Нам поможет следующий скрипт на AutoHotKey, основанный на <a href="https://stackoverflow.com/a/53178315" target="_blank">макросе</a> со StackOverflow:</p>
  <pre id="oOhV" data-lang="clojure">#Requires AutoHotkey v2+
#HotIf WinActive(&quot;ahk_class OMain&quot;) ; Когда активно окно Access
^sc31:: AccessNewQuery() ; Новый SQL-запрос по ctrl+N	

AccessNewQuery(*) {
    try {
        app := ComObjActive(&quot;Access.Application&quot;) ; берём access...
    } catch {
        Tooltip(&#x27;AccessNewQuery FAIL: ComObjActive(&quot;Access.Application&quot;)&#x27;)
        SetTimer(()=&gt;Tooltip(), 1000)
        Return
    }
    ; Убедимся в том, что база открыта:
    try {
        db := app.CurrentDb
        if (db = &quot;&quot;)
            return
    } catch {
        return
    }
    ; Найдём незанятое имя для запроса:
    qName := &quot;&quot;
    Loop 250 {
        if !QueryExists(&quot;NewQuery&quot; . A_Index) {
            qName := &quot;NewQuery&quot; . A_Index
            Break
        }
    }
    if !qName
        return
    ; Нашли незанятое имя, создаём новый запрос:
    qdf := db.CreateQueryDef(qName)
    qdf.SQL := &quot;SELECT Date() AS Today;&quot;
    qdf.Close()
    app.DoCmd.OpenQuery(qName, 1) ;1=acViewDesign
    app.DoCmd.RunCommand(184) ;184=acCmdSQLView
    ;app.DoCmd.RunCommand 337 ;337=acCmdDelete ; очистка текста запроса
    ; всё!
    QueryExists(nm) { ; существует ли запрос с таким названием в базе db?
        for qd in db.QueryDefs {
            if qd.Name = nm
                return true
        }
        return false
    }  
}
</pre>
  <hr />
  <p id="6448"><a href="https://teletype.in/@ttach/ahk_scancodes" target="_blank">Сканкод sc31</a> соответствует клавише N и теперь при нажатии на Ctrl+N будет открываться редактор запросов с текстом  <code>SELECT Date() AS Today</code>.<br />Разумеется, горячую клавишу можно <a href="https://www.autohotkey.com/docs/v2/Hotkeys.htm" target="_blank">задать</a> любую другую.</p>
  <h2 id="6FB3"></h2>
  <tt-tags id="37YE">
    <tt-tag name="autohotkey">#autohotkey</tt-tag>
    <tt-tag name="access">#access</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ttach/vba-surrogate-pairs</guid><link>https://teletype.in/@ttach/vba-surrogate-pairs?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach</link><comments>https://teletype.in/@ttach/vba-surrogate-pairs?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach#comments</comments><dc:creator>ttach</dc:creator><title>Эмодзи на VBA</title><pubDate>Fri, 18 Feb 2022 20:03:07 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/2c/a9/2ca9aba1-4f5f-4c0a-a0a2-eecabf59abcb.png"></media:content><category>VBA</category><tt:hashtag>vba</tt:hashtag><description><![CDATA[<img src="https://img3.teletype.in/files/e2/d4/e2d4f8e6-1ce1-46ce-81ef-ad855acc9f6d.png"></img>🌰 Используем суррогатные пары для отображения символов с кодами &gt; 65535 🐱]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="oUog"><a href="https://teletype.in/@ttach/in_nuce" target="_blank">🌰</a> Используем суррогатные пары для отображения символов с кодами &gt; 65535 🐱</p>
  </section>
  <p id="h9au">Функция <code>ChrW(код)</code> не работает для символов с кодом более 65535. Как же отобразить в документе, например,  символ 🐱 с кодом 0x1F431 (128049)?</p>
  <p id="cerR">Такие символы мы можем закодировать двумя кодовыми единицами. Пара таких кодов называется <a href="https://habr.com/ru/post/485148/#5" target="_blank">суррогатной парой</a> юникода.</p>
  <p id="Canl">Первая кодовая единица суррогатной пары всегда находится в диапазоне от 0xD800 до 0xDBFF и называется верхней частью пары.</p>
  <p id="LxZR">Вторая кодовая единица суррогатной пары всегда находится в диапазоне от 0xDC00 до 0xDFFF и называется нижней частью пары.</p>
  <p id="0Cq4">Обратите внимание, что суррогатная пара представляет только один символ.</p>
  <p id="lont">Для вычисления этих кодов используются <a href="https://mathiasbynens.be/notes/javascript-encoding#surrogate-pairs" target="_blank">следующие формулы</a> (в excel vba):</p>
  <pre id="dOVV" data-lang="visual-basic">Type SurrogatePair
    lo As Long
    hi As Long
End Type</pre>
  <pre id="eeuw" data-lang="visual-basic">Function Code2pair(codepoint As Long) As SurrogatePair
&#x27; Расчёт суррогатной пары UTF-16
    Dim sp As SurrogatePair
    sp.hi = WorksheetFunction.Floor((codepoint - &amp;H10000) / &amp;H400, 1) + &amp;HD800
    sp.lo = (codepoint - &amp;H10000) Mod &amp;H400 + &amp;HDC00
    Code2pair = sp
End Function</pre>
  <p id="i938">Теперь можно написать функцию, которая выведет нужный символ по его коду с помощью суррогатной пары:</p>
  <pre id="zyjN" data-lang="visual-basic">Function Rune(codepoint As Long) As String
&#x27; Вывод символа с указанным кодом
    Dim sp As SurrogatePair
    sp = Code2pair(codepoint)
    Rune = ChrW(sp.hi) &amp; ChrW(sp.lo)
End Function</pre>
  <p id="42K3">Установим нужный шрифт и размер, после чего потренируемся на кошках:</p>
  <figure id="jGwe" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/e2/d4/e2d4f8e6-1ce1-46ce-81ef-ad855acc9f6d.png" width="354" />
    <figcaption>Процедура вставки символа с кодом 0x1f431 и результат её работы</figcaption>
  </figure>
  <p id="me2X">Помните, что сложные эмодзи могут состоять из нескольких подряд идущих символов юникода, но не все системы могут правильно это отобразить.</p>
  <tt-tags id="6RLV">
    <tt-tag name="vba">#vba</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ttach/totalcmd-iso</guid><link>https://teletype.in/@ttach/totalcmd-iso?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach</link><comments>https://teletype.in/@ttach/totalcmd-iso?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach#comments</comments><dc:creator>ttach</dc:creator><title>Как создать образ диска iso в один клик</title><pubDate>Thu, 16 Dec 2021 15:34:59 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/8d/50/8d50b52f-0542-4112-901b-e5a7c61210d8.png"></media:content><category>Советы</category><tt:hashtag>totalcmd</tt:hashtag><tt:hashtag>cmd</tt:hashtag><description><![CDATA[<img src="https://img1.teletype.in/files/03/45/03452a98-296d-4654-aa65-949e8a1809bb.png"></img>🌰 Интегрируем cdimage.exe в Total Commander]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="5iId"><a href="/@ttach/in_nuce">🌰</a> Интегрируем cdimage.exe в Total Commander</p>
  </section>
  <p id="Zvwv">Обычно для создания файлов iso используется программа для записи дисков, например Nero, Alcohol или <a href="https://ru.wikipedia.org/wiki/Small_CD-Writer" target="_blank">Small CD Writer</a>, но у пользователей Total Commander есть интересная альтернатива.</p>
  <p id="NfGh">Суть в следующем. Открываем в Total Commander папку, содержимое которой предстоит поместить в образ iso. На другой панели открываем папку, куда следует положить готовый iso-файл. <strong>Стоя в исходной папке</strong>, нажимаем кнопку на панели, после чего в папке-получателе появляется iso-файл. Имя файла и метка будет назначена автоматически.</p>
  <p id="rzl6">Вот как это выглядит на скриншотах:</p>
  <figure id="yAqM" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/03/45/03452a98-296d-4654-aa65-949e8a1809bb.png" width="1085" />
    <figcaption>Слева открыта папка, которую следует упаковать в файл ISO, а справа — папка-получатель. Запускаем программу...</figcaption>
  </figure>
  <figure id="y9vn" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/4d/d1/4dd18337-a780-4b63-86e7-87c72e62c812.png" width="995" />
    <figcaption>Идёт создание файла ISO</figcaption>
  </figure>
  <figure id="7Wgr" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/b4/37/b4373936-ce39-4f89-980b-1af7f84114cb.png" width="1085" />
    <figcaption>Файл ISO появился в целевой папке</figcaption>
  </figure>
  <p id="nzJA">Теперь разберёмся, как это сделать.</p>
  <p id="wOC7">Возьмите программу <a href="http://www.oszone.net/2759" target="_blank">CDIMAGE</a> и положите её, например, в папку <code>\totalcmd\Plugins\Util\CDIMAGE\</code>. Здесь написано, что это утилита для внутреннего использования в Microsoft и создана она в 2000 году, поэтому... всё на свой страх и риск. Впрочем, формат файла iso не поменялся с того времени :)</p>
  <figure id="J7ak" class="m_column">
    <img src="https://img4.teletype.in/files/b5/5d/b55db6f3-c7b5-4035-9785-8598244a5944.png" width="995" />
    <figcaption>Запуск программы без параметров выводит информацию и помощь по использованию</figcaption>
  </figure>
  <p id="l5dH">Рядом положите файл TotalCdImage.cmd следующего содержания:</p>
  <pre id="cGRu">@rem Сделаем метку из 32 символов исходного пути
set label=%~nx1
set label=%label:~0,32%
@rem @echo %~n1%~x1
&quot;%~dp0CDIMAGE.EXE&quot; -l&quot;%label%&quot; -c -h -u2 -m &quot;%~1&quot; &quot;%~2%~nx1.iso&quot;||pause</pre>
  <p id="plan">↑ его надо будет сохранить в кодировке 866.</p>
  <p id="ODun">Теперь скопируйте код ниже </p>
  <pre id="qsQ5">TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Plugins\Util\CDIMAGE\TotalCdImage.cmd
&quot;%P.&quot; &quot;%T&quot;
C:\Windows\System32\imageres.dll,56
Создать UDF-образ из открытой папки
%COMMANDER_PATH%\Plugins\Util\CDIMAGE\
0
-1
</pre>
  <p id="Af3T">...и вставьте его на панель Total Commander с помощью правого клика:</p>
  <figure id="bKUT" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/7c/dc/7cdc5df8-f95a-409c-b02e-177d13c01980.png" width="492" />
    <figcaption>Кнопки на панели Total Commander можно копировать и вставлять</figcaption>
  </figure>
  <p id="nNul">На панели появится кнопка, выполняющая описанную функцию. Название и иконку можно выбрать по вкусу. Не забывайте, что активной панелью должна быть та, в которой открыта упаковываемая папка.</p>
  <h2 id="I75B">Для пользователей Small CD-Writer</h2>
  <p id="I4Zh">Можно интегрировать Small CD-Writer в тотал коммандер, чтобы отправлять выделенные файлы и папки в проект Small CD-Writer. Для этого вставьте на панель инструментов такую кнопку:</p>
  <pre id="F5Lw">TOTALCMD#BAR#DATA
&quot;c:\Program Files (x86)\Small CD-Writer 1.4\SCDWriter.exe&quot;
%P%S
c:\Program Files (x86)\Small CD-Writer 1.4\SCDWriter.exe
Добавить в проект SCDWriter
c:\Program Files (x86)\Small CD-Writer 1.4\
1
-1
</pre>
  <p id="xr9O">Путь к программе следует заменить на актуальный.</p>
  <figure id="afYk" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/8f/1a/8f1a7a86-10f4-45f9-9375-84f3fde241fe.png" width="792" />
    <figcaption>Добавление выделенных файлов и папок в проект SCDW</figcaption>
  </figure>
  <p id="yG5s">Можно добавить несколько файлов, каждый раз нажимая на полученную кнопку после выделения файлов.</p>
  <p id="FiwQ">Когда нужные файлы набраны, можно записать их на диск или сохранить в файл iso из программы Small CD-Writer.</p>
  <tt-tags id="0GYG">
    <tt-tag name="totalcmd">#totalcmd</tt-tag>
    <tt-tag name="cmd">#cmd</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ttach/zip-as-folder</guid><link>https://teletype.in/@ttach/zip-as-folder?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach</link><comments>https://teletype.in/@ttach/zip-as-folder?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ttach#comments</comments><dc:creator>ttach</dc:creator><title>Открытие zip-архивов как папок</title><pubDate>Sun, 12 Dec 2021 16:26:19 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/5b/55/5b554aa4-8acc-4f4b-92b2-b96d81ee0e9b.png"></media:content><category>Советы</category><tt:hashtag>совет</tt:hashtag><tt:hashtag>cmd</tt:hashtag><description><![CDATA[<img src="https://img2.teletype.in/files/15/62/1562aa40-22c0-48c8-b58c-6a14f573fa14.png"></img>ZIP-архивы превращаются в папки «на лету», без промежуточной распаковки во временную папку]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="ddA7"><a href="/@ttach/in_nuce">🌰 </a>ZIP-архивы превращаются в папки «на лету», без промежуточной распаковки во временную папку</p>
  </section>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="UVvc">Внимание! Описываемая программа несовместима с антивирусом Касперского. Компьютер «зависает» наглухо.</p>
  </section>
  <ol id="pjBm">
    <li id="GXAf">Устанавливаем Pismo File Mount Audit Package build 171</li>
    <li id="ULnM">Кладём в папку Windows (ну или в другое место) файл <code>pfmmount.cmd</code> следующего содержания:<br /><code>pfm mount %1 &amp;&amp; explorer %1</code></li>
    <li id="b9Ev">Теперь назначим zip-архивам ассоциацию с этим файлом, например, путём запуска reg-файла следующего содержания:</li>
  </ol>
  <pre id="kdyL">Windows Registry Editor Version 5.00</pre>
  <pre id="5pR2">[HKEY_CLASSES_ROOT\.zip]
@=&quot;Applications\\pfmmount.cmd&quot;</pre>
  <pre id="niU0">[HKEY_CLASSES_ROOT\Applications\pfmmount.cmd]</pre>
  <pre id="buT4">[HKEY_CLASSES_ROOT\Applications\pfmmount.cmd\DefaultIcon]
@=&quot;explorer.exe&quot;</pre>
  <pre id="VNwq">[HKEY_CLASSES_ROOT\Applications\pfmmount.cmd\shell]</pre>
  <pre id="wMEm">[HKEY_CLASSES_ROOT\Applications\pfmmount.cmd\shell\open]</pre>
  <pre id="zB9k">[HKEY_CLASSES_ROOT\Applications\pfmmount.cmd\shell\open\command]
@=&quot;\&quot;C:\\Windows\\pfmmount.cmd\&quot; \&quot;%1\&quot;&quot;</pre>
  <hr />
  <p id="tfe9">Готово. Попробуем запустить какой-нибудь архив:</p>
  <figure id="nvnE" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/15/62/1562aa40-22c0-48c8-b58c-6a14f573fa14.png" width="1006" />
    <figcaption>Архив становится папкой при запуске</figcaption>
  </figure>
  <p id="Tx9f">Значок поменял свой тип: был «Файл &quot;ZIP&quot;», стал «Папка с файлами». При этом содержимое папки сразу открылось в новом окне:</p>
  <figure id="dufj" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/0a/10/0a103e6b-c98f-49cb-ae97-394ee3662bcb.png" width="560" />
    <figcaption>Содержимое архива</figcaption>
  </figure>
  <p id="mzsJ">Вы не сможете удалить или изменить файлы в этой «папке», а также добавить туда ещё файлы и папки, однако такая папка будет напрямую доступна для всех программ.</p>
  <p id="BBci">Ещё один «баг»: папка не удаляется :)<br />Чтобы удалить такую папку, сначала надо выбрать пункт «Unmount» в контекстном меню этой папки, либо в окошке программы Pismo File Mount Audit Package, ищите её значок в трее.</p>
  <figure id="fjnH" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/eb/2f/eb2fa13e-25f7-4b47-b9be-3ae2a216f308.png" width="415" />
    <figcaption>Окно программы показывает все примонтированные архивы</figcaption>
  </figure>
  <p id="5ZpG">Программа PFM поддерживает только файлы ZIP и ISO.</p>
  <tt-tags id="Ofdc">
    <tt-tag name="совет">#совет</tt-tag>
    <tt-tag name="cmd">#cmd</tt-tag>
  </tt-tags>

]]></content:encoded></item></channel></rss>