Существует множество способов решения этой проблемы, например, вы можете запустить приложение консоли запуска, которое будет запускать и фокусировать вашу программу:
[STAThread]
static void Main(string[] args)
{
System.Diagnostics.Process myProcess = new System.Diagnostics.Process();
myProcess.StartInfo.FileName = "calc";
myProcess.Start();
IntPtr hWnd = myProcess.Handle;
SetFocus(new HandleRef(null, hWnd));
}
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr SetFocus(HandleRef hWnd);
Вы можете разместить приложение-службу Windows и использовать проверку таймера, если ваше приложениежив и сфокусирован, или вы можете использовать горячие клавиши, чтобы вернуть его в фокус: http://www.codeproject.com/KB/miscctrl/ashsimplehotkeys.aspx
Отредактировано
это консольное приложение, которое будет поддерживать ваше приложение живым и сфокусированным (протестированным).Мне нужно найти обходной путь для службы Windows, потому что Vista что-то изменилось, и форма невидима при взгляде из службы: P
static Process myProcess;
[STAThread]
static void Main(string[] args)
{
for (int i = 0; i < 10000; i++)
{
//count how many procesess with this name are active if more than zero its still alive
Process[] proc = Process.GetProcessesByName("myprog");
if (proc.Length > 0)
{
//its alive check if it has focus
if (proc[0].MainWindowHandle != GetForegroundWindow())
{
SetFocus(proc[0].MainWindowHandle);
}
}
//no process start new one and focus on it
else
{
myProcess = new Process();
myProcess.StartInfo.FileName = "C:\\aa\\myprog.exe";
myProcess.Start();
SetFocus(myProcess.Handle);
}
Thread.Sleep(1000);
}
}
private static void SetFocus(IntPtr handle)
{
SwitchToThisWindow(handle, true);
}
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll", SetLastError = true)]
public static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);