- Регистрация
- 24.08.2013
- Сообщения
- 1 124
- Благодарностей
- 625
- Баллы
- 113
Кликаем на сайте кнопку Copy/Скопировать и получаем результат сразу в переменную.
Буфер Windows при этом не затрагивается, все происходит внутри броузера/инстанса (Chromium).
Можно применять в мультипоточных шаблонах zenno.
Пример кода:
п.с. На форуме много всяких старых решений и все затрагивают буфер Windows, что нежелательно.
Буфер 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);
}


