我有一个程序可以在第三方应用程序中显示一些其他信息。最初,第三方应用程序有一个简单的API,允许我创建文本对象;但它已在版本更新中删除。使用旧版本不是一种选择。
有一种简单的方法吗?我基本上只想要几行易于更新的文本,它们相对于主机窗口定位,具有透明背景,最小化主机窗口,并且不会干扰主机窗口处理击键或鼠标。
道歉,如果这不是提出这个问题的合适地方,我确实搜索了网站,但我找不到任何符合我需要的东西。
答案 0 :(得分:7)
没有一种简单的方法可以做到这一点,主要是因为每个进程都在自己的内存空间中运行。但是,你可以“假装”它。您需要做的第一件事是找到窗口的句柄:
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之类的值。如果您有兴趣知道原因,可以read this。现在您已拥有窗口的位置,在应用程序中,您可以将应用程序的表单大小调整为与其他应用程序相同的大小,并将其放在应用程序上:
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;
这应该这样做,虽然我还没有测试过。您可以向表单添加可能需要的任何文本框或标签,它将“覆盖”应用程序。希望这对你有用!