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

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

Как передать дату в чужое приложение? [D7, WinXP]


fmf ©   (2005-08-03 07:23:00) 

Доброго времени суток.
Ситуация такая:есть некоторое чужое приложение, имеющее компонент типа DateTimePicker.В этот компонент мне нужно передать свою дату.Я делаю так:
h:=FindWindow(nil,'Form');
hd:=FindWindowEx(h,0,'TDateTimePicker',nil);
SendMessage(hd,WM_SETTEXT,0,lparam(LPCTSTR(PChar('23.03.1981'))));
Не работает.Подскажите как надо,плиз.


ANB   (2005-08-11 15:19:00) [1]


> Для установки фокуса на контрол:
>  AttachThreadInput(..,True), Windows.SetFocus,AttachThreadInput(..,False)
- WM_SETFOCUS - заменяет эту конструкцию.
Кстати, теперь мне понятно, почему функция SetFocus для чужих приложений не работает.


fmf   (2005-08-11 14:22:00) [2]

Спасибо.Все заработало.


Leonid Troyanovsky   (2005-08-11 14:00:00) [3]


> fmf   (11.08.05 13:31) [7]
> Сейчас передаю так:


Тебе ж объясняли, что такпередать нельзя.

Если хочешь по-простому, изволь:

 2 в активное поле:
 PostMessage(DateTimePicker.Handle, WM_CHAR, Ord('2'), 0);

 Переход к следующему полю:
 PostMessage(DateTimePicker.Handle, WM_KEYDOWN, VK_RIGHT, 0);
 SendMessage(DateTimePicker.Handle, WM_KEYUP, VK_RIGHT, 0);

 Для активации чужого приложения - SetForegroundWindow.
 Для установки фокуса на контрол:
 AttachThreadInput(..,True), Windows.SetFocus,AttachThreadInput(..,False)

--
Regards, LVT.


fmf   (2005-08-11 13:31:00) [4]

Сейчас передаю так:
h:=FindWindow(nil,'Form');
hd:=FindWindowEx(h,0,'TDateTimePicker',nil);
DateTime_SetFormat(hd,PChar('23.03.1981'));

Передается текст в какой-то левой кодировке.Вопрос:как правильно преобразовать дату?


fmf   (2005-08-11 13:30:00) [5]

Сейчас передаю так:
h:=FindWindow(nil,'Form');
hd:=FindWindowEx(h,0,'TDateTimePicker',nil);
DateTime_SetFormat(hd,PChar('23.03.1981'));

Передается текст в какой-то левой кодировке.Вопрос:как правильно преобразовать дату?


Leonid Troyanovsky   (2005-08-03 14:49:00) [6]


> fmf   (03.08.05 10:26) [4]
> Вообще-то приложений два.В одном InqSoft Window Scanner
> показывает класс окна SysDateTimePick32,а в другом-TDateTimePicker.


Да особой разницы нет, если, конечно они способны
обрабатывать DTM_SETSYSTEMTIME, т.е., получены
сабклассированием родного DTP.
Но, на главную проблему указал begin...end © : указатели
на данные в одном процессе невалидны в другом.

Для решения оной проблемы нужно распределить в чужом
приложении буфер, а в LParam сообщения ссылаться на него.
После обработки сообщения буфер можно прочитать.

Например, для ListView
http://groups.google.com/group/fido7.ru.delphi/browse_thread/thread/62f41bf5cf10e5ae/1574140649142b2f?lnk=st&q=lvt+lvm_getitemcount&rnum=2#1574140649142b2f

--
Regards, LVT.


fmf   (2005-08-03 10:26:00) [7]

Вообще-то приложений два.В одном InqSoft Window Scanner показывает класс окна SysDateTimePick32,а в другом-TDateTimePicker.


begin...end   (2005-08-03 09:40:00) [8]

> Leonid Troyanovsky ©   (03.08.05 9:23) [2]

Да, верно.

Но я как-то не учёл главного: поскольку в качестве параметра сообщения используется указатель, а само сообщение отправляется окну чужого процесса, то так просто послать его не удастся.

Поэтому прошу не обращать внимания на [1].


Leonid Troyanovsky   (2005-08-03 09:23:00) [9]


> begin...end ©   (03.08.05 09:03) [1]
> Если Вы уверены, что в чужом приложении используется именно
> компонент TDateTimePicker (класс окна -- DATETIMEPICK_CLASS),


У компонента класс окна, как раз, "TDateTimePicker".

--
Regards, LVT.


begin...end   (2005-08-03 09:03:00) [10]

Если Вы уверены, что в чужом приложении используется именно компонент TDateTimePicker (класс окна -- DATETIMEPICK_CLASS), и его хэндл известен, можно использовать сообщение DTM_SETSYSTEMTIME.

uses CommCtrl;

var
 H: HWND;          // Хэндл окна TDateTimePicker
 ST: TSystemTime;  // Дата-время в системном формате
begin
 FillChar(ST, sizeof(ST), 0);
 ST.wDay := 23;
 ST.wMonth := 3;
 ST.wYear := 1981;
 SendMessage(H, DTM_SETSYSTEMTIME, GDT_VALID, Integer(@ST))
end.


Наверх

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