Так, це відома проблема основних компонентів .NET. Коли появиться можливість (десь в кінці тижня), гляну як можна обійти проблему. За той час кинь код в топік.
Я знайшов що треба перехоплювати події натиснення на клавіші прокрутки і слати формі повідомлення WM_VSCROLL та інші через функцію SendMessage.
Виклик функції SetFocus, методу Focus самої форми, задавання WS_TABSTOP (The window is a control that can receive the keyboard focus when the user presses the TAB key.) через SetWindowLongPtr не допомагає. Якщо вікно є дочірнім вікном в MDI (через властивість MdiParent форми задано батьківську форму) і не містить компонентів на кшталт Button що перехоплюють фокус або просто порожнє, то натиснення клавіш призводить до активації попереднього вікна. В Windows forms навіть не вдається перехопити відповідні події. Я проглянув код Windows forms проте все що я зрозумів що така якось повʼязана з оцим шматком з файлу Form.cs:
/// <summary>
/// Retrieves true if this form is currently active.
/// </summary>
internal bool Active
{
get
{
Form? parentForm = ParentForm;
if (parentForm is null)
{
return _formState[s_formStateIsActive] != 0;
}
return parentForm.ActiveControl == this && parentForm.Active;
}
set
{
if (_formState[s_formStateIsActive] != 0 == value)
{
return;
}
if (value && !CanRecreateHandle())
{
return;
}
_formState[s_formStateIsActive] = value ? 1 : 0;
if (value)
{
_formState[s_formStateIsWindowActivated] = 1;
// Check if validation has been canceled to avoid raising Validation event multiple times.
if (!ValidationCancelled)
{
if (ActiveControl is null)
{
// If no control is selected focus will go to form
SelectNextControl(null, true, true, true, false);
}
InnerMostActiveContainerControl.FocusActiveControlInternal();
}
OnActivated(EventArgs.Empty);
}
else
{
_formState[s_formStateIsWindowActivated] = 0;
OnDeactivate(EventArgs.Empty);
}
}
}
І функцією SelectNextControl з файлу Control.cs:
/// <summary>
/// Selects the next control following ctl.
/// </summary>
public bool SelectNextControl(Control? ctl, bool forward, bool tabStopOnly, bool nested, bool wrap)
{
Control? nextSelectableControl = GetNextSelectableControl(ctl, forward, tabStopOnly, nested, wrap);
if (nextSelectableControl is not null)
{
nextSelectableControl.Select(true, forward);
return true;
}
else
{
return false;
}
}