Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get text from inside google chrome using my c# app

I am writing a small app that will among other things expand shortcuts into full text while typing. example: the user writes "BNN" somewhere and presses the relevant keyboard combination, the app would replace the "BNN" with a "Hi I am Banana".

after some research i learned that it can be done using user32.dll and the process of achieving this task is as follows:

1) get the active window handle
2) get the active window thread handle
3) attach input to active thread
4) get focused control handle (+caret position but that is not the issue)
5) detach input from active thread
6) get the text from the focused control using its handle

and here is my code so far:

try
{
    IntPtr activeWindowHandle = GetForegroundWindow();
    IntPtr activeWindowThread = GetWindowThreadProcessId(activeWindowHandle, IntPtr.Zero);
    IntPtr thisWindowThread = GetWindowThreadProcessId(this.Handle, IntPtr.Zero);
    AttachThreadInput(activeWindowThread, thisWindowThread, true);
    IntPtr focusedControlHandle = GetFocus();

    AttachThreadInput(activeWindowThread, thisWindowThread, false);
    if (focusedControlHandle != IntPtr.Zero)
    {
        TB_Output.Text += focusedControlHandle + " , " + GetText(focusedControlHandle) + Environment.NewLine;
    }
}
catch (Exception exp)
{
    MessageBox.Show(exp.Message);
}

//...
//...

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
internal static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern int GetWindowThreadProcessId(int handle, out int processId);

[DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
internal static extern int AttachThreadInput(IntPtr idAttach, IntPtr idAttachTo, bool fAttach);

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
internal static extern IntPtr GetFocus();

this works perfectly for some windows forms apps but it doesnt work with WPF nor browsers, just gives me the title of the WPF app or the title of the tab in chrome.

if i run the app on this page while typing this question for instance, instead of the content of the question, the text i get is:

Get text from inside google chrome using my c# app - Stack Overflow - Google

probably because they use graphics to render the elements, and im not sure how i can get to the active element and read it's text.

i only referred to web browsers in the question's title because this tool will be mostly used with web browsers.

thank you in advance for any feedback.

like image 288
Banana Avatar asked Apr 24 '18 13:04

Banana


People also ask

How do I select text in Google Chrome?

On Chromebook, the keyboard shortcut is Ctrl + Search + 7, or Ctrl + Launcher + 7.

How do I get Google Chrome to read to me?

To use Read Aloud, navigate to the web page you want to read, then click the Read Aloud icon on the Chrome menu. In addition, the shortcut keys ALT-P, ALT-O, ALT-Comma, and ALT-Period can be used to Play/Pause, Stop, Rewind, and Forward. You may also select the text you want to read before activating the extension.


2 Answers

I would personally attempt to create a library which chrome prefers. There are many available such as Kantu, which is specialized for Chrome.

Examples: TestCafe, Watir, SlimerJS

like image 58
foyss Avatar answered Sep 20 '22 13:09

foyss


I think that library is not the optimal way to do what you want. I would use a library more suited to browser DOM manipulation, like Selenium.

like image 44
Dan Csharpster Avatar answered Sep 19 '22 13:09

Dan Csharpster