Як передати дату в чуже додаток
Як передати дату в чуже додаток?
Доброго вам дня.
Ситуація така: є деякий чуже додаток, що має компонент типу DateTimePicker.В цей компонент мені потрібно передати свою дату.Я роблю так:
h: = FindWindow (nil, "Form");
hd: = FindWindowEx (h, 0, "TDateTimePicker", nil);
SendMessage (hd, WM_SETTEXT, 0, lparam (LPCTSTR (PChar ( "23.03.1981"))));
Чи не работает.Подскажіте як треба, плиз.
Якщо Ви впевнені, що в чужому додатку використовується саме компонент TDateTimePicker (клас вікна - DATETIMEPICK_CLASS), і його хендл відомий, можна використовувати повідомлення DTM_SETSYSTEMTIME.
var
# XA0; H: HWND; # XA0; # XA0; # XA0; # XA0; # XA0; // Хендл вікна TDateTimePicker
# XA0; ST: TSystemTime; # XA0; // Дата-час в системному форматі
begin
# XA0; FillChar (ST, sizeof (ST), 0);
# XA0; ST.wDay: = 23;
# XA0; ST.wMonth: = 3;
# XA0; ST.wYear: = 1981;
# XA0; SendMessage (H, DTM_SETSYSTEMTIME, GDT_VALID, Integer (@ST))
end.
У компонента клас вікна, якраз, "TDateTimePicker".
Але я якось не врахував головного: оскільки в якості параметра повідомлення використовується покажчик, а саме повідомлення відправляється вікна чужого процесу, то так просто послати його не вдасться.
Тому прошу не звертати уваги на [1].
Взагалі-то додатків два.В одному InqSoft Window Scanner показує клас вікна SysDateTimePick32, а в іншому-TDateTimePicker.
> fmf # XA0; (03.08.05 10:26) [4]
> Взагалі-то додатків два.В одному InqSoft Window Scanner
> Показує клас вікна SysDateTimePick32, а в іншому-TDateTimePicker.
Для вирішення оной проблеми потрібно розподілити в чужому
додатку буфер, а в LParam повідомлення посилатися на нього.
Після обробки повідомлення буфер можна прочитати.
Зараз передаю так:
h: = FindWindow (nil, "Form");
hd: = FindWindowEx (h, 0, "TDateTimePicker", nil);
DateTime_SetFormat (hd, PChar ( "23.03.1981"));
Передається текст в якійсь лівій кодіровке.Вопрос: як правильно перетворити дату?
Зараз передаю так:
h: = FindWindow (nil, "Form");
hd: = FindWindowEx (h, 0, "TDateTimePicker", nil);
DateTime_SetFormat (hd, PChar ( "23.03.1981"));
Передається текст в якійсь лівій кодіровке.Вопрос: як правильно перетворити дату?
> fmf # XA0; (11.08.05 13:31) [7]
> Зараз передаю так:
Тобі ж пояснювали, що так передати не можна.
Якщо хочеш по-простому, постарайся:
# XA0; 2 в активне поле:
# XA0; PostMessage (DateTimePicker.Handle, WM_CHAR, Ord ( "2"), 0);
# XA0; Перехід до наступного поля:
# XA0; PostMessage (DateTimePicker.Handle, WM_KEYDOWN, VK_RIGHT, 0);
# XA0; SendMessage (DateTimePicker.Handle, WM_KEYUP, VK_RIGHT, 0);
# XA0; Для активації чужого додатка - SetForegroundWindow.
# XA0; Для установки фокусу на контрол:
# XA0; AttachThreadInput (. True), Windows.SetFocus, AttachThreadInput (. False)
> Для установки фокусу на контрол:
> # XA0; AttachThreadInput (. True), Windows.SetFocus, AttachThreadInput (. False)
- WM_SETFOCUS - замінює цю конструкцію.
До речі, тепер мені зрозуміло, чому функція SetFocus для чужих додатків не працює.