Да уж, пришлось изрядно повозиться чтобы найти более-менее приемлемое для меня решение.
Вот код, может кому ещё пригодится:
PaletteSet ps; // моя палетка
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
const int WM_LBUTTONDOWN = 513;
const int WM_LBUTTONUP = 514;
[DllImport("user32.dll", SetLastError = true)]
static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
...
AcAp.PreTranslateMessage += AcAp_PreTranslateMessage;
void AcAp_PreTranslateMessage(object sender, PreTranslateMessageEventArgs e)
{
if (e.Message.message == WM_LBUTTONDOWN ||
e.Message.message == WM_LBUTTONUP)
{
RECT rct = new RECT();
GetWindowRect(ps.Handle, ref rct);
Point location = new Point(rct.Left, rct.Top);
Rectangle rec = new Rectangle(location, ps.Size);
if (!rec.Contains(new Point(e.Message.pt_x, e.Message.pt_y)))
{
// здесь завершаю редактирование в TextBox
}
}
}
Суть в том чтобы отследить щелчок мышки за пределами палетки и закончить редактирование TextBox на палетке
Можно было бы обойтись без WinAPI функции GetWindowRect если бы ps.Location всегда выдавал координаты верхнего левого угла,
но блин это свойство зависит от того плавающая ли палетка или закрепленная и к какой стороне прикреплена!
Спасибо всем за помощь.