Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Скопировать данные с помощью API функций [D7, WinXP]


Страницы:   1 2 3

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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо