当某个文本框处于文字选中状态时如何检测当前处于输入状态

时间:2022-08-23 17:01:41
当某个程序的文本框中的文字处于部分文字或者全部文字选中状态时如何检测当前处于输入状态?

之前写了一段程序,检测是否有程序处于文字输入状态。
当时只考虑了获得激活窗体handle,并判断其光标状态,
当文字未选择时,运行OK。
用的方法是:

          IntPtr hWnd = GetForegroundWindow();

            uint processId;
            uint threadid = GetWindowThreadProcessId(hWnd, out processId);

            GUITHREADINFO lpgui = new GUITHREADINFO();
            lpgui.cbSize = Marshal.SizeOf(lpgui);

            if (GetGUIThreadInfo(threadid, ref lpgui))
            {
                if (lpgui.hwndCaret != 0)
                {
                    return hWnd;
                }
            }

如上面代码所示

首先我们通过 GetForegroundWindows API 得到当前窗体的句柄。然后我们再通过 GetGUIThreadInfo 得到当前窗体的一些属性。这些属性在 GUITHREADINFO 中定义
       public struct GUITHREADINFO
        {
            public int cbSize;
            public int flags;
            public int hwndActive;
            public int hwndFocus;
            public int hwndCapture;
            public int hwndMenuOwner;
            public int hwndMoveSize;
            public int hwndCaret;
            public System.Drawing.Rectangle rcCaret;
        }
上面是 GUITHREADINFO 结构。我们可以通过这个信息得到当前窗体中当前焦点的子窗口句柄,当前获得光标的子窗口句柄,当前正激活的子窗体句柄等等。这里我们只要用到当前获得光标的子窗口句柄,就是 hwndCaret 。如果hwndCaret 不为0,则表示当前窗体处于可输入状态。


但是当状态为文字选择时,上面方法就判断不了了。
希望能得到解决方法。

10 个解决方案

#1


up up up 谢谢!

#2


都看球去了?没人解答啦~~~~

#3


那你再判断是否是选择状态啊。

#4


引用 3 楼 jianwen0529 的回复:
那你再判断是否是选择状态啊。


能提示用什么方法吗?

#5


anybody?????

#6


继续顶,谢谢!

#7


奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中!

#8


引用 7 楼 zhao4zhong1 的回复:
奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中!
当某个文本框处于文字选中状态时如何检测当前处于输入状态

#9


还是没有解决,有大内高手不?

试图用sendmessage来发送EM_GETSEL消息,但是没有办法得到当前拥有caret的控件句柄。

也试图用窗体句柄得到窗体对象,通过activecontrol来逐个控件判断,但是没有找到有什么方法可以用句柄得到窗体对象。
PS:FromHandle试过了,在我们这个系统里取不到。

还有一个方法也在想法是,用GetCaretPos来获得光标的坐标,通过这个坐标得到控件句柄。但是怎样从坐标转成控件呢?

谁能有可行的方法吗?谢谢啦!

#10


up up up up up up up up up 

#1


up up up 谢谢!

#2


都看球去了?没人解答啦~~~~

#3


那你再判断是否是选择状态啊。

#4


引用 3 楼 jianwen0529 的回复:
那你再判断是否是选择状态啊。


能提示用什么方法吗?

#5


anybody?????

#6


继续顶,谢谢!

#7


奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中!

#8


引用 7 楼 zhao4zhong1 的回复:
奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中!
当某个文本框处于文字选中状态时如何检测当前处于输入状态

#9


还是没有解决,有大内高手不?

试图用sendmessage来发送EM_GETSEL消息,但是没有办法得到当前拥有caret的控件句柄。

也试图用窗体句柄得到窗体对象,通过activecontrol来逐个控件判断,但是没有找到有什么方法可以用句柄得到窗体对象。
PS:FromHandle试过了,在我们这个系统里取不到。

还有一个方法也在想法是,用GetCaretPos来获得光标的坐标,通过这个坐标得到控件句柄。但是怎样从坐标转成控件呢?

谁能有可行的方法吗?谢谢啦!

#10


up up up up up up up up up