Сохранение фокуса на форме

Я разрабатываю программу для незрячих на C# .NET.
Программа работает только с клавиатурой и голосовым управлением.
При запуске компьютера программа находится в меню запуска, но почему-то программа активируется не в фокусе, поэтому она не работает должным образом, пока фокус не будет перенесен на нее.

Я нашел способ перехватывать клавиши клавиатуры, даже когда программа не находится в фокусе, но я не вижу в этом решения.

Мне нужен способ сделать одно или несколько из следующего:

  1. Убедитесь, что программа загружается при запуске и находится в фокусе.
  2. Сосредоточьтесь на программе (этот компьютер будет работать только с этой программой).
  3. найдите сочетание клавиш, желательно только одну клавишу (не Alt + Tab), чтобы вернуть фокус программе.

Был бы признателен за любую помощь.


person CaptainNemo    schedule 03.03.2011    source источник


Ответы (1)


Есть много способов решить эту проблему, например, вы можете запустить консольное приложение запуска, которое будет запускать и фокусировать вашу программу:

    [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);
person Silx    schedule 03.03.2011
comment
Большое спасибо за ответ. Буду признателен, если объясните код, чем он отличается от добавления моей программы в автозагрузку? И если можно добавить пример для приложения службы windows. Спасибо еще раз - person CaptainNemo; 03.03.2011
comment
Ок Вы писали: При запуске компа программа находится в стартовом меню, но почему-то активируется программа не в фокусе. Основное отличие заключается в том, что метод SetFocus сфокусирует ваше приложение, вам просто нужно заменить calc на путь к файлу .exe, например. C:\\myprog.exe. Я могу помочь вам с кодом, но мне нужно знать, какую версию VS/.NET Framework вы используете? - person Silx; 03.03.2011
comment
Еще раз спасибо, я использую VS 2010 и .NET 4. - person CaptainNemo; 03.03.2011