保持对表单的关注

时间:2011-03-03 16:15:41

标签: c# focus keyboard-shortcuts startup blind

我正在为C#.NET中的盲人开发一个软件 该软件仅适用于键盘和语音转换 当计算机启动时,程序位于启动菜单中,但由于某种原因,程序被激活而不是焦点,因此除非重点转移到程序,否则它无法正常工作。

我找到了一种挂钩键盘键的方法,即使软件没有聚焦,但我不认为这是一种解决方案。

我想要一种方法来执行以下一项或多项操作:

  1. 确保程序在启动时加载并处于焦点。
  2. 保持对程序的关注(此计算机仅使用此程序运行)。
  3. 找到一个键盘快捷键,最好只有一个键(不是 Alt + Tab )将焦点返回给程序。
  4. 非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

有很多方法可以解决这个问题,即您可以在启动控制台上运行并运行您的程序:

    [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服务的walkaround因为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);