显示在另一个程序之上的覆盖
本文关键字:覆盖 程序 另一个 显示 | 更新日期: 2023-09-27 18:06:38
我有一个在第三方应用程序中显示一些附加信息的程序。最初,第三方应用程序有一个简单的API,允许我创建文本对象;但在一次版本更新中被删除了。使用旧版本不是一个选项。
是否有简单的方法来做到这一点?我基本上只想要几行易于更新的文本,这些文本相对于主机窗口定位,具有透明的背景,最小化主机窗口,并且不干扰主机窗口对击键或鼠标的处理。
如果这不是问这个问题的合适地方,我道歉,我确实搜索了这个网站,但我找不到任何符合我需要的东西。
要做到这一点并不容易,主要是因为每个进程都在自己的内存空间中运行。然而,你可以"假装"它。您需要做的第一件事是找到窗口的句柄:
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;
这应该可以做到,尽管我还没有测试过。你可以添加任何文本框或标签,你可能需要你的表单,它会"覆盖"的应用程序。希望这对你有用!