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);

これにより、ウィンドウの位置がわかります。注意すべきことの 1 つは、これを実行するときにアプリケーションが最小化されている場合、-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 に答える