在WPF中显示BitmapSource不起作用

狮子座

下面的代码对屏幕的一部分进行快照(在鼠标坐标处),并将其显示在Image控件中。

public partial class MainWindow : Window
{
    Timer timer = new Timer(100);
    public MainWindow()
    {
        InitializeComponent();

        timer.Elapsed += Timer_Elapsed;
        timer.Start();
    }

    [System.Runtime.InteropServices.DllImport("gdi32.dll")]
    public static extern bool DeleteObject(IntPtr hObject);

    private void Timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        viewerImage.Source = GetSnapAtMouseCoords((int)((Grid)viewerImage.Parent).ActualWidth, (int)((Grid)viewerImage.Parent).ActualHeight, System.Windows.Forms.Cursor.Position);
    }

    private BitmapSource GetSnapAtMouseCoords(int width, int height, System.Drawing.Point mousePosition)
    {
        IntPtr handle = IntPtr.Zero;

        try
        {

            using (var screenBmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb))
            {
                using (var bmpGraphics = Graphics.FromImage(screenBmp))
                {
                    bmpGraphics.CopyFromScreen(mousePosition.X, mousePosition.Y, 0, 0, screenBmp.Size);

                    handle = screenBmp.GetHbitmap();

                    var bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                     handle,
                     IntPtr.Zero,
                     Int32Rect.Empty,
                     BitmapSizeOptions.FromEmptyOptions());

                    return bs;
                }
            }
        }

        finally
        {
            DeleteObject(handle);
        }
    }
}

一切正常,直到将图像源设置为BitmapSource为止。不幸的是,该图像从未在屏幕上呈现。

我认为这可能是因为我正在GUI线程上创建BitmapSource ...但是我不确定。

欢迎任何建议或想法。

曼弗雷德·拉德维默

实际上,这是因为您正在不同的线程上访问GUI。您可以像这样包装初始调用:

Dispatcher.BeginInvoke(new Action(() =>
{
    viewerImage.Source = GetSnapAtMouseCoords(
        (int)((Grid)viewerImage.Parent).ActualWidth, 
        (int)((Grid)viewerImage.Parent).ActualHeight, 
        System.Windows.Forms.Cursor.Position);
}));

或在后台线程中执行所有处理,只需返回Frozen(Thread safe)即可BitmapSource您将需要悬停传递(int)((Grid)viewerImage.Parent).ActualWidth不同的内容,因为它也归UI线程所有。

bs.Freeze();

Dispatcher.BeginInvoke(new Action(() =>
{
    viewerImage.Source = bs;
}));

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用ContentControl在WPF中显示视图不起作用

来自分类Dev

全局样式在WPF中不起作用

来自分类Dev

Windows API在WPF中不起作用?

来自分类Dev

CharacterEllipsis在ItemsControl WPF中不起作用

来自分类Dev

全局样式在WPF中不起作用

来自分类Dev

VsBrush在WPF ResourceDictionary中不起作用

来自分类Dev

WPF ItemSource在XAML中不起作用

来自分类Dev

VsBrush在WPF ResourceDictionary中不起作用

来自分类Dev

UpdateSourceTrigger在WPF CustomControls中不起作用

来自分类Dev

wpf 中的 BorderBrush 不起作用

来自分类Dev

显示:flex在Chrome中不起作用

来自分类Dev

隐藏/显示在JSP中不起作用?

来自分类Dev

显示模式在javascript中不起作用

来自分类Dev

在Webview中显示pdf不起作用

来自分类Dev

RevealBackgroundBrush 中的显示高亮不起作用

来自分类Dev

C#使用WPF显示JPG图像不起作用

来自分类Dev

显示操作在嵌套显示页面中不起作用

来自分类Dev

WPF AlternateContent不起作用

来自分类Dev

WPF MultiDataTrigger不起作用

来自分类Dev

WPF绑定不起作用

来自分类Dev

WPF DataGridComboBoxColumn不起作用

来自分类Dev

WPF MultiDataTrigger不起作用

来自分类Dev

WPF ListView不起作用

来自分类Dev

VisualStateManager WPF 不起作用

来自分类Dev

新行在C#/ WPF的MessageBox中不起作用

来自分类Dev

WPF中的嵌入式字体不起作用

来自分类Dev

StackPanel的方向在ItemsControl(WPF)中不起作用

来自分类Dev

绑定在Checkbox isChecked WPF中不起作用

来自分类Dev

WPF元素绑定在XAML中不起作用