Вопрос про отладку в студии и про трансформацию изображения
Цитата: Viсtor от 09.02.2022, 17:46Здравствуйте товарищи. 🙋♂️
Вопрос 1.
У меня в студии, при включении отладки, на точке останова, курсор сильно подвисает. Предположительно из-за глобального хука мыши или клавиатуры, которые используют WinApi.Вопрос. Как пользоваться отладкой в таком случаи. Может можно как то не отслеживать их в отладке или что то подобное? Ну, если в них конечно проблема.
Вопрос 2.
Касательно трансформации изображения в WPF.
Идея сделать кнопку с выбором изображения (прозрачного). Логика примерно такая. Хочу получить обводку, как у Border примерно. Border обводит только вектора.
Что если взять и увеличить исходное изображение и сделать из него <Button.OpacityMask/> . Но где-то на этапе преобразования возникает проблема. Заливает полностью фон кнопки, при изменённом изображении. Пытаюсь трансформировать примерно так.[spoiler title="Код С#"]
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; } }[/spoiler]
Соответственно из-за первой проблемы не получается уделить достаточно времени на отладку второй, так как кратность времени увеличивается в разы. 😐
Здравствуйте товарищи. 🙋♂️
Вопрос 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;
}
}
Соответственно из-за первой проблемы не получается уделить достаточно времени на отладку второй, так как кратность времени увеличивается в разы. 😐
Цитата: yuri от 09.02.2022, 18:13Добрый день. Ответ на 1 вопрос:
#if !DEBUG // Ваш WinAPI #endif
Добрый день. Ответ на 1 вопрос:
#if !DEBUG
// Ваш WinAPI
#endif
Цитата: Viсtor от 09.02.2022, 19:44Вроде эта директива препроцессора просто отключает часть кода полностью. Что ломает логику программы.
Вроде эта директива препроцессора просто отключает часть кода полностью. Что ломает логику программы.
Цитата: Viсtor от 10.02.2022, 17:20Так первый вопрос похоже решен. Если кратко то нужно использовать "Raw Input".
Низкоуровневый хук мыши и отладка не дружат. Это вроде не лечатся. Убрал у себя хук, и подыскал ему замену. Выбрал пакет NUGET "RawInput.Sharp" для тех же нужд.
[spoiler title="Google перевод из MSDN"]
Непонятно, что именно делает здесь ваше приложение, но я подозреваю, что оно вызывает диалоговое окно в ответ на срабатывание хука. Это предотвратит возврат хука, и ввод будет заблокирован до тех пор, пока это не произойдет (или пока время ожидания хука не истечет, и Windows не удалит ваше приложение из цепочки хуков).Я бы порекомендовал заменить крючок мыши на Raw Input API. Низкоуровневые обработчики мыши вызываются синхронно с входными данными, а это означает, что медленный код приложения может и будет вызывать зависание других приложений. Это похоже на то, что здесь происходит. Windows в конечном итоге обнаружит это и молча удалит ваш хук, чтобы предотвратить дальнейшее повреждение системы приложением.
Чтобы безопасно использовать ловушки низкого уровня, ваше приложение должно запускать их в выделенном потоке, обрабатывать ловушку и немедленно возвращаться. Любая значительная обработка должна быть отложена до отдельного потока. Невозможно сделать это корректно в управляемом потоке, так как сборщик мусора может заморозить поток, что приведет к истечению времени ожидания хука и его удалению.
Если вместо этого вы используете Raw Input API, ваше приложение будет получать уведомления о вводе асинхронно из потока ввода. Вашему приложению нужно будет заботиться только о том, чтобы оставаться отзывчивым. Ему не нужно беспокоиться о зависании ввода в других процессах и отключении.
[/spoiler]Так же в статье на Habre про Raw Input написано " Ограничения тоже есть — если ввод осуществляется в админский процесс, а наш процесс не является админским, то события ввода не придут." Пока не понятно важно это или нет.
Так первый вопрос похоже решен. Если кратко то нужно использовать "Raw Input".
Низкоуровневый хук мыши и отладка не дружат. Это вроде не лечатся. Убрал у себя хук, и подыскал ему замену. Выбрал пакет NUGET "RawInput.Sharp" для тех же нужд.
Непонятно, что именно делает здесь ваше приложение, но я подозреваю, что оно вызывает диалоговое окно в ответ на срабатывание хука. Это предотвратит возврат хука, и ввод будет заблокирован до тех пор, пока это не произойдет (или пока время ожидания хука не истечет, и Windows не удалит ваше приложение из цепочки хуков).
Я бы порекомендовал заменить крючок мыши на Raw Input API. Низкоуровневые обработчики мыши вызываются синхронно с входными данными, а это означает, что медленный код приложения может и будет вызывать зависание других приложений. Это похоже на то, что здесь происходит. Windows в конечном итоге обнаружит это и молча удалит ваш хук, чтобы предотвратить дальнейшее повреждение системы приложением.
Чтобы безопасно использовать ловушки низкого уровня, ваше приложение должно запускать их в выделенном потоке, обрабатывать ловушку и немедленно возвращаться. Любая значительная обработка должна быть отложена до отдельного потока. Невозможно сделать это корректно в управляемом потоке, так как сборщик мусора может заморозить поток, что приведет к истечению времени ожидания хука и его удалению.
Если вместо этого вы используете Raw Input API, ваше приложение будет получать уведомления о вводе асинхронно из потока ввода. Вашему приложению нужно будет заботиться только о том, чтобы оставаться отзывчивым. Ему не нужно беспокоиться о зависании ввода в других процессах и отключении.
Так же в статье на Habre про Raw Input написано " Ограничения тоже есть — если ввод осуществляется в админский процесс, а наш процесс не является админским, то события ввода не придут." Пока не понятно важно это или нет.