Получить направление прокрутки другого окна / приложения - PullRequest
0 голосов
/ 14 ноября 2018

Я хочу определить направление прокрутки другого приложения.Я могу сделать это, если пользователь прокручивает колесо мыши или клавиатуру (клавиши вверх / вниз / влево / вправо) через крючки.Но я не могу захватить то же самое, когда пользователь использует полосы прокрутки, присутствующие в приложениях, таких как Chrome.

Я пробовал ниже нативный метод, но он не работает для многих приложений, таких как Chrome, и работает для Notepad ++, так как он не может обнаружить полосы прокрутки для Chrome.Я хочу что-то, что работает для всех приложений.

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetScrollInfo(IntPtr hwnd, int fnBar, ref SCROLLINFO lpsi);

Я провел небольшое исследование, но не смог найти ничего, что могло бы дать мне указания, по которым листается страница.Пожалуйста, дайте мне знать, если требуется дополнительная информация.

Обновление:

Я пытаюсь использовать UI Automation для получения информации о полосе прокрутки для Chrome.

Вот как?

Я создал коллекцию прямоугольников Gui для окон, используя EnumChildWindows, которая также извлекала дочерние элементы управления.Основываясь на положении мыши, выберите дескриптор окна, чей прямоугольник Gui содержит мою позицию мыши.Дескриптор, который я получил, имел клиентскую область Gui Rectangle = chrome.

Проблема:

Ниже приведен код.И это дает мне пустую коллекцию в elementCollection в случае Chrome и успешно возвращает 2 элемента полосы прокрутки в случае Notepad ++.

var element = AutomationElement.FromHandle(handle);
if(element != null)
{
    Condition condition = 
       new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.ScrollBar);

    // Find all children that match the specified conditions.
    AutomationElementCollection elementCollection =
        element.FindAll(TreeScope.SubTree, condition);
 }

1 Ответ

0 голосов
/ 14 ноября 2018

Что вам нужно сделать, это вызвать метод GetScrollInfo дважды и сравнить эти значения, чтобы выяснить это;прокручивается ли элемент управления и вычислять (предыдущий <текущий) </em> направление.Вам нужно повторять этот процесс до тех пор, пока вы хотите следить за направлением прокрутки.

Теперь вам нужно создать какой-то рабочий класс для удобной обработки, для целей этого вопроса я использовал простойКонсольное приложение, которое опрашивает структуру дескриптора SCROLLINFO, используя цикл while:

static void Main(string[] args)
{
    var handle = (IntPtr)0x35087C; // notepad textbox handle

    var prevInfo = default(SCROLLINFO);
    int iterations = 1000;

    while (iterations > 0)
    {
        var curInfo = new SCROLLINFO();
        curInfo.cbSize = Marshal.SizeOf(curInfo);
        curInfo.fMask = (int)ScrollInfoMask.SIF_ALL;

        if (GetScrollInfo(handle, (int)ScrollBarDirection.SB_VERT, ref curInfo))
        {
            var dir = curInfo.nPos < prevInfo.nPos ? "Up" : "Down";
            dir = curInfo.nPos == prevInfo.nPos ? "Unchanged" : dir;

            Console.WriteLine(dir);

            prevInfo = curInfo;
        }
        else
        {
            Console.WriteLine($"No scrolling.. {Marshal.GetLastWin32Error()}");
        }

        System.Threading.Thread.Sleep(100);
        iterations--;
    }

    Console.ReadLine();
}

Обратите внимание, что переменная handle содержит указатель на текстовое поле процесса блокнота (который НЕ является тем же самым)как дескриптор к процессу блокнота).Я использовал WinSpy ++ для извлечения дескриптора из процесса блокнота.

Я использовал страницу GetScrollInfo MSDN , чтобы прочитать о самом вызове API, GetScrollInfo Страница Pinvoke.NET для получения всех необходимых структур / перечислений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...