Получаем буфер обмена в броузере (внутри instance)

kagorec

Client
Регистрация
24.08.2013
Сообщения
1 124
Благодарностей
624
Баллы
113
Кликаем на сайте кнопку Copy/Скопировать и получаем результат сразу в переменную.
Буфер Windows при этом не затрагивается, все происходит внутри броузера/инстанса (Chromium).

Можно применять в мультипоточных шаблонах zenno.

Пример кода:
C#:
// 1. Ультимативный JS-перехватчик до клика
string jsHook = @"
    window.zpCapturedText = '';

    // Способ А: Перехват современного API (блокирует доступ к Windows)
    if (navigator && navigator.clipboard) {
        navigator.clipboard.writeText = function(text) {
            window.zpCapturedText = text;
            return Promise.resolve(); // Имитируем успех, ОС ничего не получит
        };
    }

    // Способ Б: Перехват события копирования (e.preventDefault() блокирует Windows)
    document.addEventListener('copy', function(e) {
        e.preventDefault();
        var text = window.getSelection().toString();
        if (!text && document.activeElement) {
            text = document.activeElement.value;
        }
        if (text) window.zpCapturedText = text;
    });

    // Способ В: Перехват старого execCommand (глушим выполнение)
    var originalExec = document.execCommand;
    document.execCommand = function(commandId, showUI, value) {
        if (commandId.toLowerCase() === 'copy') {
            var text = window.getSelection().toString();
            if (!text && document.activeElement) {
                text = document.activeElement.value;
            }
            if (text) window.zpCapturedText = text;
            return true; // Возвращаем true, НЕ ВЫЗЫВАЯ настоящую команду браузера!
        }
        return originalExec.apply(this, arguments);
    };
";
instance.ActiveTab.MainDocument.EvaluateScript(jsHook);

// 2. Кликаем по кнопке (сайт думает, что скопировал, но текст остался в нашей переменной)
string xpath = $"//span[text()='Copy']"; // Замените на свой XPATH
instance.ActiveTab.MainDocument.FindElementByXPath(xpath, 0).Click();

// 3. Забираем значение из JS-переменной браузера в переменную проекта
for (int i = 0; i < 40; i++)
{
    string captured = instance.ActiveTab.MainDocument.EvaluateScript("return window.zpCapturedText;");
  
    if (!string.IsNullOrEmpty(captured) && captured != "null" && captured != "undefined")
    {
        project.Variables["bufer"].Value = captured;
        break;
    }
    System.Threading.Thread.Sleep(50);
}
п.с. На форуме много всяких старых решений и все затрагивают буфер Windows, что нежелательно.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)