我有3個窗體:A,B,C在子窗體隱藏後,父項未激活
Form1 A;
Form2 B,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是節目。
- 我打開另一個程序(例如:CMD),以活性cmd窗口
- 我點擊形式A,至活性形式的
- 我點擊按鈕ShowBC - > showBC_Click
- 形式B和C被示出
- 我按一下按鈕隱藏基於C則B會被激活,
- 我點擊B鍵隱藏,我希望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窗口
- 我點擊形式A,至活性形式的
- 我點擊按鈕ShowB - > showB_Click
- 形式B被示出
- 我點擊B型
- 的MessageBox 「測試」 顯示
- 我點擊消息框
- 消息框關閉按鈕OK按鈕MSGBOX
- 我點擊按鈕隱藏在B和希望A激活
- cmd窗口被激活
我預計是在最後一步
解決方案有效(你這麼認爲嗎?): 因爲某些子窗口不是窗體,比如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