Здравствуйте, senglory, Вы писали:
S>Здравствуйте, Sinix, Вы писали:
S>>Гуглить на тему accessibility и ui authomation. S>Не помогает совладеть с Opera & Excel. Как быть?
А если так?
Вызываешь WindowFromPoint которая тебе вернет хендл окна. После этого и забираешь тект через
SendMessage с EM_GETSEL или EM_GETSELTEXT
Здравствуйте, Sorantis, Вы писали:
S>Здравствуйте, senglory, Вы писали:
S>>Здравствуйте, Sinix, Вы писали:
S>>>Гуглить на тему accessibility и ui authomation. S>>Не помогает совладеть с Opera & Excel. Как быть?
S>А если так? S>Вызываешь WindowFromPoint которая тебе вернет хендл окна. После этого и забираешь тект через S>SendMessage с EM_GETSEL или EM_GETSELTEXT
Здравствуйте, senglory, Вы писали:
S>Здравствуйте, Sorantis, Вы писали:
S>>Здравствуйте, senglory, Вы писали:
S>>>Здравствуйте, Sinix, Вы писали:
S>>>>Гуглить на тему accessibility и ui authomation. S>>>Не помогает совладеть с Opera & Excel. Как быть?
S>>А если так? S>>Вызываешь WindowFromPoint которая тебе вернет хендл окна. После этого и забираешь тект через S>>SendMessage с EM_GETSEL или EM_GETSELTEXT
S>IE не обрабатывет их (((((((
ну-ка курни сюда, может подойдет. Код на Дельфи, но апишный,проблем не будет перевести.
Здравствуйте, senglory, Вы писали:
S>Есть какой-нибудь способ это сделать? Желательно для окон в IE & Opera. И без интеграции в них.
Можно через WM_COPY, но у меня, например, этот способ не работает с Opera и Emacs.
Поэтому сейчас я использую код наподобие этого (ещё SetForegroundWindow перед процедурой можно поставить):
std::string const selectionContents ( int const waitTime ) {
struct Input : public INPUT {
Input ( WORD const key, bool const up = false ) {
type = INPUT_KEYBOARD;
KEYBDINPUT input = { key, MapVirtualKey ( key, 0 ), ( up ? KEYEVENTF_KEYUP : 0 ), 0, 0 };
ki = input;
}
};
INPUT events[] = {
Input ( VK_CONTROL ),
Input ( VK_INSERT ),
Input ( VK_INSERT, true ),
Input ( VK_CONTROL, true )
};
SendInput ( Tools::length_of_array ( events ), events, sizeof ( INPUT ) );
Sleep ( waitTime ); // задержка на некоторое время - позволяем окну за это время скопировать содержимое выделения в буфер обмена
// (по-крайней мере, Code::Blocks делает это не мгновенно, а WaitForInputIdle для него возвращает управление до копирования).return clipboardContents (); // clipboardContents () возвращает строку с содержимым буфера обмена, реализация тривиальна
}
Emacs, правда, жалуется на "<C-kp-insert> is undefined", но в буфер обмена копирует
Т.е. посылаем окну нажатие клавиш Ctrl+Insert (нажали Ctrl, нажали Insert, отпустили Ctrl, отпустили Insert). Почему Ctrl+Insert, а не Ctrl+C? Знаю пару программ, которые копируют в буфер обмена исключительно по Ctrl+Insert.
(Способ проверен на Excel, Word, Opera, Code::Blocks, Emacs, Firefox, адресной строке проводника, блокноте и т.п.)
AF>Почему Ctrl+Insert, а не Ctrl+C? Знаю пару программ, которые копируют в буфер обмена исключительно по Ctrl+Insert.
тоже писал подобное в 2001м выбрал Ctrl+C потому что нашел более чем пару программ которые копируют исключительно по Ctrl+С
какие уже не помню. А по уму наверное надо пробовать оба пока не получишь евент от клипборда
А еще в офисе 2003 это мерзко на такие шутки у них клипборд менеджер свой, поэтому каждый раз когда скопировал через клипборд и восстановил у них всё это видно
Упс, не заметил, что ответили...
D>А по уму наверное надо пробовать оба пока не получишь евент от клипборда
Точно, надо будет попробовать .
D>А еще в офисе 2003 это мерзко на такие шутки у них клипборд менеджер свой, поэтому каждый раз когда скопировал через клипборд и восстановил у них всё это видно
Наверное, у меня эта фишка отключена, т.к. копирование в нём сейчас происходит нормально .