Полагаю, правильный ответ - запустить собственный насос сообщений.Я скопировал следующий код из блога BenPas (ранее по адресу http://blog.xeviox.com),, который я мог найти только в кеше Google - ссылка на страницу была мертвой. Но я проверил код, и он работает.
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public int X;
public int Y;
public POINT(int x, int y)
{
this.X = x;
this.Y = y;
}
public static implicit operator System.Drawing.Point(POINT p)
{
return new System.Drawing.Point(p.X, p.Y);
}
public static implicit operator POINT(System.Drawing.Point p)
{
return new POINT(p.X, p.Y);
}
}
[StructLayout(LayoutKind.Sequential)]
public struct MSG
{
public IntPtr hwnd;
public UInt32 message;
public IntPtr wParam;
public IntPtr lParam;
public UInt32 time;
public POINT pt;
}
[DllImport("coredll.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetMessage(out MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin,
uint wMsgFilterMax);
[DllImport("coredll.dll")]
public static extern bool TranslateMessage([In] ref MSG lpMsg);
[DllImport("coredll.dll")]
public static extern IntPtr DispatchMessage([In] ref MSG lpmsg);
Вот как вы можете использовать его для создания цикла сообщений:
[MTAThread]
static void Main()
{
HiddenForm f = new HiddenForm();
MSG msg;
while(GetMessage(out msg, IntPtr.Zero, 0, 0))
{
TranslateMessage(ref msg);
DispatchMessage(ref msg);
}
}
С вышеупомянутыми сообщениями таймера и обратными вызовами на основе Windows, но окно не отображается, и там ничего не добавленона панель задач.