天道酬勤,学无止境

Take screenshot of wpf popup window

I try to take a screenshot of an application writen in WPF and the application is not captured, must I use a special tool to take the screenshot?

评论

You can use RenderTargetBitmap to generate an image from your WPF control.

    public const int IMAGE_DPI = 96;

    public Image GenerateImage(T control)
        where T : Control, new()
    {
        Size size = RetrieveDesiredSize(control);

        Rect rect = new Rect(0, 0, size.Width, size.Height);

        RenderTargetBitmap rtb = new RenderTargetBitmap((int)size.Width, (int)size.Height, IMAGE_DPI, IMAGE_DPI, PixelFormats.Pbgra32);

        control.Arrange(rect); //Let the control arrange itself inside your Rectangle
        rtb.Render(control); //Render the control on the RenderTargetBitmap

        //Now encode and convert to a gdi+ Image object
        PngBitmapEncoder png = new PngBitmapEncoder();
        png.Frames.Add(BitmapFrame.Create(rtb));
        using (MemoryStream stream = new MemoryStream())
        {
            png.Save(stream);
            return Image.FromStream(stream);
        }
    }

    private Size RetrieveDesiredSize(T control)
    {
        if (Equals(control.Width, double.NaN) || Equals(control.Height, double.NaN))
        {
            //Make sure the control has measured first:
            control.Measure(new Size(double.MaxValue, double.MaxValue));

            return control.DesiredSize;
        }

        return new Size(control.Width, control.Height);
    }

Note that this will generate a PNG image ;) If you wish to store it as a JPEG, I suggest you use another encoder :)

Image image = GenerateImage(gridControl);
image.Save("mygrid.png");

You can simply press PrtScr button (windows will copy whole descktop image to buffer), then paste it in Power Point and crop if you like.

I'm having the same issue, I need to take screenshots to document my tests but can't seem to get there.

The Window in question is a Borderless modal Window with rounded corners / transparency allowed. Here's my report:

  • HP Quality Center's Screenshot tool doesn't recognize it as a window and thus takes its screenshots as if the window weren't there.
  • SnagIt utilizes a keycombo to enter the capture mode. Once stroke is hit, the popup vanishes. It reappears after the capture has ended.
  • Standard Windows capture works OK (Alt + Prt Scr) and captures the window as it was intended to be captured.

Next thing I tried was capturing the window with an opened dropdownlist. None of the approaches mentioned above seems to work (the last approach captures the Window the same way it did before, without the open dropdown).

