Я не уверен, я полностью понимаю, что вы пытаетесь достичь, однако если вы хотите, чтобы элемент управления, который может получать щелчки мыши, но не «украсть» фокус, это вполне возможно:
public class Box : Control
{
public Box()
{
// Prevent mouse clicks from 'stealing' focus:
TabStop = false;
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
DrawText(e.Graphics);
}
// Display control text so we know what the button does:
private void DrawText(Graphics graphics)
{
using (var brush = new SolidBrush(this.ForeColor))
{
graphics.DrawString(
this.Text, this.Font, brush,
new PointF()
{
X = ((float)this.Width/2f),
Y = (((float)this.Height/2f) - (this.Font.GetHeight(graphics)/2f))
},
new StringFormat()
{
Alignment = StringAlignment.Center
});
}
}
}
Это простое управление будет отображаться в виде прямоугольника, который все еще находится в состоянии получить щелчки мыши и пожарной кнопки мыши события, но не перехватывает фокус от других элементов управления на форме (ни сама форма).
Установка ключ прозрачности на форме ее цвет фона сделает остальные формы невидимы, так что только прямоугольная «кнопка» будет видна. Это также можно комбинировать с свойством Opacity
, чтобы сделать то, что отображается полупрозрачным, но форма с непрозрачностью точно ноль не будет взаимодействовать с мышью (по дизайну Windows).
Просто установка TopMost
свойства формы в истинно не может быть достаточно, чтобы держать окно поверх всех остальных окон. Вы, возможно, потребуется сделать следующее API вызова внутри формы при ее создании (например, место в конструкторе, OnLoad
событие, и т.д.):
SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, (SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW));
MSDN документацию по этой функции можно найти here.
Для того, чтобы сделать это позвонить вам нужно будет добавить следующее объявление API для Windows в классе формы:
[DllImport("user32.dll")]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
, а также добавить следующие константы:
private const int SWP_NOMOVE = 0x0002;
private const int SWP_NOSIZE = 0x0001;
private const int SWP_SHOWWINDOW = 0x0040;
private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
Надеюсь, это поможет!
Звучит ужасно рыбный –
Обычно видимые пиксели захватывают щелчок. – TaW
@ Кирилл: Почему? – Frank