Установка владельца формы приводит к тому, что эта форма остается поверх своего владельца в качестве немодального окна.
Если принадлежит Форма имеет свойство ShowInTaskbar
, установленное на true
, стандартная комбинация клавиш ALT+TAB
или WIN+TAB
, используемая для перебора открытых окон в Системе, выводит на передний план (активирует) следующую принадлежащую Форму вместо Владельца.
Какой дочерний элемент Форма активирована, это зависит от текущей позиции формы на панели задач.
Если вместо свойства ShowInTaskbar
дочерних элементов установлено значение false
, активируется форма владельца.
Чтобы заметить, что если дочерняя форма может быть свернута, может наблюдаться некоторое неловкое поведение:Alt или Control-tabbing, заставляют дочерние формы появляться и исчезать неприятным способом.
В любом случае, стандартную комбинацию клавиш CONTROL+F6
можно использовать для перемещения фокуса на открытые дочерние формы (и форму владельца, в этом виде раскладки), а также, если необходимо, на передний план.форма свернута).
Здесь переопределение ProcessCmdKey , поэтому комбинация клавиш перехватывается независимо от того, какой дочерний элемент управления захватил курсор.
Код здесь активирует Форму, нажимая одновременно CONTROL+F6
и CONTROL+SHIFT+F6
, перемещая Фокус к каждой из открытых дочерних форм и Владельцу.Это также работает, когда дочерняя форма свернута (или все они).
В форме владельца:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
bool isControlF6 = keyData == (Keys.Control | Keys.F6);
bool isCtrlShiftF6 = keyData == (Keys.Control | Keys.Shift | Keys.F6);
if (isControlF6 || isCtrlShiftF6)
{
Form frm = isCtrlShiftF6
? Application.OpenForms.OfType<Form>().LastOrDefault(f => f.Owner == this)
: Application.OpenForms.OfType<Form>().FirstOrDefault(f => f.Owner == this);
if (frm is null) return true;
frm.WindowState = FormWindowState.Normal;
frm.Focus();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
В форме ребенка:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
bool isControlF6 = keyData == (Keys.Control | Keys.F6);
bool isCtrlShiftF6 = keyData == (Keys.Control | Keys.Shift | Keys.F6);
if (isControlF6 || isCtrlShiftF6) {
int frmNext = 0;
var formsList = Application.OpenForms.OfType<Form>()
.Where(f => (f.Owner == this.Owner) || (f == this.Owner)).ToList();
for (int i = 0; i < formsList.Count; i++) {
if (formsList[i] == this) {
if (isCtrlShiftF6) { frmNext = i == 0 ? formsList.Count - 1 : i - 1; }
if (isControlF6) { frmNext = i == formsList.Count - 1 ? 0 : i + 1; }
formsList[frmNext].WindowState = FormWindowState.Normal;
formsList[frmNext].Focus();
return true;
}
}
}
return base.ProcessCmdKey(ref msg, keyData);
}