Вывести надпись поверх всех окон. - C#
Формулировка задачи:
Здравствуйте. Подскажите, как можно, используя C#, вывести текст поверх всех окон, на экран(желательно чтобы мышка щелкала "сквозь" него). Допустим, нужно выводить какую-либо техническую информацию, чтобы всегда была перед глазами оператора. Есть ли в С# средства для этого? Гугл не помог, а мучиться с GDI, выводя напрямую на экран текст, который могут затереть (и затрут) другие окна, очень не хочется.
Решение задачи: «Вывести надпись поверх всех окон.»
textual
Листинг программы
using System.Drawing.Drawing2D;
using System.Threading;
public partial class Form1 : Form
{
int i = 0;
string PATH_STRING ;
const int FONT_SIZE = 100;
const FontStyle FONT_STYLE = FontStyle.Bold;
SizeF stringSize;
Timer stateTimer;
public Form1()
{
InitializeComponent();
this.TopMost = true;
// здесь интервал таймера 100 мс
stateTimer = new Timer(delegate { myMethod(); }, null, 0, 100);
}
void myMethod()
{
// вот здесь устанавливай нужное значение строки
PATH_STRING = String.Format("{0:d4}", i);
++i;
//Получаем оконные координаты верхней левой точки клиентской области
Point origin = new Point(SystemInformation.Border3DSize.Width, SystemInformation.CaptionHeight);
//При помощи GraphicsPath создаем Region в виде строки
GraphicsPath path = new GraphicsPath();
path.AddString(PATH_STRING, Font.FontFamily, (int)FONT_STYLE, FONT_SIZE, origin, StringFormat.GenericDefault);
this.BeginInvoke(new Action(() =>
{
//Устанавливаем регион для формы
Region = new Region(path);
//Вычисляем размеры прямоугольника, занимаемого строкой
stringSize = CreateGraphics().MeasureString(PATH_STRING, new Font(Font.FontFamily, FONT_SIZE, FONT_STYLE));
Width = (int)Math.Ceiling(stringSize.Width);
}));
}
protected override void OnPaint(PaintEventArgs e)
{
LinearGradientBrush brush = new LinearGradientBrush(ClientRectangle, Color.Yellow, Color.Blue, 10);
e.Graphics.FillRectangle(brush, 0, 0, stringSize.Width, stringSize.Height);
}
//Чтобы наше окно можно было "тягать" мышью, "скажем" системе что вся его область является заголовком,
//захватив который, как известно, можно перемещать окно
const int WM_NCHITTEST = 0x0084;
const int HTCAPTION = 2;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_NCHITTEST)
{
m.Result = (IntPtr)HTCAPTION;
return;
}
base.WndProc(ref m);
}
}