Вы должны войти, чтобы создавать сообщения и темы.

Вопрос про отладку в студии и про трансформацию изображения

Здравствуйте товарищи. 🙋‍♂️

Вопрос 1.
У меня в студии, при включении отладки, на точке останова, курсор сильно подвисает. Предположительно из-за глобального хука мыши или клавиатуры,  которые используют WinApi.

Вопрос. Как пользоваться отладкой в таком случаи. Может можно как то не отслеживать их в отладке или что то подобное? Ну, если в них конечно проблема.

Вопрос 2.

Касательно трансформации изображения в WPF.
Идея сделать кнопку с выбором изображения (прозрачного).  Логика примерно такая. Хочу получить обводку, как у Border примерно.  Border обводит только вектора.
Что если взять и увеличить исходное изображение и сделать из него <Button.OpacityMask/> . Но где-то на этапе преобразования возникает проблема. Заливает полностью фон кнопки, при изменённом изображении. Пытаюсь трансформировать примерно так.

Код С#

internal static BitmapImage? ImageScale(BitmapImage ImageToScale)
{

    try
    {

        TransformedBitmap? transform = new TransformedBitmap(ImageToScale, new ScaleTransform(0.13, 0.13));  // какое-то любое значени Scale 

        using MemoryStream outStream = new MemoryStream();
        BitmapEncoder enc = new BmpBitmapEncoder();
       
        enc.Frames.Add(BitmapFrame.Create(transform));
        enc.Save(outStream);
        Bitmap bitmap = new Bitmap(outStream);

        BitmapImage image = BitmapToBitmapImage(bitmap);

        return image;


    }
    catch (Exception)
    {
        BitmapImage? imageNull = null;

        return  imageNull;
    }
}

Соответственно из-за первой проблемы не получается уделить достаточно времени на отладку второй, так как кратность времени увеличивается в разы. 😐

Добрый день. Ответ на 1 вопрос:

#if !DEBUG
        // Ваш WinAPI
#endif

 

Вроде эта директива препроцессора просто отключает часть кода полностью. Что ломает логику программы.

Так первый вопрос похоже решен. Если кратко то нужно использовать "Raw Input".
Низкоуровневый хук мыши и отладка не дружат. Это вроде не лечатся. Убрал у себя хук, и подыскал ему замену. Выбрал пакет NUGET "RawInput.Sharp" для тех же нужд.

Google перевод из MSDN

Непонятно, что именно делает здесь ваше приложение, но я подозреваю, что оно вызывает диалоговое окно в ответ на срабатывание хука. Это предотвратит возврат хука, и ввод будет заблокирован до тех пор, пока это не произойдет (или пока время ожидания хука не истечет, и Windows не удалит ваше приложение из цепочки хуков).

Я бы порекомендовал заменить крючок мыши на Raw Input API. Низкоуровневые обработчики мыши вызываются синхронно с входными данными, а это означает, что медленный код приложения может и будет вызывать зависание других приложений. Это похоже на то, что здесь происходит. Windows в конечном итоге обнаружит это и молча удалит ваш хук, чтобы предотвратить дальнейшее повреждение системы приложением.

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

Если вместо этого вы используете Raw Input API, ваше приложение будет получать уведомления о вводе асинхронно из потока ввода. Вашему приложению нужно будет заботиться только о том, чтобы оставаться отзывчивым. Ему не нужно беспокоиться о зависании ввода в других процессах и отключении.

Оригинальный источник MSDN

Так же в статье на Habre про Raw Input  написано " Ограничения тоже есть — если ввод осуществляется в админский процесс, а наш процесс не является админским, то события ввода не придут." Пока не понятно важно это или нет.