![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Макрос
faiwer © (2011-01-23 21:40:00)Доброго времени суток.
Задача:
1. Пользователь выделяет текст
2. Пользователь зажимает доп. кнопку мыши
3. Срабатывает драйвер мыши и запускает мою программу (консольную)
4. Программа копирует выделенный текст
5. Обрабатывает
6. Заменяет на обработанный
Всё что до 4 пункта работает, и вообще не моего ума дело. Всё что после должна решать моя программа.
4. Скопировать тест я смог послав глобально Ctrl+C, а затем получив его из Clipboard.asText
5. Тут проблемы тоже нет
6. А вот тут я не знаю что делать.
Пробовал вот так:
Clipboard.SetTextBuf(PChar(mes));
PostKeyEx32(Ord('V'), [ssCtrl], False);
Однако вставлялся старый тест. Поставил между ними таймер - после 500 мс стало работать, но только в окне RAD Studio, но в нетбинсе (собсно ради него всё и затевалось) вставляется свежескопированный текст, а не изменённый. Увеличение sleep-а до 3 секунд не помогает. Зато помогает вызов ShowMessage, затем о5 ожидание 3 секунд, клик по окну (ибо оно изза диалога теряет фокус).
Простая вставка символов работает, но такой вариант не годится, ибо текст с которым я работаю содержит разные спецсимволы (< > # & и т.д.). Пробовал компоненту SendKey - она не справляется с етими символами.
Решил попробовать отправку сообщений окну. Ничего не получается =( Пробую так:
dwTargetOwner := GetWindowThreadProcessId(GetForegroundWindow, nil);
dwThreadID := GetCurrentThreadId(); //указатель на текущий процесс
if (dwTargetOwner dwThreadID) then // если не один и тот же процесс
Result := AttachThreadInput(dwThreadID, dwTargetOwner, TRUE); //подключение
h:=GetFocus;
SetWindowText(h, PChar('OLOLO') );
SendMessage( h, WM_SETTEXT, 0, LPARAM(PChar('OLOLO2')) );
h - находит какой то дескриптор (не 0), но ничего не происходит (кроме смены заголовка окна). ТТ...
Вопрос, как реализовать пункт 6?
Если интересна сама задача - комментирование\раскомментирование кода (xls, css, php etc...)
P.S. D2010, W7, WXP
Leonid Troyanovsky (2011-01-25 13:15:00) [1]
> faiwer © (24.01.11 04:50) [8]
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1259844425&n=5
--
Regards, LVT.
faiwer (2011-01-24 04:50:00) [2]
> А если у меня там пароль лежит от випа или лететбита, и
> сраницу я уже закрыл, и не записал, т.к. не думал, что какой-
> то ... без моего ведома будет мой же буфер обмена затирать.
>
1. Ну никто не мешает его скопировать в отдельную переменную, а затем восстановить. Сейчас макрос в стадии реализации, и такие мелочи я оставил на потом
2. Программа исключительно для собственного использования, так что никто посторонний не пострадает, не переживайте :)
> Ну и?
> В многозадачной среде "затирание буфера" вполне допустимо
> всегда. Буфер один, а приложений куча. Тут главное, что
> буфер "затирается" по "требованию" пользователя.
Кстати да :) Но о5 же, повторюсь, единственным пользователем программы буду я сам.
А буфер я использую ввиду не понимания того, как иначе получить выделенный текст :) Может там есть какой шаманский вариант с WM_COPY или типа того? Но не приведёт ли он к тому же самому? + Как мне добраться до Handle контрола? Способ выше (найдено в сети), даёт мне опр.значение, но судя по всему не то =(
Германн (2011-01-24 03:35:00) [3]
> Inovet © (24.01.11 03:09) [6]
>
> > [5] Германн © (24.01.11 03:01)
> > "затирается" по "требованию" пользователя.
>
> Так нет требования, пользователь знать не знает, что его
> действие влияет на буфер, что программист, не зная как по-
> другому, сделал через буфер.
>
Требование есть! Кто-то нажал на доп.кнопку мыши.
И если в документации это нажатие описано, значит тому и быть!
В конце концов всяк, прошедший курс "информатики", обязан знать, что после Ctr+C, должно по возможности сделать Ctr+V сразу, а не нажимать другие кнопки.
Inovet (2011-01-24 03:09:00) [4]> [5] Германн © (24.01.11 03:01)
> "затирается" по "требованию" пользователя.
Так нет требования, пользователь знать не знает, что его действие влияет на буфер, что программист, не зная как по-другому, сделал через буфер.
Германн (2011-01-24 03:01:00) [5]
> Inovet © (24.01.11 02:37) [4]
>
> > [3] Германн © (24.01.11 02:15)
> > А при "Пользователь зажимает доп. кнопку мыши" всегда
> "какой-
> > то" "что-то" делает без твоего ведома.
>
> Здесь неявное затирание буфера, то же можно и на любые другие
> события навешать: нажатие клавиши F11, например, или выбор
> пункта меню "Заменить выделенный текст" вдруг затрёт буфер.
>
Ну и?
В многозадачной среде "затирание буфера" вполне допустимо всегда. Буфер один, а приложений куча. Тут главное, что буфер "затирается" по "требованию" пользователя.
Inovet (2011-01-24 02:37:00) [6]> [3] Германн © (24.01.11 02:15)
> А при "Пользователь зажимает доп. кнопку мыши" всегда "какой-
> то" "что-то" делает без твоего ведома.
Здесь неявное затирание буфера, то же можно и на любые другие события навешать: нажатие клавиши F11, например, или выбор пункта меню "Заменить выделенный текст" вдруг затрёт буфер.
Германн (2011-01-24 02:15:00) [7]
> т.к. не думал, что какой-то ... без моего ведома будет
А при "Пользователь зажимает доп. кнопку мыши" всегда "какой-то" "что-то" делает без твоего ведома. Так что не стоит так уж волноваться.
Anatoly Podgoretsky (2011-01-23 23:50:00) [8]Вот теперь будешь знать, что и среди программистов есть уроды.
Andy BitOff (2011-01-23 22:39:00) [9]> 4. Скопировать тест я смог послав глобально Ctrl+C, а затем
> получив его из Clipboard.asText
А если у меня там пароль лежит от випа или лететбита, и сраницу я уже закрыл, и не записал, т.к. не думал, что какой-то ... без моего ведома будет мой же буфер обмена затирать.