如何判断另一个程序中可编辑的文本框内的文字处于部分或者全部选择的状态。

xiangzi119 2014-07-03 05:50:10
当某个程序的文本框中的文字处于部分文字或者全部文字选中状态时,如何检出?

之前写了一段程序,检测是否有程序处于文字输入状态。
当时只考虑了获得激活窗体handle,并判断其光标(插入符)状态,
当没有文字被选择时,用下面的方法可以判断。

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,则表示当前窗体处于可输入状态。


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


另外,
现在用sendmessage发送em_getsel实现了普通控件上的选择文字的取得。比如在地址栏,记事本,等。
但是关键的我要用的地方取不到。
比如在Microsoft Visual Studio的编辑框里。
哪位大神指导一下哈。
...全文
203 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiangzi119 2014-07-07
  • 打赏
  • 举报
回复
得到了解决。 分享一下方案。 文字未被选择的情况下,winform程序和wpf程序都可以用GetGUIThreadInfo的hwndCaret来判断,是否是处于获得插入符的输入状态。 在文字有被选择的情况下,对于winform程序依然可以用上述方法判断。 对于wpf程序,要用到下面的类来判断。 System.Windows.IInputElement inputElement = System.Windows.Input.Keyboard.FocusedElement; 之后再将inputElement转换成TextBox和RichTextBox,然后判断他的IsReadOnly和IsEnabled的属性。

                if (GetGUIThreadInfo(uiThreadid, ref stLpGui) == true)
                {
                    if (stLpGui.hwndCaret != IntPtr.Zero)
                    {
                        //返回值 = 输入状态!
                    }
                    else
                    {
                        //返回值 = 非输入状态!
                        System.Windows.IInputElement inputElement = System.Windows.Input.Keyboard.FocusedElement;
                        if (inputElement != null)
                        {
                            if (inputElement is System.Windows.Controls.TextBox)
                            {
                                if (((System.Windows.Controls.TextBox)inputElement).IsReadOnly == false && ((System.Windows.Controls.TextBox)inputElement).IsEnabled == true)
                                {
                                    //返回值 = 输入状态!
                                }
                            }
                            else if (inputElement is RichTextBox)
                            {
                                if (((System.Windows.Controls.RichTextBox)inputElement).IsReadOnly == false && ((System.Windows.Controls.RichTextBox)inputElement).IsEnabled == true)
                                {
                                    //返回值 = 输入状态!
                                }
                            }
                        }
                    }
                }
xiangzi119 2014-07-04
  • 打赏
  • 举报
回复
引用 3 楼 tcmakebest 的回复:
能够想到这么复杂的逻辑,楼主不容易啊,看样子不是代码的问题啊,既然有的控件上有效,有的控件上无效,那应该是控件的问题,通过消息操作控件是很原始的控件了吧,这问题有点悬
控件都没有问题,因为都是别的程序上的控件,我感现在觉关键就是要想办法取到控件。 可惜想不出啊想不出。。。
tcmakebest 2014-07-03
  • 打赏
  • 举报
回复
能够想到这么复杂的逻辑,楼主不容易啊,看样子不是代码的问题啊,既然有的控件上有效,有的控件上无效,那应该是控件的问题,通过消息操作控件是很原始的控件了吧,这问题有点悬
xiangzi119 2014-07-03
  • 打赏
  • 举报
回复
引用 1 楼 libinguest 的回复:
改用richtextbox吧
多谢,但是。。。 不明白你的意思,另一个程序上的控件类型是未知的。只要是可以输入文字的控件,都肯那个是我判断的对象。 正如前面提到的,其实我就是想判断当前是否处于可以输入文字的状态,如果是的话,就正常输入文字, 如果不是处于文字输入状态,则会启动自定义的键盘钩子,响应其他处理。
风之影子 2014-07-03
  • 打赏
  • 举报
回复
改用richtextbox吧

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