![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Скопировать данные с помощью API функций [D7, WinXP]
Krozzz © (2009-02-13 19:00:00)Есть две программы. В каждой по компоненту Edit. Подскажите, как поместить информацию из Edit"а одной программы в Edit другой (и если вместо Edit будет Label)?
Германн (2009-02-19 00:37:00) [1]
> Насчет WM_GETTEXT: программа не работала из-за внесения
> названия
> компонента как 4го параметра в FindWindowEx.
>
>
> Это не на форумах надо спрашивать. Это надо изучать по книгам,
> причём достаточно серьёзным. Если речь идёт про WinAPI
> функции, то нужно абсолютно точно понимать, что никаких
> "компонент" они не знали, не знают и знать не хотят. Они
> знают только "окна" (windows).
Извини, что опять "критикую", но...
Krozzz (2009-02-18 18:49:00) [2]
> Юрий Зотов and clickmaker
Извиняюсь, промахнулся. Изменения надо вносить с WM_COPYDATA.
Насчет WM_GETTEXT: программа не работала из-за внесения названия
компонента как 4го параметра в FindWindowEx.
Вот правильный код:
procedure TForm1.Button1Click(Sender: TObject);
var
wnd:hwnd;
b:array [0..127] of char;
begin
Edit1.text:='';
wnd:=FindWindow('TFormN',nil);
wnd:=FindWindowEx(wnd,0,'TEdit',nil);(* при FindWindowEx(wnd,0,'TEdit','Edit1') не работает *)
Sendmessage(wnd,wm_gettext,sizeof(b),Lparam(@b));
Edit1.text:=b;
end;
> Юрий Зотов
</I
> как раз GetWindowText не должно работать никогда
>
Код, приведенный в [42], лично у меня работает для символов латиница+цифры (для других не проверял).
Германн (2009-02-18 01:07:00) [3]
> Krozzz (17.02.09 16:17) [38]
>
...
> (кроме, разве что, Германн"а.
> Вы, кроме как критиковать ничего не умеете?..
>
Я много чего умею. Но умело скрываю свои умения! :)
> Юрий Зотов © (17.02.09 23:35) [46]
>
> GetWindowtext(wnd, @b, Sizeof(b));
>
> Адрес b, а не просто b.
А разве в случае статического массива "b:array [0..127] of char;"
это не одно и то же?
Юрий Зотов (2009-02-17 23:41:00) [4]Причем, если верить справке (а с чего бы ей не верить?), то как раз GetWindowText не должно работать никогда (потому что "This function cannot retrieve the text of an edit control in another application"), а вот WM_GETTEXT - как раз всегда. И никакие изменения тут ни при чем.
Юрий Зотов (2009-02-17 23:35:00) [5]GetWindowtext(wnd, @b, Sizeof(b));
Адрес b, а не просто b. См. описание функции.
А насчет того, что работает только при каких-то там изменениях - здесь точно путаница. При правильном коде должно работать всегда .
clickmaker (2009-02-17 23:25:00) [6]и при каких изменениях работает WM_GETTEXT?
Krozzz (2009-02-17 23:12:00) [7]clickmaker
> TFormN в другом процессе?
Да
clickmaker (2009-02-17 23:10:00) [8]> [42] Krozzz (17.02.09 23:06)
TFormN в другом процессе?
Krozzz (2009-02-17 23:06:00) [9]
> Похоже, Вы все же заблуждаетесь.
Вот код. Работает так, как я описал в предыдущем посте.
procedure TForm1.Button1Click(Sender: TObject);
var wnd:hwnd;
b:array [0..127] of char;
begin
wnd:=FindWindow('TFormN',nil);
wnd:=FindWindowEx(wnd,0,'TEdit',nil);
GetWindowtext(wnd,b,Sizeof(b));
Edit1.text:=b;
end;
С WM_GETTEXT работает при условии внесения изменений в программу-источник (что в моем случае нежелательно).
Юрий Зотов (2009-02-17 21:05:00) [10]> Krozzz (17.02.09 20:41) [40]
Похоже, Вы все же заблуждаетесь. Вот выдержки из описания GetWindowText:
If the target window is owned by another process and has a caption, GetWindowText retrieves the window caption text. If the window does not have a caption, the return value is a null string.
To retrieve the text of a control in another process, send a WM_GETTEXT message directly instead of calling GetWindowText.
А ведь про WM_GETTEXT Вам сказали уже давно...
Krozzz (2009-02-17 20:41:00) [11]
> Есть серьезные сомнения, что таким образом Вы ее действительно
> решили. Без шуток. Не знаю всех условий Вашей реальной задачи,
> но в общем случае GetWindowText проблему, обозначенную
> в сабже, не решает. Поэтому, не исключено, что Вам только
> кажется, что Вы ее и в самом деле решили - из-за недостаточного
> объема тестирования.<Цитата>
>
>
>
В общем случае не решает, но мне достаточно один раз скопировать содержимое Edit и на этом остановиться (хотя при изменении содержимого того Edit"а в запущенной программе, данной функции уже не хватает).
Юрий Зотов (2009-02-17 20:08:00) [12]> Krozzz (17.02.09 16:17) [38]
> Решил проблему с помощью GetWindowText().
Есть серьезные сомнения, что таким образом Вы ее действительно решили. Без шуток. Не знаю всех условий Вашей реальной задачи, но в общем случае GetWindowText проблему, обозначенную в сабже, не решает. Поэтому, не исключено, что Вам только кажется, что Вы ее и в самом деле решили - из-за недостаточного объема тестирования.
Krozzz (2009-02-17 16:17:00) [13]Решил проблему спомощью GetWindowText().
Извиняюсь, если был некорректен в вопросах.
Всем, кто помогал - спасибо!
(кроме, разве что, Германн"а.
Вы, кроме как критиковать ничего не умеете?..
Я не врал, я вначале проверял на тестовойпрограмме. Просто потом появилось желание проверить на сторонней программе).
Германн (2009-02-17 01:31:00) [14]
> korneley © (17.02.09 01:27) [36]
>
>
> > Krozzz (14.02.09 23:21) [17]
> > Извиняюсь, забыл сказать, что программу, из которой копируется
> > строка, тестовая, т.е. на практике надо будет считать
> строку
> > из программы, в которой будет много элементов (естественно
> > и тот, с которого надо считать) и добавить или убавить
> элементы
> > к ней нельзя.
>
> Это многое объясняет.
Это только запутывает.
Примите и прочь.
korneley (2009-02-17 01:27:00) [15]
> Krozzz (14.02.09 23:21) [17]
> Извиняюсь, забыл сказать, что программу, из которой копируется
> строка, тестовая, т.е. на практикенадо будет считать строку
> из программы, в которой будет много элементов (естественно
> и тот, с которого надо считать) и добавить или убавить элементы
> к ней нельзя.
Это многое объясняет.
Германн (2009-02-17 01:12:00) [16]
> korneley © (17.02.09 01:02) [34]
>
>
> > Германн © (17.02.09 00:39) [33]
> > ...весьма возможно, что твоё враньё привело
> > к тому, что решение так и не было найдено.
>
> Дык, в общем случае, и нет такого... Сказал бы автор сразу:
> "Хочу из Эдитов разных, вместо звёздочек, буковки паролей
> реальные получать" :) Итог, думаю, был бы тем же. Но быстрее
> :)))
>
Нет. Я о том, что автор свой единственный приведённый пример посвятил TLabel. Но если он очевидно соврал, когда говорил, что исходники доступны, то мог соврать и о том, что "Обе программы дельфийские".
korneley (2009-02-17 01:02:00) [17]
> Германн © (17.02.09 00:39) [33]
> ...весьма возможно, что твоё враньё привело
> к тому, что решение так и не было найдено.
Дык, в общем случае, и нет такого... Сказал бы автор сразу: "Хочу из Эдитов разных, вместо звёздочек, буковки паролей реальные получать" :) Итог, думаю, был бы тем же. Но быстрее :)))
Германн (2009-02-17 00:39:00) [18]Да и ещё насчёт вранья.
Учитывая, что сразу несколько уважаемых мастеров проявили необъяснимую для меня благосклонность к твоему вопросу, весьма возможно, что твоё враньё привело к тому, что решение так и не было найдено.
Примите и прочь.
Германн (2009-02-17 00:30:00) [19]
> Krozzz (16.02.09 20:35) [30]
>
>
> > Ну тогда распрощайся с затеей.
>
> Обидно ;(
> Ну ладно...
> Закрывайте тему
Об этом я тебе уже говорил в том первом твоём вопросе, который был закрыт.
Но зачем было врать? "Krozzz (14.02.09 19:15) [7]"
Ну и напоследок.
[2] я постил не просто от нечего делать.
@!!ex (2009-02-16 22:03:00) [20]http://www.delphimaster.ru/cgi-bin/forum.pl?n=9&id=1234355258