Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2008, 10:33   #1
Андрей=
 
Регистрация: 22.04.2008
Сообщений: 9
По умолчанию DateTimePicker и API

Привет всем!
Проблема: Необходимо средствами API передать дату в DateTimePicker чужого окна.

h:=FindWindow(nil, 'Form');//чужая форма
h1:=FindWindowEx(h,0,'TDateTimePick er',nil);//хэндл таймпикера

sendmessage(h1,wm_settext,0,Integer (PChar('18.04.0 8')));//типа шлем свою дату, но, увы, дата не шлется
Спасибо.
Андрей= вне форума Ответить с цитированием
Старый 22.04.2008, 11:20   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если хендл правильно нашел и если это действительно делфовый контрол то можно так:
Код:
var tc:TDateTimePicker;
begin
 tc:=TDateTimePicker(FindControl(DateTimePicker1.Handle));
 if tc<>nil then tc.Time:=time;
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.04.2008, 11:41   #3
Андрей=
 
Регистрация: 22.04.2008
Сообщений: 9
По умолчанию

В делфовом контроле работает, спасибо. У меня, скорее всего,сишный,
поэтому результат пока нулевой
Андрей= вне форума Ответить с цитированием
Старый 22.04.2008, 11:57   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А это легко узнать. SpyXX или Winspector поможет узнать класс.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.04.2008, 13:06   #5
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

По порядку.
1. DateTimePicker не интересует сообщение WM_SETTEXT;
2. Для установки/чтения даты у DateTimePicker'а существуют сообщения DTM_SETSYSTEMTIME и DTM_GETSYSTEMTIME, Они прекрасно работают внутри одного процесса, но при связи с другим процессом с ними следующая проблема:
3. Всё, что относится к Common Controls имеет в основном "свои" сообщения большие, чем WM_USER. Это делает затруднительной передачу данных по указателю в другие процессы, поскольку Windows не маршаллит эти данные автоматически для сообщений, больших WM_USER. Отсюда вытекают минимум два возможных решения - "загнать" данные с помощью хука или записать их в другой процесс напрямую, а уже потом вызывать DTM_SETSYSTEMTIME, указывая в качестве аргумента данные, уже находящиеся в нужном процессе. Разумеется, в обоих случаях нужно иметь права на доступ к процессу и привилегии на выполнение этих операций.

2-1 способ:
Код:
unit Unit2;
interface

uses
  Windows, Forms, Controls, StdCtrls, Classes;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    function FindRemoteDateTimePicker : HWND;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.FindRemoteDateTimePicker : HWND;
begin
{
    Для упрощения поиска окна форме стороннего приложения присвоены имена
    'TDateTimeForm' и 'DateTimeForm' для класса и заголовка, а самому контролу -
    идентификатор 1025.
}
    result := GetDlgItem(
                    FindWindowA(PANSICHAR('TDateTimeForm'), PANSICHAR('DateTimeForm')),
                    1025);
end;

procedure TForm1.Button1Click(Sender: TObject);
const
    DTM_FIRST = $1000;                  // #define DTM_FIRST        0x1000
    DTM_SETSYSTEMTIME = DTM_FIRST + 2;  // #define DTM_SETSYSTEMTIME   (DTM_FIRST + 2)
    GDT_ERROR = -1;                     // #define GDT_ERROR    -1
    GDT_VALID = 0;                      // #define GDT_VALID    0
    GDT_NONE = 1;                       // #define GDT_NONE     1
var
    hRemoteTimePicker : HWND;
    dwRemoteProcess   : DWORD;
    hRemoteProcess    : DWORD;
    pRemoteMemory     : ^SYSTEMTIME;
    NewDateTime       : SYSTEMTIME;
    dwWritten         : DWORD;
begin
    hRemoteTimePicker := FindRemoteDateTimePicker;
    if hRemoteTimePicker = 0 then exit;

    if BOOLEAN(GetWindowThreadProcessId(hRemoteTimePicker, dwRemoteProcess)) then begin
        if BOOLEAN(dwRemoteProcess) then begin
            hRemoteProcess := OpenProcess(
                                    PROCESS_VM_OPERATION + PROCESS_VM_WRITE,
                                    FALSE,
                                    dwRemoteProcess);
            if BOOLEAN(hRemoteProcess) then begin
                pRemoteMemory := VirtualAllocEx(
                                        hRemoteProcess,
                                        nil,
                                        4096,
                                        MEM_COMMIT + MEM_TOP_DOWN,
                                        PAGE_READWRITE);
                if pRemoteMemory <> nil then begin
                    NewDateTime.wYear := 2001;
                    NewDateTime.wMonth := 1;
                    NewDateTime.wDay := 1;
                    NewDateTime.wHour := 12;
                    NewDateTime.wMinute := 34;
                    NewDateTime.wSecond := 56;
                    NewDateTime.wMilliseconds := 789;

                    WriteProcessMemory(
                            hRemoteProcess,
                            pRemoteMemory,
                            @NewDateTime,
                            sizeof(SYSTEMTIME),
                            dwWritten);
                    if (dwWritten > 0) then begin
                        SendMessage(
                                hRemoteTimePicker,
                                DTM_SETSYSTEMTIME,
                                GDT_VALID,
                                LPARAM(pRemoteMemory));
                    end;
                    VirtualFreeEx(hRemoteProcess, pRemoteMemory, 0, MEM_RELEASE);
                end;
                CloseHandle(hRemoteProcess);
            end;
        end;
    end;
end;

end.
B_N вне форума Ответить с цитированием
Старый 22.04.2008, 15:21   #6
Андрей=
 
Регистрация: 22.04.2008
Сообщений: 9
По умолчанию

Спасибо, B_N.
Разобрался, немного переделав функцию, т.к. ID у меня был, все работает. Действительно, очень интересное решение!!!
Спасибо.
Андрей= вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DateTimePicker и SQL запрос SlavyanD БД в Delphi 5 25.11.2011 10:10
DateTimePicker в DBGrid Alex_76 Помощь студентам 4 20.06.2008 15:21
DateTimePicker Delphi GAGARIN-NEW Помощь студентам 7 06.12.2007 15:23
Вопросы DateTimePicker Askat БД в Delphi 14 29.06.2007 18:53
DateTimePicker + Label krem Компоненты Delphi 2 10.05.2007 16:36