доработка редактора
От: eldar9x_  
Дата: 23.01.07 08:09
Оценка:
Всем привет! Появилась необходимость добавить в чужую программу, а точнее в ее текстовый редактор возможность перетаскивания текста. Вроде как все есть — выделение цветом, различные шрифты и т.п., а вот эта функциональность не реализованна, что очень странно. Если какая нибудь возможность это сделать. Например, перехват сообщений, но не имея исходников программы, даже не представляю как это можно подступиться к программе снаружи... Помогите, пожалуйста. PS: Буду рад любому коду, хоть Паскаль (Delphi), хоть С++ (лучше в стиле MS VS)

23.01.07 12:28: Перенесено модератором из 'Пользовательский интерфейс: проектирование, usability' — Хитрик Денис
23.01.07 12:29: Перенесено модератором из 'Пользовательский интерфейс: проектирование, usability' — Хитрик Денис
int i;
i = (i++)+(i++);
cout << i;
Re: доработка редактора
От: Macr0s Россия  
Дата: 23.01.07 09:33
Оценка:
Первое, что приходит в голову — варварский способ: загрузчик программы, который внедряет библиотеку в адресное пространство программы. Библиотека будет ставить хук... В общем обычный перехват API. Над деталями стоит подумать. Если конечно ничего больше придумано не будет
Второй вариант — модификация бинарника программы — более сложная и более зверская весчь.
Третий вариант — написать письмо разработчикам
Перед тем, как улучшиться, ситуация ухудшается. (из законов Мерфи)
Re[2]: доработка редактора
От: eldar9x_  
Дата: 23.01.07 10:46
Оценка:
Здравствуйте, Macr0s, Вы писали:

M>Первое, что приходит в голову — варварский способ: загрузчик программы, который внедряет библиотеку в адресное пространство программы. Библиотека будет ставить хук... В общем обычный перехват API. Над деталями стоит подумать. Если конечно ничего больше придумано не будет

M>Второй вариант — модификация бинарника программы — более сложная и более зверская весчь.
M>Третий вариант — написать письмо разработчикам

3-й вариант исключается по той причине, что разработчик Microsoft , 2-й — кодить на VS или Delphi то есть на С++ и Паскаль я еще умею, а вот до ассемблера мне еще слабо. Так что остается первый вариант, вот о деталях было бы интересно...
int i;
i = (i++)+(i++);
cout << i;
Re[3]: доработка редактора
От: Macr0s Россия  
Дата: 23.01.07 11:12
Оценка:
Здравствуйте, eldar9x_, Вы писали:

_>3-й вариант исключается по той причине, что разработчик Microsoft

Интересно, что за программа такая
_>2-й — кодить на VS или Delphi то есть на С++ и Паскаль я еще умею, а вот до ассемблера мне еще слабо. Так что остается первый вариант, вот о деталях было бы интересно...

Ну если подумать — я думаю, дело обойдется хуком мышиным (WH_MOUSE).
Алгоритм работы загрузчика примерно такой:
1) запуск программы
2) установка хука
3) всё, можно работать в программе.

В функции хука как раз и реализуется Drag-n-Drop.
Как конкретно — не в курсе, Drag-n-Drop никогда не программировал. Но как-то так:
if(мыша над нашим редактором)
{
  if(имеем выделенный текст, который ещё не перетаскивается)
  {
     StartDrag(наш текст);
  } else if(наш текст перетаскивается)
  {
     // перетаскиваем дальше
  } else  if(конец перетаскивания)
  {
     EndDrag(наш текст);
     // помещаем наш текст куда надо
  }
}

Конечно с обработкой нажатых клавиш мыши и всё такое...
Подробнее про хуки можно почитать здесь
Автор(ы): Kyle Marsh
Дата: 14.03.2001

Автор подробно описывает принципы работы хуков, их виды и случаи применения.
Статья не содержит примеров хуковых функций и носит лишь ознакомительный
характер. Рекомендуется программистам, только начинающим осваивать эту область
программирования для Windows.
.

З.Ы. Может быть есть способ "правильнее" или проще, но лично я до него не додумался.
Перед тем, как улучшиться, ситуация ухудшается. (из законов Мерфи)
Re[4]: доработка редактора
От: Macr0s Россия  
Дата: 23.01.07 11:23
Оценка:
Кстати, и dll никакой не надо будет, т.к. dll должны использоваться только при постановке глобальных хуков, а в этом случае будет локальный хук.
Перед тем, как улучшиться, ситуация ухудшается. (из законов Мерфи)
Re[5]: доработка редактора
От: eldar9x_  
Дата: 23.01.07 12:23
Оценка:
Здравствуйте, Macr0s, Вы писали:

M>Кстати, и dll никакой не надо будет, т.к. dll должны использоваться только при постановке глобальных хуков, а в этом случае будет локальный хук.


Огромное спасибо, Macr0s. Наконец-то понял примерное направление куда копать. А по-поводу программы — это корпоративная система управления Axapta, там есть свой язык программирования (X++), так вот разработчики не удосужились сделать нормальный редактор кода, конечно, я не требую редактор типа VS 2005, но хотя бы элементарную возможность перетаскивания текста можно же было докодить...
int i;
i = (i++)+(i++);
cout << i;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.