Вы можете поместить ListBox в другую форму и вызывать / показывать форму всякий раз, когда вам нужен список завершения.Это избавит вас от необходимости беспокоиться о том, является ли ListBox самым верхним или нет.
Смысл этого метода в том, что вам придется кодировать форму автозаполнения, чтобы она не крала фокус из основной формы.
Вот код, который поможет вам на тот случай, если вам интересно, как заставить форму показываться без активации (воровство фокуса).
private const int SW_SHOWNOACTIVATE = 4;
private const int HWND_TOPMOST = -1;
private const uint SWP_NOACTIVATE = 0x0010;
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
static extern bool SetWindowPos(
int hWnd, // window handle
int hWndInsertAfter, // placement-order handle
int X, // horizontal position
int Y, // vertical position
int cx, // width
int cy, // height
uint uFlags); // window positioning flags
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
static void ShowInactiveTopmost(Form frm)
{
ShowWindow(frm.Handle, SW_SHOWNOACTIVATE);
SetWindowPos(frm.Handle.ToInt32(), HWND_TOPMOST,
frm.Left, frm.Top, frm.Width, frm.Height,
SWP_NOACTIVATE);
}
Вы также можете попробовать переопределить свойство ShowWithoutActivation
.
protected override bool ShowWithoutActivation
{
get { return true; }
}
Примечание: оба фрагмента кода взяты из этого вопроса: Показать форму без кражи фокуса? .