2017-08-27 9 views
1

私がしようとしていることは単純です:WinFormを別のものの上に作成しますが、一番上には作成しないでください。 同様に、ウィンドウをクリックすると、私のwinformがその上に表示されますが、ブラウザのような何かをクリックすると、私のフォームはその上に表示されません。TopMostではなくフォームを別のフォームの上に置くことは可能ですか?

TopMost WinFormのようですが、特定のプロセスのみです。 (Imはゲームのためのオーバーレイを作るので、私はそれが唯一のゲーム上の最上位にする必要があります。)を支援する

写真(赤枠内のすべては私のフォームです):enter image description here

そしてときに私別のウィンドウに変更する(この場合はエクスプローラ)リーグの伝説のクライアントのようにフォームをバックグラウンドにしたい。enter image description here

+0

私は自分のWinFormsアプリケーションを別のプロセス(League of Legends)に「ドッキング」してカスタムインターフェイスを作成したいと思います。 そのように、ゲームウィンドウがバックグラウンドで最小化すると、私のフォームはゲームのトップになりますが、TopMostではなくなります。 –

答えて

3

所有フォームは常に所有者フォームの上に表示されます。所有者が所有するフォームを作成するには、例えば、所有しているフォームのOnwerプロパティに所有者のフォームの参照を割り当てることができます。

var f = new Form(); 
f.Owner = this; 
f.Show(); 

所有者として別のプロセスのウィンドウを設定します。そのためにはまず、他のプロセスのウィンドウのハンドルを見つける必要があり、その後、SetWindowLong API関数を使用して、あなたはたとえば、フォームの所有者として、それを設定することができます。上記の例で

//using System.Runtime.InteropServices; 
//using System.Diagnostics; 

[DllImport("user32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto)] 
public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong); 
private void button1_Click(object sender, EventArgs e) 
{ 
    var notepad = Process.GetProcessesByName("notepad").FirstOrDefault(); 
    if(notepad!=null) 
    { 
     var owner = notepad.MainWindowHandle; 
     var owned = this.Handle; 
     var i = SetWindowLong(owned, -8 /*GWL_HWNDPARENT*/, owner); 
    } 
} 

、ヨーヨーurフォームは常にメモ帳ウィンドウの上に表示されます。

+0

これは2つのフォームで動作するはずですが、私の場合はそうではありません。 私のプログラムはフォームであり、WinForm以外のプログラムにアタッチする必要があります。 –

+0

ここでは、.NETで何かを実行する自然な方法であることがわかっています。安全でないコードを使用する可能性はかなり高いですが、前の.NETの世界のすべての面倒と、その重要な.NET境界を越えて作業する際の追加の問題にぶつかります。これが核となる機能なら、プライマリアプリケーション(https://social.msdn.microsoft.com/Forums/)から安全でないコードを分離するために、よりネイティブなもの(ネイティブC++)や何かを使う方が良いかもしれません。 vstudio/en-US/644c2f9c-f06a-496a-b497-6420a7919fdb/64-bit-app-calling-32-bit-dll?forum = csharpgeneral)。 – Christopher

+0

@Christopherそれは 'Owner'プロパティの設定が内部的に働く方法です。その[ソースコード](https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Form.cs,6c3819871d1e9085,references)を見てください。 –

0

それはフォームの場合、次のコードでモーダルダイアログとしてそれを開くことができます。

var modalForm = new Form(); 
    modalForm .ShowDialog(); 

ShowDialogue()は常に、それが作成され、そこからトップフォームとしてフォームを開きます。しかし、1つの問題は、モーダルダイアログフォームを閉じるまで、親フォームにアクションを実行できないことです。

+0

ShowDialogは、後ろにあるウィンドウをブロックします。また、OPは、別のプロセスのウィンドウにも使用できるソリューションを探しています。 –

+0

はい、そうです。私もそれを言いました。 – Tanjeer

関連する問題