【问题标题】:Maintaining focus on a form保持对表单的关注
【发布时间】:2011-03-03 16:15:40
【问题描述】:

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

我找到了一种方法,即使在软件不在焦点时也可以挂接键盘键,但我不认为这是一种解决方案。

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

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

【问题讨论】:

    标签: c# focus accessibility keyboard-shortcuts startup


    【解决方案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);
    

    【讨论】:

    • 非常感谢您的回答。如果您能解释代码,我将不胜感激,它与将我的程序添加到启动有什么不同?如果可以为 Windows 服务应用程序添加一个示例。再次感谢
    • 好吧,你写道:当计算机启动时,程序在启动菜单中,但由于某种原因,程序被激活而不是焦点。主要区别在于方法 SetFocus 将聚焦您的应用程序,您只需将“calc”替换为您的 .exe 文件路径,例如。 “C:\\myprog.exe”。我可能会帮助您编写代码,但我需要知道您使用的是哪个版本的 VS/.NET Framework?
    • 再次感谢,我正在使用 VS 2010 和 .NET 4
    猜你喜欢
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 2019-05-06
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多