在屏幕上放置半透明标记(Windows XP)

时间:2014-06-03 07:38:05

标签: c# c++ windows watermark

我想在Windows XP计算机屏幕上显示半透明图像(类似于水印)。这是因为我从同一个终端访问不同的计算机,我想在任何时候看到该终端连接到哪台计算机。

这个“半透明”图像不应该干扰Windows的正常操作,它应该允许点击(因为它有效地不存在)。

我编写了一点C ++和C#。因为我只需要一个可以在Windows XP中运行的脏解决方案, 我实际上可以想到一个钩子,它捕获窗口刷新事件并以某种方式在显示之前注入我想要的图像,但我以前从未这样做过,也不知道是否可以有任何其他更优化的方法。 有什么想法吗?

2 个答案:

答案 0 :(得分:3)

如果你想要一个快速而又脏的解决方案,在Visual Studio中创建一个新的默认C#WinForms应用程序,然后将Form1.cs中的Form1部分类代码替换为:

public partial class Form1 : Form
{
    private Label waterMarkLabel;

    public Form1()
    {
        waterMarkLabel = new Label
        {
            Anchor = (AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right),
            Font = new Font("Microsoft Sans Serif", 80F, FontStyle.Regular, GraphicsUnit.Point, ((byte)(0))),
            ForeColor = SystemColors.ControlDarkDark,
            Location = new Point(126, 178),
            Name = "WATERMARK",
            Size = new Size(338, 120),
            TabIndex = 0,
            Text = "W A T E R M A R K",
            TextAlign = ContentAlignment.MiddleCenter
        };

        InitializeComponent();
        SuspendLayout();
        AutoScaleDimensions = new SizeF(6F, 13F);
        AutoScaleMode = AutoScaleMode.Font;
        ClientSize = new Size(579, 489);
        ControlBox = false;
        FormBorderStyle = FormBorderStyle.None;
        MaximizeBox = false;
        MinimizeBox = false;
        Opacity = 0.1D;
        ShowIcon = false;
        ShowInTaskbar = false;
        TopMost = true;
        var hwnd = Handle;
        WindowsServices.SetWindowExTransparent(hwnd);
        TopMost = true;
        AllowTransparency = true;
        ResumeLayout(false);

        Controls.Add(waterMarkLabel);
        WindowState = FormWindowState.Maximized;
    }
}

public static class WindowsServices
{
    const int WS_EX_TRANSPARENT = 0x00000020;
    const int GWL_EXSTYLE = (-20);

    [DllImport("user32.dll")]
    static extern int GetWindowLong(IntPtr hwnd, int index);

    [DllImport("user32.dll")]
    static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle);

    public static void SetWindowExTransparent(IntPtr hwnd)
    {
        var extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
        SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_TRANSPARENT);
    }
}

然后将以下using语句添加到顶部:

using System.Runtime.InteropServices;

如果您构建并运行,您应该会在屏幕上找到透明浮动的“WATERMARK”字样,并且您将能够使用其下方的所有其他窗口,就像它不存在一样。

DLLImport代码借用了此答案here

答案 1 :(得分:0)

根据您要显示的信息类型,您可以尝试使用Microsoft Sysinternals BgInfo。 它允许将信息集成到桌面的背景图像中。

http://technet.microsoft.com/en-us/sysinternals/bb897557.aspx