В WinForms это решается созданием класса-наследника от TextBox, отправлающего самому себе сообщение EM_SETCUEBANNER :
using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.InteropServices;
class CueTextBox : TextBox
{
[Localizable(true)]
public string Cue
{
get { return mCue; }
set { mCue = value; updateCue(); }
}
private void updateCue()
{
if (this.IsHandleCreated && mCue != null)
{
SendMessage(this.Handle, 0x1501, (IntPtr)1, mCue);
}
}
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
updateCue();
}
private string mCue;
// PInvoke
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, string lp);
}
Добавляете этот класс в проект, компилируете, потом бросаете CueTextBox из Toolbox на форму и задаете свойство Cue. В остальном он ведет себя так же, как стандартный TextBox.