Форум: "KOL";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];
Внизув. В. Кладов! В элемент типа TEdit вставить понятно как, а в мно Найти похожие ветки
← →
Baloo (2004-07-29 08:25) [0]Уважаемый Владимир Кладов! И уважаемые мастера!
Взялся делать программу - автозавершение (типа как в Delphi по Ctrl-Space). Только чтобы работала со всеми редакторами (не только Word, но и Aditor, и KoEdit, и Бред. и блокнот, и строка поися в Яндексе :-). В принципе, такая прога есть - Интелли-Комплит. Но она здоровая и НЕ МОЯ. Мучился-мучился, с WinAPI - то плоховато... Т.е. в трэе сидит, окошко выскакивает, прячется, загружаются строки, хук библиотека грузится и ловит всю клаву в системе, листбокс заполняется из файла и сохраняется в него... А вот втюрить строку не мог даже в однострочный элемент редактирования чужого приложения (пытался SendMessage c WM_SetText, по хэндлу, найденному при помощи GetFocus). Так он, зараза, в свои Эдиты вставляет без проблем (в свое приложение), а в чужое - не хочет. Потом нашел ваш МультиКлипБоард, разобрался малость, теперь в некоторые TEdit"ы - чужие, вставляет текст. А как быть с тем же Word"oм или Адитором? С многострочными редакторами? Ваш КлипБоард там тоже не работает.
Заранее благодарю за кучу ответов с обширными примерами и комментариями после знака //
:-)
← →
Андрей (2004-07-29 09:00) [1]А вот чисто на вскидку - ты этим контролам WM_CHAR послать пробовал?
← →
Baloo (2004-08-02 10:17) [2]Нет, не пробовал. Попробую. Попробовал другое - использовал функцию Stroke2Windows - кажется так она звучит. Получилось - работает, как часы!
Потом стал пробовать функцию Stroke2WindowsEx - надеясь, что при наборе с клавиатуры чары будут проходить через прогу и попадать в нужное окно. Так, по крайней мере я перевел помощь из хелп-генератора. Уж что я не пытался - и прятал форму, потом отправлял чар, и ставил фореграунд - то окно, в которое надо печатать, потом отправлял букву - шиш! У меня не работает. Даже в Кол.Пас слазил, посмотрел, как она работает... Подскажите, а?
И еще: может, кто знает, как вычислить координаты каретки? Каретка в системе одна, делаем GetCaretPos и получаем точку с нулевыми координатами... Хотя каретка нагло мигает в середине Worda...
← →
savva © (2004-08-02 10:46) [3]
> Baloo (02.08.04 10:17) [2]
> И еще: может, кто знает, как вычислить координаты каретки?
> Каретка в системе одна, делаем GetCaretPos и получаем точку
> с нулевыми координатами... Хотя каретка нагло мигает в середине
> Worda...
а не пробовал разобраться - почему?Return Values
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
ЗЫ. а функцию Stroke2Window я бы советовал сменить на keybd_event - текст будет посылаться в активное окно ввода - тебе не надо будет искать его...
← →
SPeller © (2004-08-02 16:56) [4]
> Хотя каретка нагло мигает в середине Worda
А ты уверен что Ворд не рисует каретку сам?
← →
Baloo (2004-08-03 12:49) [5]Не уверен. Но уж такая штука, как однострочный редактор (TEdit, одним словом) в настройках Total Commander уж точно не рисует. Да и простая форма с одним TEdit, наскоро состряпанная в Delphi (VCL) - тоже не рисует. Я чего хочу: жмешь Ctrl+Space - определяется координаты каретки в любом, где она только что мигала и мое окошко всплывает под кареткой. Так вот, GetCaretPos(Pxy) - и точка Pxy получает координаты (0,0). Может, кинет кто кода, а? Ведь есть такая штука, сам видел.
← →
Baloo (2004-08-03 12:56) [6]
> а не пробовал разобраться - почему?
>
> Return Values
>
> If the function succeeds, the return value is nonzero.
> If the function fails, the return value is zero. To get
> extended error information, call GetLastError.
Вы будете смеяться, пробовал. Функция срабатывает без ошибки, false не возвращает.
← →
Vladimir Kladov (2004-08-03 15:32) [7]одно из возможных объяснений: возвращается каретка текущего окно, не вордовского, а вашего приложения. Надо чтобы окно еще не существовало в природе, когда вызывается GetCaretPos.
← →
SPeller © (2004-08-03 16:40) [8]Так как раетка одна в системе, то и рисуется она только в том окне, которое имеет фокус ввода.
← →
Baloo (2004-08-10 04:57) [9]Неужели я достиг того уровня, что начал разбираться в таких вещах! Приятно. Но одновременно и печально, так как все это я перепробовал. А именно - когда определяю координаты, моя форма сидит в трее, а ворд (или что другое) - как раз фореграунд. Или вы имеете в виду, что формы ВООБЩЕ не должно быть? Сначала-координаты, потом Create форму? Сегодня же попробую и доложу. Вообще даже попробую из DPR-a, безо всяких форм. Спасибо.
И еще к слову: пишу с работы, КОЛ - дома. Не помню точно название ф-ции (StartIsStroke или что-то в этом роде). Короче, ф-ция спрашивает, начинается ли большая строка с маленькой? При попытке ее использования возникает исключение и ошибка в модуле KOL.pas. Да не в этой ф-ции, а в другой, которая длину строки, что ли определяет, не знаю, там сплошной Asm. Я, правда, нашел выход - спер похожую функцию из проекта HiASM. Но все равно, HiASM работает со стрингами, а вы говорите, что чар быстрее.
← →
Vladimir Kladov (2004-08-10 16:21) [10]просто есть разница между
ShowMessage( Int2Str( Integer( StrIsStartingFrom( "", "ABC" ) ) ) );
и
ShowMessage( Int2Str( Integer( StrIsStartingFrom( nil, "ABC" ) ) ) );
Во втором случае будет исключение.
← →
Baloo (2004-08-13 04:27) [11]program Karetka;
uses
KOL, Windows;
var Pt : TPoint;
H : THandle;
begin
if 1=1 then
begin
Sleep(5000); //Даже щелкаем мышью окно Delphi-редактора, каретка мигает
H := GetForegroundWindow; //Запоминаем окно Delphi-редактора
SetForegroundWindow(H); //Окно Delphi-редактора вперед, хотя оно и без того впереди, каретка мигает
Sleep(3000);
if GetCaretPos(Pt) then MsgOK(Double2Str(Pt.X)+", "+Double2Str(Pt.Y));
end;
end. //И все равно получаем (0, 0) БЛИН!
← →
SPeller © (2004-08-13 06:24) [12]А что говорит GetLastError?
← →
nOvell (2004-08-13 12:02) [13]GetCaretPos работает только в родном окне.
← →
Baloo (2004-08-16 09:17) [14]GetLastError ничего не говорит, я его не вызываю, т.к. ошибки нет, я думаю. if not GetCaretPos = false, тогда давай координаты. Раз она дает (0,0) - значит, работает. Насчет родного окна - не уверен. В родном "ричЕдит" - просто CaretPos.
В хелпе написано - "В системе".
← →
SPeller © (2004-08-16 11:48) [15]Для простоты на VCL сделайте простейший пример. На форме лейбл, едит и таймер. Обработчики такие:
procedure TForm1.Timer1Timer(Sender: TObject);
var
PT: TPoint;
begin
GetCaretPos(PT);
Caption := IntToStr(PT.X) + " " + IntToStr(PT.Y);
Label1.Caption := Label1.Caption + ".";
end;
procedure TForm1.FormClick(Sender: TObject);
begin
Edit1.Free;
Edit1 := nil;
end;
Теперь запустите два экземпляра, подвигайте каретку в едите и пощёлкайте по форме в обоих из них и посмотрите на результат, который высветится в заголовке формы. И сделайте выводы.
← →
SPeller © (2004-08-16 11:55) [16]А вот цитата из MSDN:
The system provides one caret per message queue.
← →
Baloo (2004-08-20 06:30) [17]Ну хорошо. Признаю себя ослом. Так все-же как быть-то? Есть какие-нить идеи?
← →
Gandalf © (2004-08-20 11:22) [18]Поизучай Интелли-Комплит - похукай сообщения, вызовы WinAPI и т.п.
← →
Gandalf © (2004-08-20 11:23) [19]Вообще тебе давно пора в WinAPI...
← →
SPeller © (2004-08-20 13:05) [20]Чтобы использовать GaetCaretPos, нуно свою ДЛЛ внедрять в целевой процесс, получать позицию каретки и работать. Но это уже да, в WinAPI.
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.036 c