понедельник, 3 января 2022 г.

FAQ Narrator in WPF

The built-in Narrator in Windows 10 and Windows 11 is launched by the "LeftCtrl + Win + Enter" shortcut.


Complete guide to Narrator

Accessibility best practices

In the app window, the control that is in focus is voiced. Also, the Windows narrator voices every key pressed.

In Windows 7, only the specified control name is pronounced. 

Narrator is missing out of the box in Windows 7 SP1 without updates and the very first versions of Windows 10.

1. Narrator announces the type of the selected control, followed by it's name. 

The voiced name is set using the AutomationProperties.Name property. 

For example:

    AutomationProperties.Name = "Login"

For custom controls, you need to write the type yourself. Otherwise, "Custom" will be pronounced.


Create a class

    public class ToggleSwitchControlAutomationPeer : UserControlAutomationPeer {

        public ToggleSwitchControlAutomationPeer(ToggleButton owner) :

            base(owner) { }

        protected override string GetLocalizedControlTypeCore() {

            return "Toggle switch";



And in control itself

    protected override AutomationPeer OnCreateAutomationPeer() {

        return new ToggleSwitchControlAutomationPeer(this);


2. Recommendation:

Add the app name to the main window and, if possible, to all windows of the application. 

Otherwise, there will be a faceless "MainWindow" or "Login Window".

For example:

"YourApplication MainWindow" or "BestApp Login Window"


By default, the Windows narrator repeats the name of the control, so you don't need to add it to the designation.


With the PasswordBox control (and some more) in the .Net Framework up to 4.7.1 trouble. There are actually three outputs:

a) Updating .Net Framework.

b) Add our own control in which we use the textbox.

c) We use a textbox with a special font (for a password, but potentially unsafe).


In .NET Framework 4.7 and earlier versions, xref:System.Windows.Controls.PasswordBox controls were announced as "no item in view" or had otherwise incorrect behavior


Try to use short, clear phrases. No abbreviations, acronyms, compound words.

среда, 25 августа 2021 г.

Figma to WPF XAML

 0. Go to figma

1. Press to the need element

2. (If the element consists of several, then select the group

3. Press Export

4. Select SVG

5. Press Export

6. Open Inkscape

7. Select all elements - Resize page to selection

8. Select all elements - Group

9. File - Save As - Save as type - Microsoft XAML

10. Paste file to Visual Studio

среда, 26 августа 2020 г.

Some tips for settings your keyboard Lenovo ThinkPad 8845CR UltraNav

 Some tips for settings your keyboard Lenovo ThinkPad 8845CR UltraNav

Tip Zero! NumLock is disabled with SHIFT! Shift + ScrLk (NumLock)

1. If your system has NumLock enabled at system boot, disable:

Windows Registry Editor Version 5.00

[HKEY_USERS\.DEFAULT\Control Panel\Keyboard]


(do not forget to disable it in BIOS too)

2. Since there is no Win key on the keyboard, and I actively use it, I assigned CapsLock key to WinKey

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]

"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,5c,e0,3a,00,00,00,00,00

3. To use the middle button as a wheel, I used a third party software - https://github.com/ykon/w10wheel.net

4. Adding an "acceleration" for the trackpoint https://forum.thinkpads.com/viewtopic.php?t=120571

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Control Panel\Mouse]













среда, 8 июля 2020 г.

Build OpenVPN with XOR-patch (Scramble)

Task: It is necessary to compile the current version of OpenVPN for 32 bits with the XOR patch.

1. Download and install cygwin https://cygwin.com/install.html
During installation, you need to install the following packages -
autoconf, automake, diffutils, git, libtool, m4, make, mingw64-i686-binutils, mingw64-i686-gcc-core, mingw64-i686-headers, mingw64-i686-pthreads, mingw64-i686-runtime, mingw64-x86_64-binutils, mingw64-x86_64-gcc-core, mingw64-x86_64-headers, mingw64-x86_64-pthreads, mingw64-x86_64-runtime, patch, patchutils, perl, unzip, wget

2. After run cygwin -
cp `which true` /usr/bin/man2html                                           

3. Download OpenVPN Builds https://github.com/OpenVPN/openvpn-build
wget https://github.com/OpenVPN/openvpn-build/archive/master.zip
unzip master.zip
Go to the directory
cd openvpn-build-master/generic

