Получите Выделенный текст из любого окна с помощью C#

Как считать Выделенный/выделенный текст из любого окна с помощью c#.

я попробовал 2 подхода.

  1. Отправьте "^c" каждый раз, когда пользователь выбирает некоторую вещь. Но в этом случае мой буфер обмена лавинно рассылается большим количеством ненужных данных. Когда-то это скопировало пароли также.

таким образом, я переключил свой подход к 2-му методу, отправьте метод сообщения.

см. этот пример кода

 [DllImport("user32.dll")]
    static extern int GetFocus();

    [DllImport("user32.dll")]
    static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);

    [DllImport("kernel32.dll")]
    static extern uint GetCurrentThreadId();

    [DllImport("user32.dll")]
    static extern uint GetWindowThreadProcessId(int hWnd, int ProcessId);    

    [DllImport("user32.dll") ]
    static extern int GetForegroundWindow();

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    static extern int SendMessage(int hWnd, int Msg, int wParam, StringBuilder lParam);     

   // second overload of SendMessage

    [DllImport("user32.dll")]
    private static extern int SendMessage(IntPtr hWnd, uint Msg, out int wParam, out int lParam);

    const int WM_SETTEXT = 12;
    const int WM_GETTEXT = 13;     

private string PerformCopy()
    {
        try
        {
            //Wait 5 seconds to give us a chance to give focus to some edit window,
            //notepad for example
            System.Threading.Thread.Sleep(5000);
            StringBuilder builder = new StringBuilder(500);

            int foregroundWindowHandle = GetForegroundWindow();
            uint remoteThreadId = GetWindowThreadProcessId(foregroundWindowHandle, 0);
            uint currentThreadId = GetCurrentThreadId();

            //AttachTrheadInput is needed so we can get the handle of a focused window in another app
            AttachThreadInput(remoteThreadId, currentThreadId, true);
            //Get the handle of a focused window
            int focused = GetFocus();
            //Now detach since we got the focused handle
            AttachThreadInput(remoteThreadId, currentThreadId, false);

            //Get the text from the active window into the stringbuilder
            SendMessage(focused, WM_GETTEXT, builder.Capacity, builder);

            return builder.ToString();
        }
        catch (System.Exception oException)
        {
            throw oException;
        }
    }

этот код, хорошо работающий в Блокноте. Но если я пытаюсь получить от другого приложения как Mozilla Firefox или Visual Studio IDE, он не возвращает текст.

Кто-либо может помочь мне, где я делаю неправильно? В первую очередь, я выбрал правильный подход?

5
задан Dinesh 4 May 2010 в 07:31
поделиться

1 ответ

Это потому, что и Firefox, и Visual Studio не используют встроенные элементы управления Win32 для отображения / редактирования текста.

В целом невозможно получить значение «любого» выделенного текста из-за того, что программы могут повторно реализовать свою собственную версию элементов управления Win32 любым способом, который они видят. подходят, и ваша программа не может рассчитывать на работу со всеми из них.

Однако вы можете использовать UI Automation API, которые позволят вам взаимодействовать с большинством сторонних элементов управления (по крайней мере, со всеми хорошими, такими как Visual Studio и Firefox - скорее всего, будут работать с API автоматизации пользовательского интерфейса, поскольку это требование доступности)

3
ответ дан 15 December 2019 в 06:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: