私は3つのフォームを持っています:A、B、C子フォームが隠された後、親はアクティブ化されません
Form1;
Form2B、C;
AはBの親とC
public partial class Form1 : Form
{
Form2 formB = null;
Form2 formC = null;
public Form1()
{
InitializeComponent();
formB = new Form2();
formB.Owner = this;
formC = new Form2();
formC.Owner = this;
}
private void showBC_Click(object sender, EventArgs e)
{
formB.Visible = true;
formC.Visible = true;
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void hide_Click(object sender, EventArgs e)
{
this.Hide();
}
}
- アプリケーションの起動である、形態Aは、ショーです。 > showBC_Click
- 形態BおよびCに示される - は、IボタンをクリックShowBC、アクティブCMDウィンドウ
- にIが活性型
- に、フォームAをクリックしてください。私は別のプログラム(CMD EX)を開き
- 私はBが が
- 私はBのボタンの非表示をクリックしactivedされ、その後C上のボタンを非表示をクリックして、私はAがアクティブであると思います(あなたがそう思う?)
- CMDウィンドウがアクティブな
// ==============================
@Sinatr私はAとB形
public partial class Form1 : Form
{
Form2 formB = null;
public Form1()
{
InitializeComponent();
formB = new Form2();
formB.Owner = this;
}
private void showB_Click(object sender, EventArgs e)
{
formB.Visible = true;
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void hide_Click(object sender, EventArgs e)
{
this.Hide();
}
private void MsgBox_Click(object sender, EventArgs e)
{
MessageBox.Show("Test");
}
}
- 場合、アプリケーション開始と同じ問題を抱えて、フォームAは、ショーです。
- 私は別のプログラム(例:CMD)を開き、アクティブCMDウィンドウ
- にIが活性型に、フォームAにIがボタンShowBをクリック
- クリック - > showB_Click
- フォームBが が示されて
- 私は
- Messageboxはが閉じられる メッセージボックスで[OK]ボタンをクリック
- 示されている形態B
- メッセージボックス "テスト" のボタンのメッセージボックスをクリック
- 私はBのボタンの非表示をクリックして、私はAがアクティブであると思います
- CMDウィンドウがアクティブである
私はAが最終段階
ソリューションでアクティブになっている期待(あなたがそう思います?): SelectColor Dialogのように、子ウィンドウがフォームではないため、win32 APIを使用して子ウィンドウをアクティブにする必要があります。すべての子フォームで は、私はそれを実行する必要があります。
[DllImport("user32.dll")]
private static extern IntPtr GetTopWindow(IntPtr parentHandle);
private static uint GW_HWNDNEXT = 2;
[DllImport("user32.dll")]
private static extern IntPtr GetWindow(IntPtr hWnd, uint wCmd);
[DllImport("user32.dll")]
private static extern int IsWindowVisible(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern IntPtr SetFocus(IntPtr parentHandle);
[DllImport("user32.dll")]
private static extern int GetWindowThreadProcessId(IntPtr handle, out int processId);
public static void SetAppFocus()
{
IntPtr topWindowHandle = GetTopWindow(IntPtr.Zero);
while (topWindowHandle != null)
{
if (IsWindowVisible(topWindowHandle) != 0)
{
int currentProcessId = Process.GetCurrentProcess().Id;
int processId = 0;
GetWindowThreadProcessId(topWindowHandle, out processId);
if (processId == currentProcessId)
{
SetFocus(topWindowHandle);
break;
}
}
// goto next window
topWindowHandle = GetWindow(topWindowHandle, GW_HWNDNEXT);
}
}
「zレイヤー」の注文がありますか?つまり、現在一番上のウィンドウを閉じたり隠したりすると、そのウィンドウはすぐ下にフォーカス(アクティブ化)されますか? ** MAGIC ** –
私は知っていますが、下のウィンドウはAではなく、cmdだと思います。 –
'Owner'と' Visible'を混乱させずに 'Show()'と 'Close( ) '? – GSerg