Сохранение ориентации на форму - PullRequest
0 голосов
/ 03 марта 2011

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

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

Мне нужен способ выполнить одно или несколько из следующих действий:

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

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

1 Ответ

3 голосов
/ 03 марта 2011

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

    [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);
...