4. Build (for the first time will get WITHOUT a patch)
IMAGEROOT=`pwd`/image-win32 CHOST=i686-w64-mingw32 CBUILD=i686-pc-cygwin ./build

5. After the build of the version is completed, without a patch, we go to the source directory - there will be downloaded archives with the OpenVPN source codes and the necessary libraries.

6. We need to unpack the source OpenVPN
tar xvfz openvpn-2.4.9.tar.gz
rm openvpn-2.4.9.tar.gz
cd openvpn-2.4.9

7. Download and apply xor patch - https://github.com/clayface/openvpn_xorpatch
wget https://raw.githubusercontent.com/clayface/openvpn_xorpatch/master/openvpn_xor.patch
git apply openvpn_xor.patch
tar -czvf openvpn-2.4.9.tar.gz openvpn-2.4.9

And go back to the generic folder
cd ..

8. Starting the project build again -
IMAGEROOT=`pwd`/image-win32 CHOST=i686-w64-mingw32 CBUILD=i686-pc-cygwin ./build

9. After finishing, you can goto the path  C:\cygwin\home\%YOURUSERNAME%\openvpn-build-master\generic\image-win32\openvpn\bin and test your own OpenVPN build

вторник, 5 мая 2020 г.

ToolTip для отключенного ComboBox

Вводная: Необходимо показывать ToolTip только при отключенном ComboBox.

1. В свойства ComboBox необходимо добавить

2. Самой подсказке надо добавить привязку к какому-нибудь свойству (в нашем примере IsFlag) и  воспользоваться встроенным конвертором BooleanToVisibilityConverter
<ToolTip Visibility="{Binding IsFlag, Converter={StaticResource BooleanToVisibilityConverter }}" Content="Tooltip for test"/>

<ComboBox ToolTipService.ShowOnDisabled="True" 
          IsEnabled="{Binding IsFlag,  Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,
                      Converter={StaticResource InverseBooleanConverter}}"
          Margin="25"  >
                <ToolTip Visibility="{Binding IsFlag, Converter={StaticResource BooleanToVisibilityConverter }}"
                         Content="Tooltip for test"/>
          <ComboBoxItem Content="Item1" IsSelected="True" />
          <ComboBoxItem Content="Item2" />
          <ComboBoxItem Content="Item3" />

вторник, 16 апреля 2019 г.

Доступ к IP KVM Avocent DSR 1021

Вводная: Имеется IP KVM Avocent DSR 1021. С настроенным IP-адресом и модулями. Необходимо зайти на него со свежо установленной Windows 10

1. Скачиваем последнюю версию JRE https://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html и устанавливаем 

2. В браузере прописываем, что открывать в режиме совместимости. 

3. Редактируем файл java.security по адресу C:\Program Files\Java\jre1.8.****\lib\security\ 

4. Убираем MD5 в строке 
jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024 

5. Убираем DH keySize < 768 
jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 768 

6. Открываем "Панель управления"-"Программы"-"Java" 
Security tab -> Edit Site List -> Добавляем IP адрес KVM "http://X.X.X.X" (+https)

7. Пробуем подключиться

вторник, 5 марта 2019 г.

Про перевод имен переменных

Вот есть разное программирование. И везде надо переменные называть. И правилом хорошего тона называть их на английском (нуу за несколькими исключениями, к примеру в виде 1С).

И вот тут можно использовать небольшой финт ушами.

Для примера возьмём слово "склад" и предположим, что мы не знаем как его нам забить. Казалось бы не проблема - идём в Google.Translate и переводим

И тут нас поджидает засада - ни одно из предложенных нам гуглом слов не будет верным. А вот для того, чтобы узнать верное слово, мы ищем наш "Склад" на википедии. После чего переключаемся на английскую страницу кнопкой English. И узнаём, что правильно наш склад называть Warehouse

понедельник, 4 марта 2019 г.

Перехват пароля к FTP серверу с помощью роутера Mikrotik

Вводная: Есть программа с "захардкорженным" в коде паролем с доступом к FTP. Необходимо узнать пароль.

