Automate This
Automate This

Reputation: 31364

Get selected text from any application by means of another applicaiton

I'm working on a concept that works like copy & paste but uses my own algorithm instead of using the clipboard.

We have users that use many different programs that contain part numbers. This is how my concept would work.

  1. User highlights part number from any application (word, excel, pdf, JDE, etc)
  2. Either by hotkey or clicking on another application the user launches my routine.
  3. My routine grabs that text from the original application and processes it accordingly.

I know how to use the clipboard to get text.

What I'm not sure of is how to get currently selected text from the application that was active prior to running my code? Do I need to force my user to copy to clipboard first and then run my app or can I create my own copy/paste type windows add-in?

Preferred VB for this but can also use C++ or C# if easier.


As to the question why, because we want to the action to be seamless to the user. There will be several behind the scenes actions that take place and then the user will be presented a browser with pertinent information related to that part number. Ultimately, I don't want an in-between screen to pop up, but rather completely hidden from the user. If I require them to copy and then run my routine then I'm adding in one extra step to the user path that I'm hoping to avoid.

I looked into right click menu context a bit but found that each program can have their own override. I wasn't able to locate a way to globally override all right click context menus to include a new action.

Upvotes: 1

Views: 1682

Answers (1)

TheEvilPenguin
TheEvilPenguin

Reputation: 5672

From this article:

var element = AutomationElement.FocusedElement;

if (element != null)
{
    object pattern;
    if (element.TryGetCurrentPattern(TextPattern.Pattern, out pattern))
    {
        var tp = (TextPattern) pattern;
        var sb = new StringBuilder();

        foreach (var r in tp.GetSelection())
        {
            sb.AppendLine(r.GetText(-1));
        }

        var selectedText = sb.ToString();
    }
}

It's in C# but it should be pretty trivial to translate.

Upvotes: 3

Related Questions