Я попытался создать функцию снимка экрана, установить фон «Холст» в качестве изображения, нажать и поднять мышь, чтобы нарисовать прямоугольник, и захватить содержимое внутри прямоугольника, но мое событие «наведение мыши» всегда недействительно. Я искал всевозможную информацию и пробовал, все они кажутся недействительными.
public Bitmap GetScreenSnapshot()
{
try
{
System.Drawing.Rectangle rc = SystemInformation.VirtualScreen;
var bitmap = new Bitmap(rc.Width, rc.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
using (Graphics memoryGrahics = Graphics.FromImage(bitmap))
{
memoryGrahics.CopyFromScreen(rc.X, rc.Y, 0, 0, rc.Size, CopyPixelOperation.SourceCopy);
}
return bitmap;
}
catch (Exception)
{
}
return null;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
var screenSnapshot = GetScreenSnapshot();
var bmp = ImageProcessing.ToBitmapSource(screenSnapshot);
bmp.Freeze();
Clipper clipper = new Clipper();
clipper.bitmap = screenSnapshot;//将图片传过去
clipper.Background = new ImageBrush(bmp);
clipper.Show();
}
Здесь я использую кнопку, чтобы создать окно (Clipper) в главном окне и передать полученное изображение рабочего стола в Canvas.
<Window x:Class = "MyOCR_WPF.Clipper"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local = "clr-namespace:MyOCR_WPF"
mc:Ignorable = "d"
Title = "Clipper" Height = "450" Width = "800" WindowStyle = "None" WindowState = "Maximized" WindowStartupLocation = "CenterScreen">
<Canvas x:Name = "canvas" MouseMove = "canvas_MouseMove" MouseDown = "canvas_MouseDown" MouseUp = "canvas_MouseUp" Focusable = "True" Background = "Transparent">
</Canvas>
Its mouse up event is always invalid
попробуйте установить ширину и высоту холста на некоторое время и попробуйте установить фон на другой цвет, а затем на прозрачный только для теста
Вероятно, событие Mouse up настроено на какой-то элемент управления внутри холста, который зафиксировал событие мыши при нажатии мыши. Вы можете попробовать использовать обработчик с isHandled, установленным в true. Таким образом, холст получит событие, даже если оно помечено как обработанное каким-либо дочерним элементом управления.
@icode Только MouseUP недействителен
@puko Мне нужна картинка в качестве фона
@Dmitry Я плохо это знаю, мне нужно это изучить
я знаю ... но это просто проверить, имеет ли холст высоту и ширину ... вы видите холст, когда у него красный фон?
@puko да я видел
Что вы подразумеваете под недействительным? Он никогда не называется?
Событие @Dmitry Mouse Up не будет выполнено,
Это мой проект, вы можете узнать: github.com/Uranus-s/MyOCR_WPF
вид
<Grid>
<Canvas x:Name = "canvas" Focusable = "False" />
<Border MouseMove = "canvas_MouseMove" MouseDown = "canvas_MouseDown" MouseUp = "canvas_MouseUp" Background = "Transparent"/>
</Grid>
Я тестирую событие мыши на холсте - это нормальная работа. Фон холста установлен красным, посмотрите, находится ли окно сверху.