As far as I have understood all the talk correctly, the only thing you can do is implement this into the applications...

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何拍摄WPF控件的屏幕截图?(How to take a screenshot of a WPF control?)
    问题 我使用Bing贴图WPF控件创建了WPF应用程序。 我只想截图Bing地图控件。 正在使用此代码制作屏幕截图: // Store the size of the map control int Width = (int)MyMap.RenderSize.Width; int Height = (int)MyMap.RenderSize.Height; System.Windows.Point relativePoint = MyMap.TransformToAncestor(Application.Current.MainWindow).Transform(new System.Windows.Point(0, 0)); int X = (int)relativePoint.X; int Y = (int)relativePoint.Y; Bitmap Screenshot = new Bitmap(Width, Height); Graphics G = Graphics.FromImage(Screenshot); // snip wanted area G.CopyFromScreen(X, Y, 0, 0, new System.Drawing.Size(Width, Height), CopyPixelOperation.SourceCopy); string
  • 拍摄所有可见应用程序和表单的多个桌面的屏幕截图(Take screenshot of multiple desktops of all visible applications and forms)
    问题 我正在使用一个具有4个输出(显示器)的系统,每个输出例如1280x1024像素。 我需要整个桌面及其上所有打开的应用程序的屏幕快照。 我尝试了GetDesktopWindow()(MSDN),但无法正常工作。 某些表格未显示在捕获的图片上。 回答1 我尝试了GetDesktopWindow()函数,但无法正常工作。 当然不是。 GetDesktopWindow函数返回到桌面窗口的句柄。 它与捕获该窗口的图像无关。 此外,桌面窗口与“整个屏幕”不是一回事。 它专门指的是桌面窗口。 请参阅本文以获取更多信息,以及滥用此函数返回的句柄时可能出问题的地方。 我正在使用一个具有4个输出(显示器)且每个输出1280x1024(例如)的系统。 我需要整个桌面及其上所有打开的应用程序的屏幕截图。 使用Graphics.CopyFromScreen方法在.NET Framework中执行此操作相对简单。 您甚至不需要执行任何P / Invoke! 在这种情况下,唯一的技巧是确保您通过适当的尺寸。 由于您有4个监视器,因此仅传递主屏幕的尺寸将不起作用。 您需要传递包含所有监视器的整个虚拟屏幕的尺寸。 通过查询SystemInformation.VirtualScreen属性来检索此属性,该属性返回虚拟屏幕的边界。 如文档所示,这是多监视器系统上整个桌面的范围。 样例代码: //
  • WPF:截图方式(WPF: Way to take screenshots)
    问题 希望修改以下内容以截取所有监视器的屏幕截图。 我尝试调整它,但是图像空白。 将其写入test.png进行测试。 byte[]将被发送到接收应用。 public byte[] Take() { int screenWidth = Convert.ToInt32(SystemParameters.VirtualScreenWidth); int screenHeight = Convert.ToInt32(SystemParameters.VirtualScreenHeight); int screenLeft = Convert.ToInt32(SystemParameters.VirtualScreenLeft); int screenTop = Convert.ToInt32(SystemParameters.VirtualScreenTop); RenderTargetBitmap renderTarget = new RenderTargetBitmap(screenWidth, screenHeight, 96, 96, PixelFormats.Pbgra32); VisualBrush sourceBrush = new VisualBrush(); DrawingVisual drawingVisual = new DrawingVisual()
  • WPF Screenshot JPG from UIElement with C#
    I'm trying to create a JPG from part of my WPF Applications. Like a screenshot, only of individual UIElements. I started here: http://www.grumpydev.com/2009/01/03/taking-wpf-screenshots/ I am using his extension method, which essential allows you to get a byte[] with UIElement.GetJpgImage(). This can then be written using a filestream to a JPG image. If I make a JPG of the whole window, it looks just fine! However, this is not ideal because it just captures what the user sees. Things that are not visible because of the scrollviewer or because their parent was animated to a small size won't
  • WPF工具包DatePicker仅月/年(WPF Toolkit DatePicker Month/Year Only)
    问题 我正在使用上述工具包的Datepicker,但我想将其限制为仅选择月份和年份,因为在这种情况下,用户不知道或不关心确切的日期。显然,数据存储在Datetime中格式将存储一天,但这与我无关。 有没有简单的方法可以解决这个问题? 谢谢 回答1 如果可以使用日历控件,则可以 <toolkit:Calendar x:Name="_calendar" DisplayModeChanged="_calendar_DisplayModeChanged" DisplayMode="Year" /> 与此代码隐藏 Private Sub _calendar_DisplayModeChanged(ByVal sender As System.Object, ByVal e As Microsoft.Windows.Controls.CalendarModeChangedEventArgs) If _calendar.DisplayMode = Microsoft.Windows.Controls.CalendarMode.Month Then _calendar.DisplayMode = Microsoft.Windows.Controls.CalendarMode.Year End If End Sub 回答2 感谢@FernandoGarcía提供的依据。
  • WPF touch application (partially) freezes on .NET Framework 4.7
    Update Microsoft acknowledged the issue: Gepost door Microsoft op 13/10/2017 om 11:38 Thank you for reporting this. We are aware of this issue and are fixing it in a future version of .NET. There is also a related issue that is being released in a servicing fix that will drastically reduce the possibility of hitting this problem. This will be serviced relatively soon. Problem Our WPF application is being used on tablets using touch (no stylus) and we are experiencing issues after the installation of .NET Framework 4.7. Two scenarios can occur after using the application for a while: either the
  • 当WPF Popup的锚元素移动时,如何移动它?(How can I move a WPF Popup when its anchor element moves?)
    问题 我有一个这样定义的弹出窗口: <Popup Name="myPopup" StaysOpen="True" Placement="Bottom" PlacementRectangle="0,20,0,20" PlacementTarget="{Binding ElementName=myPopupAnchor}"> <TextBlock ... /> </Popup> 我已将事件处理程序添加到事件MouseEnter和MouseLeave的myPopupAnchor元素中。 这两个事件处理程序可切换弹出窗口的可见性。 我的问题是,myPopupAnchor的位置仅在第一次显示弹出窗口或隐藏然后再次显示时才读取。 如果锚点移动,则弹出窗口不移动。 我正在寻找解决此问题的方法,我想要一个移动的Popup。 我可以通知WPF PlacementTarget绑定已更改并且应该重新读取吗? 我可以手动设置弹出窗口的位置吗? 当前,我有一个非常粗糙的解决方法,涉及关闭然后再次打开弹出窗口,这会引起一些重新绘制问题。 回答1 我查看了几个选项并在那里进行了采样。 对我来说,最有效的方法是“突出”使Popup自行重新定位的属性之一。 我使用的属性是Horizo​​ntalOffset。 我将其设置为(本身+ 1),然后将其设置回原始值。 我在重新定位窗口时运行的事件处理程序中执行此操作。 /
  • WPF - FindName Returns null when it should not
    FindName is broken for me :( The object I am looking for is there. I have proof. Here is the scenario: ToggleButton button = (ToggleButton)sender; Popup popup = (Popup)button.FindName("popSelectIteration"); popup is null but not always. Just sometimes. But even when it is set to null the child I am looking for is there. I put a break point in when it was null and grabbed these two screenshots. The is where FindName is returning null for "popSelectIteration". But if you dig into the watch, you see that the child is there. So what am I missing? Why does FindName not find it? As you can see from
  • Can't create a fullscreen WPF popup
    Using WPF .NET 4.0 in VS2010 RTM: I can't create a fullscreen WPF popup. If I create a popup that is sized 50% width and 100% height everything works fine, but if I try to create a "full screen" popup sized to 100% width and height it ends up displaying at 100% width and 75% height... the bottom is truncated. Note: The width and height are actually being expressed in pixels in code, I'm using percent to make the situation a little more understandable... It "feels" like there is some sort of limit preventing the area of a popup from exceeding ~75% of the total area of the screen. UPDATE: Here
  • WPF 弹出窗口(WPF popup window)
    问题 我想让用户在单击按钮后选择他们的选项。 例如,在模态弹出窗口中显示两个按钮“立即重启”和“稍后重启”将是我的偏好。 使用MessageBox对我来说不是解决方案,因为它不允许用户更改按钮的标题。 回答1 您需要创建一个新的 Window 类。 你可以按照你想要的任何方式设计它。 您可以像这样以模态方式创建和显示窗口: MyWindow popup = new MyWindow(); popup.ShowDialog(); 您可以为结果值添加自定义属性,或者如果您只有两个可能的结果(+ 可能不确定,这将为null ),您可以在关闭窗口之前设置窗口的 DialogResult 属性,然后检查它(它是值由ShowDialog()返回)。 回答2 在 WPF 中有一个名为 Popup 的控件。 Popup myPopup = new Popup(); //(...) myPopup.IsOpen = true; 回答3 XAML <Popup Name="myPopup"> <TextBlock Name="myPopupText" Background="LightBlue" Foreground="Blue"> Popup Text </TextBlock> </Popup> C# Popup codePopup = new Popup(); TextBlock
  • C#/ WPF:将弹出窗口控件放置在屏幕中央吗?(C#/WPF: Place Popup Control in Center of Screen?)
    问题 有谁知道我如何在屏幕中央放置一个弹出控件? 谢谢! 回答1 使用Placement和PlacementTarget属性将其相对于位于窗口根部的任何面板定位。 因此,如果我有一个Grid , StackPanel等包含称为MainPanel的窗口中的所有其他“东西”,则可以执行以下操作: <Popup PlacementTarget="{Binding ElementName=MainPanel}" Placement="Center" > 回答2 首先,可以使用System.Windows.SystemParameters类的静态属性FullPrimaryScreenHeight和FullPrimaryScreenWidth获取屏幕的高度和宽度。 然后,可以在显示之前使用宽度和高度设置弹出控件的“ Top和“ Left属性。 就像是。 double primScreenHeight = System.Windows.SystemParameters.FullPrimaryScreenHeight; double primScreenWidth = System.Windows.SystemParameters.FullPrimaryScreenWidth; _yourControl.Top = (primScreenHeight - _yourControl.Height)
  • 拖动WPF弹出控件(Drag WPF Popup control)
    问题 WPF Popup控件很好,但在我看来有点受限制。 有没有办法在打开弹出窗口时“拖动”弹出窗口(例如Windows的DragMove()方法)? 可以做到这一点而没有大问题吗?还是我必须自己编写一个替代弹出窗口类的东西? 谢谢 回答1 这是一个使用Thumb的简单解决方案。 XAML和代码隐藏中的子类弹出窗口添加宽度/高度设置为0的Thumb(在XAML中也可以这样做) 在弹出窗口上侦听MouseDown事件,并在Thumb上引发同一事件在DragDelta上移动弹出窗口 XAML: <Popup x:Class="PopupTest.DraggablePopup" ...> <Canvas x:Name="ContentCanvas"> </Canvas> </Popup> C#: public partial class DraggablePopup : Popup { public DraggablePopup() { var thumb = new Thumb { Width = 0, Height = 0, }; ContentCanvas.Children.Add(thumb); MouseDown += (sender, e) => { thumb.RaiseEvent(e); }; thumb.DragDelta += (sender, e) => {
  • WPF弹出窗口的习惯(WPF Handedness with Popups)
    问题 我刚刚将PC从Windows 7移至Windows 8,并且在运行WPF应用程序时,我注意到WPF弹出窗口和/或工具提示现在默认位于左下角,而不是通常的右下角。 有人注意到吗? 我知道您可以在xaml中的每个工具提示上指定它们的位置,但是我们有很多工具提示和弹出窗口。 我想知道是否可以在WPF应用程序中全局指定默认位置。 Google在这个问题上并未取得很多成果。 我们有理由将它们保持在相同的原始默认位置(某些弹出窗口相对于其启动位置具有内容)。 Windows 8 :(左下方) Windows 7 :(右下方) 相同的代码! 标准的“工具提示” xaml属性。 有任何想法吗? 解决,我发表了评论 好的,我发现了问题。 它与Tablet PC /触摸屏有关。 (左手..右手首选项)此其他链接提供了一个原因。 我正在研究一种解决方案,现在可以解决此问题。 病态很快就会贴出来! Windows 8弹出位置 回答1 感谢@TravisWhidden提供解决方案。 刚刚实现了侦听StaticPropertyChanged事件的改进版本,因此将其粘贴到此处,因为它看起来不像是“ hack”。 private static readonly FieldInfo _menuDropAlignmentField; static MainWindow() {
  • WPF popup移动、弹开、关闭、焦点等处理
    using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls.Primitives; using System.Windows.Input; using System.Windows.Interop; namespace commom { /// <summary> /// popup帮助类 /// 实现popup与PlacementTarget关联控件的联动,PlacementTarget可以是Button等等 /// 使用方式: /// 1、xaml添加PopupAttachHelper的引用 /// 2、popup 使用PopupAttachHelper.IsAutoSetPopup设置为True /// </summary> public class PopupAttachHelper : DependencyObject { public static bool GetIsAutoSetPopup
  • Is it possible to get a popup to ignore MenuDropAlignment in a WPF / Touch app?
    As a bit of background - Windows has a facility for Touch/TabletPCs whereby it shifts the position of popups/menus depending on your "handedness" (to prevent the menu appearing under your hand). Essentially what this does is if you are set to "right handed" (which it seems to default to once you've connected a touch device), every popup you open is artificially kicked to the left - this causes massive layout issues where we try and line up a popup with the item it "popped up from" : Tablet PC Settings set to Left handed - no artificial correction from Windows Tablet PC Settings set to Right
  • 如何延迟打开WPF弹出窗口?(How Can I Open a WPF Popup with a Delay?)
    问题 我只是想延迟打开WPF弹出窗口,就像工具提示一样。 我怎样才能做到这一点? 而且,顺便说一句,Popup.PopupAnimation = PopupAnimation.Fade ...消失得太快。 我要在那里至少半秒钟。 回答1 您可以通过以下方式创建要应用于弹出窗口的样式: <Style x:Key="TooltipPopupStyle" TargetType="Popup"> <Style.Triggers> <DataTrigger Binding="{Binding PlacementTarget.IsMouseOver, RelativeSource={RelativeSource Self}}" Value="True"> <DataTrigger.EnterActions> <BeginStoryboard x:Name="OpenPopupStoryBoard" > <Storyboard> <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" FillBehavior="HoldEnd"> <DiscreteBooleanKeyFrame KeyTime="0:0:0.25" Value="True"/> </BooleanAnimationUsingKeyFrames> <
  • WPF-FindName不应该返回null(WPF - FindName Returns null when it should not)
    问题 FindName为我坏了:( 我要寻找的对象在那里。 我有证据 这是场景: ToggleButton button = (ToggleButton)sender; Popup popup = (Popup)button.FindName("popSelectIteration"); popup为null,但并非总是如此。 只是有时候。 但是,即使将其设置为null,我正在寻找的孩子也在那里。 我在它为null时设置了一个断点,并抓取了这两个屏幕截图。 FindName将为“ popSelectIteration”返回null的位置。 但是,如果您深入观察手表,就会发现孩子在那里。 那我想念什么呢? 为什么找不到FindName? 从屏幕快照中可以看到,这不是时间问题(FindName手表为空,但直接路径很好)。 有没有更好的方法来找到控件? 旁注:如果您对XAML感兴趣的切换按钮感兴趣,可以在以下问题中找到:WPF-FrameworkElement-枚举所有后退者吗? 更新:我做了一些挖掘,以了解为什么有时失败,有时又失败。 我有一个动画,它调用NameScope.SetNameScope((DependencyObject)form, new NameScope()); (完整的方法代码在这里)。 在此之后,FindName开始失败。 我不太了解那个电话。
  • 有什么比 Sikuli 更好的工具可用于 Windows 7(或最好是多平台)上的屏幕自动化 [关闭](What better tool than Sikuli to use for screen automation on Windows 7 (or preferably multi-platform) [closed])
    问题 就目前而言,这个问题不适合我们的问答形式。 我们希望答案得到事实、参考或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。 如果您认为此问题可以改进并可能重新打开,请访问帮助中心以获取指导。 8 年前关闭。 我正在使用 Sikuli 进行屏幕自动化。 即根据 GUI 元素在屏幕上的外观点击它们。 这没问题,但 Sikuli 对我来说有一个主要缺点: 每个脚本启动缓慢(因为每次都加载整个 JVM)。 更多关于 Sikuli 的内容自去年以来并没有太大的发展,所以我正在寻找替代的自动化工具。 我需要的大票是屏幕意识:该工具必须“寻找”屏幕上的某些 UI 元素,而不是将鼠标移到那里并发出点击。 有没有比 Sikuli 更快、更好维护的工具的建议? 回答1 如果你想在 Windows 下自动化任何东西,我会推荐你​​ Automa - 新的轻量级 GUI 自动化工具。 它只是“查找”UI 元素——您需要做的就是提供它们的名称,就像人类用户看到的那样。 而且它实际上比 Sikuli 更易于使用 - 您无需截取任何屏幕截图。 例如,如果您想自动登录到 Windows Live Messenger,您可以运行以下脚本: start("messenger") write("my.email@domain.com", into="Email address") write(
  • Is it possible to get the Hwnd of a WPF Popup control?
    I need to apply an Aero background blur to only part of a custom-shaped WPF window. The problem is that to apply the blur with DWM, I need to provide a window handle to the DwmEnableBlurBehindWindow function. I have been told that the WPF popup control is actually a separate window. That is good. Can I get a popup's handle to apply blur to it? If so, how?
  • WPF DataGrid样式-Silverlight DataGrid?(WPF DataGrid style-Silverlight DataGrid?)
    问题 这不是秘密:Silverlight的DataGrid默认样式很漂亮,而WPF则很差。 让我问社区是否有人复制了要在WPF中使用的SL样式,而不是重新发明轮子。 请查看屏幕截图,并自行判断Silverlight和WPF团队如何投资他们的产品。 Silverlight默认样式的DataGrid: WPF默认样式的DataGrid(在Saied K回答后更新): 回答1 我没有找到任何具有可正常工作的Silverlight样式的DataGrid ,因此我在Codeplex上创建了一个项目: http://datagridthemesfromsl.codeplex.com 没有所有主题,但是至少有几个主题。 回答2 深入MSDN,我发现了这一点。 在本文的底部,您将看到以下短语: 例如,看下面的插图,它显示了使用ControlTemplates示例进行样式化的一部分 如果单击“使用ControlTemplates示例进行样式设置”,它将带您到下载链接。 下载后,您可以编译该项目,它包括各种样式,包括难以捉摸的datagrid样式! 您可以获取MS的DataGrid.xaml文件并根据需要对其进行修改。 回答3 似乎没有开箱即用的样式。 我在Microsoft建议网站上发布了建议,请在这里和这里投票!!! 任何将Silverlight