Текущий архив: 2005.10.09;
Скачать: CL | DM;
Вниз
Как передать дату в чужое приложение? Найти похожие ветки
← →
fmf (2005-08-03 07:23) [0]Доброго времени суток.
Ситуация такая:есть некоторое чужое приложение, имеющее компонент типа DateTimePicker.В этот компонент мне нужно передать свою дату.Я делаю так:
h:=FindWindow(nil,"Form");
hd:=FindWindowEx(h,0,"TDateTimePicker",nil);
SendMessage(hd,WM_SETTEXT,0,lparam(LPCTSTR(PChar("23.03.1981"))));
Не работает.Подскажите как надо,плиз.
← →
begin...end © (2005-08-03 09:03) [1]Если Вы уверены, что в чужом приложении используется именно компонент 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.
← →
Leonid Troyanovsky © (2005-08-03 09:23) [2]
> begin...end © (03.08.05 09:03) [1]
> Если Вы уверены, что в чужом приложении используется именно
> компонент TDateTimePicker (класс окна -- DATETIMEPICK_CLASS),
У компонента класс окна, как раз, "TDateTimePicker".
--
Regards, LVT.
← →
begin...end © (2005-08-03 09:40) [3]> Leonid Troyanovsky © (03.08.05 9:23) [2]
Да, верно.
Но я как-то не учёл главного: поскольку в качестве параметра сообщения используется указатель, а само сообщение отправляется окну чужого процесса, то так просто послать его не удастся.
Поэтому прошу не обращать внимания на [1].
← →
fmf (2005-08-03 10:26) [4]Вообще-то приложений два.В одном InqSoft Window Scanner показывает класс окна SysDateTimePick32,а в другом-TDateTimePicker.
← →
Leonid Troyanovsky © (2005-08-03 14:49) [5]
> 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_g etitemcount&rnum=2#1574140649142b2f
--
Regards, LVT.
← →
fmf (2005-08-11 13:30) [6]Сейчас передаю так:
h:=FindWindow(nil,"Form");
hd:=FindWindowEx(h,0,"TDateTimePicker",nil);
DateTime_SetFormat(hd,PChar("23.03.1981"));
Передается текст в какой-то левой кодировке.Вопрос:как правильно преобразовать дату?
← →
fmf (2005-08-11 13:31) [7]Сейчас передаю так:
h:=FindWindow(nil,"Form");
hd:=FindWindowEx(h,0,"TDateTimePicker",nil);
DateTime_SetFormat(hd,PChar("23.03.1981"));
Передается текст в какой-то левой кодировке.Вопрос:как правильно преобразовать дату?
← →
Leonid Troyanovsky © (2005-08-11 14:00) [8]
> 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 14:22) [9]Спасибо.Все заработало.
← →
ANB © (2005-08-11 15:19) [10]
> Для установки фокуса на контрол:
> AttachThreadInput(..,True), Windows.SetFocus,AttachThreadInput(..,False)
- WM_SETFOCUS - заменяет эту конструкцию.
Кстати, теперь мне понятно, почему функция SetFocus для чужих приложений не работает.
Страницы: 1 вся ветка
Текущий архив: 2005.10.09;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.026 c