【问题标题】:WPF shadow and capture screenWPF 阴影和捕获屏幕
【发布时间】:2014-06-13 14:35:14
【问题描述】:

我用这段代码做了一个阴影窗口

<Grid Background="Red" Margin="0">
    <Grid.Effect>
        <DropShadowEffect BlurRadius="10" ShadowDepth="1" Direction="270" Color="Red"/>
    </Grid.Effect>
    <Grid Margin="1" Background="White">

    </Grid>
</Grid>

结果成功,但是当我尝试使用 alt+print scr 捕获 Windows 屏幕截图时 有这样的空白页边距。

first http://puu.sh/9rK9b/4dbd9a3b46.png

我想只在网格区域内捕获屏幕,除了这样的阴影区域。

second http://puu.sh/9rKcj/098796a6c7.png

【问题讨论】:

  • 你必须从两个中选择一个:漂亮且易于制作阴影 inside 窗口或 ALT-PRNSCR(从 inside 拍摄快照 也是如此)。我相信可以在窗口外绘制阴影,但这将是一些 winapi/aero 互操作。例如,请参阅here

标签: c# wpf xaml shadow


【解决方案1】:

您需要手动复制 alt+print scr 的功能以获得您需要的行为。

首先,您需要连接到消息循环并按照以下几行拦截新闻:

ComponentDispatcher.ThreadFilterMessage += new ThreadMessageEventHandler(OnThreadMessage);

static void OnThreadMessage(ref MSG msg, ref bool handled)
{
    if (!handled)
    {
        if (msg.message == WmHotKey)
        {
            // intercept alt+print screen here, do custom action
        }
    }
}

然后你需要从 ui 元素生成你想要的图像,并沿着这些线将它设置到剪贴板(uiElement 将是你的 Grid):

var bmp = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
bmp.Render(uiElement);
encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bmp));
using (var stream = new MemoryStream)
{
    encoder.Save(stream);
    var img = Image.FromStream(stream);
    Clipboard.SetImage(img);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 2020-04-04
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多