Решение: Так как в качестве роутера у нас Mikrotik RB951Ui-2HnD, то будем использовать его. Заходим в winbox. В меню выбираем Tools - Packet Sniffer. Если стоит галочка "Only Headers" снимаем её.

На вкладке Filter выставляем Port - 21.

Далее нажимаем "Start". Пробуем получить обновления через программу. Если пакеты пошли хорошо, есть нет, то вариант чуть сложнее - убираем порт и смотрим все пакеты от данного компьютера - вероятно (если мы уверены, что используется FTP) используется не стандартный порт.
Узнать порт также можно простым запросом у техподдержки вашей программы - объяснив, что "системный администратор не открывает доступ по всем портам, а только по списку".
Далее нажимаем "Packets" и смотрим все пакеты подряд (Нас интересует вкладка "Packet") - в каком-нибудь из них, будет строка "PASS" и далее пароль который нам нужен.

Как вариант можем сделать сохранение в файл - на вкладке General. И сделать поиск по подстроке "PASS"

среда, 27 февраля 2019 г.

Строки в компоненте DataGrid разного размера (Compact Framework)

Вводная: Есть проект для ТСД Windows Mobile 6.5 на .Net Compact Framework 3. И в нём есть DataGrid с некоторыми данным. Но проблема в том, что в данной версии фреймворка нельзя задать высоту для конкретной строки или авторасширение по контенту.

Но у нас некоторые строки требуют одной строки для отображения, некоторые две - а делать все двухстрочными это достаточно накладно по использованию экрана.

Решение: Напрямую мы не можем обращаться к высоте каждой строки. Но такой параметр ЕСТЬ, правда он с приватным модификатором доступа, поэтому придётся немного схитрить

Добавим после заполнения данными (dataGrid1.DataSource = dataTable;) 
такой код
//Здесь получаем все строки 
var allRows = (ArrayList)dataGrid1
                        .GetField("m_rlrow", BindingFlags.NonPublic
                                           | BindingFlags.Static
                                           | BindingFlags.Instance)
//Здесь формируем массив строк для обработки с их индексами
foreach (var pair in dataTable.Rows.Cast<DataRow>()
                                   .Select((r, i) => new {Row = r, Index = i})
                                   //Указываем параметр по которому увеличиваем размер строки
                                   .Where(x => x.Row["Type"].ToString().Contains("\n")))
 int index = pair.Index;
        //Эдесь мы можем получить доступ к строке если надо
        //DataRow row = pair.Row;
        SetGridRowHeight(allRows[index], 60);

Далее сама функция изменения размера
public static void SetGridRowHeight(object row, int height)
    row.GetType().GetField("m_cy", BindingFlags.NonPublic
                                 | BindingFlags.Static
                                 | BindingFlags.Instance)
                 .SetValue(row, height);

И результат:

вторник, 19 февраля 2019 г.

Сброс настроек и пароля в IP камере Dahua 1220SP

Вводная: Дана камера Dahua IPC-HFW1220SP. В веб-интерфейс не входит, telnet-ssh не доступны. IP по DHCP не получает (порт при этом поднимается, линк загорается). ИК-подсветка реагирует на смену света.

Решение: Решили для начала сбросить настройки, но вот тут то и ждала засада - официальная документация https://dahuawiki.com/images/1/1e/ResetIPCamera.pdf про эту модель молчит. Продавец говорит - отправляйте нам на замену. Но это долго.

Начали смотреть, в отличии от младшей модели 1020SP, на этой нет кнопки Reset (да, на младшей всё просто - нажали на кнопочку при включении - выждали 10 секунд и сбросилось).

Не буду вас утомлять - для сброса данной карты нужно снять крышку, снять ИК подсветку (но не отключать провод! Это важно). И замкнуть чем-нибудь тонким две площадки указанные на фото, на выключенной камере - затем подать питание, выждать 15 секунд и убрать замыкание. По сути это кнопка сброса, но не распаянная.

После сброса всё заработало штатно.

Ключевые слова:  Dahua, HFW1220SP, factory settings, reset, default 

PS: Эксперимент делался на свой страх и риск - было бы очень весело если бы это было питание для чего-либо :) И замкнули + и -. Так что будьте осторожнее делая это на других ревизиях или моделях - проверьте вначале мультиметром, что там не будет ничего.