3

我有一个程序可以在第三方应用程序中显示一些附加信息。最初,第三方应用程序有一个简单的 API,可以让我创建文本对象;但它已在版本更新中被删除。使用旧版本不是一种选择。

是否有捷径可寻?我基本上只想要几行相对于主窗口定位的易于更新的文本,具有透明背景,与主窗口一起最小化,并且不干扰主窗口对击键或鼠标的处理。

抱歉,如果这不是问这个问题的合适地方,我确实搜索了该网站,但我找不到任何似乎适合我需要的东西。

4

1 回答 1

8

没有一种简单的方法可以做到这一点,主要是因为每个进程都在自己的内存空间中运行。但是,您可以“伪造”它。您需要做的第一件事是找到窗口的句柄:

Process[] processes = Process.GetProcessesByName("appName");

Process p = processes.FirstOrDefault();
IntPtr windowHandle;
if (p != null)
{
    windowHandle = p.MainWindowHandle;
}

现在,一旦你有了句柄,你就可以得到窗口所在的屏幕区域:

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}

RECT rect = new RECT();
GetWindowRect(windowHandle, ref rect);

这将为您提供窗口的位置。需要注意的一件事是,如果在运行此应用程序时将应用程序最小化,您将获得诸如 -32000 之类的值。如果您有兴趣了解原因,可以阅读此内容。现在您有了窗口的位置,在您的应用程序中,您可以将应用程序的窗体调整为与其他应用程序相同的大小,并将其放置在应用程序上:

this.Location = new Point(rect.Left, rect.Top);
this.Size = new Size(rect.Right - rect.Left, rect.Bottom - rect.Top);

现在,您的应用程序直接位于另一个应用程序之上,并调整为与另一个应用程序相同的大小。最后,您需要使您的应用程序“透明”:

this.BackColor = Color.LimeGreen;
this.TransparencyKey = Color.LimeGreen;
this.FormBorderStyle = FormBorderStyle.None;

这应该可以,虽然我没有测试过。您可以在表单中添加您可能需要的任何文本框或标签,它将“覆盖”应用程序。希望这对你有用!

于 2013-03-30T06:12:18.287 回答