C# 如何判断文本框是否集中在操作系统中?

C# 如何判断文本框是否集中在操作系统中?,c#,C#,我需要编程一个键盘,带有一些配置和定制。 我需要将其配置为启用,如果任何文本区域在键盘前被聚焦。 我主要需要知道选择了什么控件 键盘是一个独立的应用程序,因此它不能仅仅通过访问操作系统直接处理控件 为了得到更多的解释,我将告诉你这个场景: 用户运行键盘应用程序,该应用程序的“最顶端”已设置,ShowInTaskBar未设置,键盘被禁用 用户单击窗口中的任何文本控件,如Microsoft Word或Paint中的记事本或文本框,然后在单击键盘后,启用该应用程序 用户单击键盘应用程序及其按键,在步骤

我需要编程一个键盘,带有一些配置和定制。 我需要将其配置为启用,如果任何文本区域在键盘前被聚焦。 我主要需要知道选择了什么控件

键盘是一个独立的应用程序,因此它不能仅仅通过访问操作系统直接处理控件

为了得到更多的解释,我将告诉你这个场景:

  • 用户运行键盘应用程序,该应用程序的“最顶端”已设置,
    ShowInTaskBar
    未设置,键盘被禁用
  • 用户单击窗口中的任何文本控件,如Microsoft Word或Paint中的记事本或文本框,然后在单击键盘后,启用该应用程序

  • 用户单击键盘应用程序及其按键,在步骤2中选择的文本框上写入文本。请注意,上一个文本框将失去焦点,但键盘仍将启用


  • 您可以尝试使用
    聚焦属性

    foreach (var control in this.Controls)
    {
        if (control.Focused)
        {
              ....
            }
    }
    

    链接:

    您将需要两个windows API函数

    GetActiveWindow(void); GetWindowClass()

    第一个将为您提供活动窗口(聚焦窗口),第二个将让您知道它是否是文本窗口

    您将需要更多函数sendmessage(…)来获取窗口的当前文本以及设置文本


    更多关于windows API。

    搜索插入符号位置很容易,因为它应该大于0

        GUITHREADINFO lpgui = new GUITHREADINFO();
        IntPtr fore = GetForegroundWindow();
        uint tpid = GetWindowThreadProcessId(fore, IntPtr.Zero);
        lpgui.cbSize = Marshal.SizeOf(lpgui.GetType());
        bool flag = GetGUIThreadInfo(tpid, out lpgui);
        WINDOWINFO pwi = new WINDOWINFO();
        pwi.cbSize = (uint)Marshal.SizeOf(pwi.GetType());
        GetWindowInfo((IntPtr)lpgui.hwndCaret, ref pwi);
    
        if (flag)
        {
            if (!(lpgui.rcCaret.Location.X == 0 && lpgui.rcCaret.Location.Y == 0))
            {
    
    
                //TODO
    
            }
        }
    

    听起来你可能想成为你的客户。不幸的是,这是一个相当大的话题,不适合深入讨论。但它可以让你倾听焦点事件,询问控制类型,等等。@Damien_不信者,谢谢你为我提供了我需要的东西,然而,正如你所说,这是一个巨大的话题,我的头真的开始被吹走了。。我将搜索更多关于UI自动化的信息。msdn提供的示例工作正常,因此当焦点发生变化时,我可以得到通知,但仍然无法获得更多信息。非常感谢,一旦完成,我将发布它。您不必太担心。虽然这是UI自动化的一个主题,但您需要的是一件非常简单的事情,而且您应该能够更加努力地完成它。@MurtuzaKabul,问题是我找不到那件简单的事情,我所拥有的只是整数,它们的大多数值都是零!!:(如果您在同一个应用程序中运行,则此选项有效。OP已指示他们的应用程序正在查找内部发生的焦点,例如Word或Paint。感谢您的回复,我使用了此“[DllImport(“user32.dll”)]static extern IntPtr GetActiveWindow()“但是GetActiveWindow总是返回一个零值,我不知道如何很好地处理这些东西,我不熟悉api和钩子。非常感谢,你不需要使用钩子,只需要使用api。我建议你去pinvoke.net,找到函数的正确声明。你可能会经常遇到api作为.ne的问题t类型和api类型是不同的。此外,api采用不同的处理方法。您会发现api函数有输入和输出参数,大多数情况下,返回值将指示成功或失败。-所以继续尝试。