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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

Купить рекламу на форуме 15-35 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2022, 01:50   #1
cybernewbie
Пользователь
 
Регистрация: 01.10.2022
Сообщений: 25
По умолчанию Изменить дату в чужом TDateTimePicker

Здравствуйте,

Хотел изменить дату с помощью DTM_SETSYSTEMTIME, конечно же ничего не получилось, нашёл на этом форуме следующий код:
Код:
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.
Как его можно применить, если handle TDateTimePicker известен?
И ещё в результате моих попыток разобраться, при компиляции выдаёт ошибку на строку с "//ВОТ ТУТ ОШИБКА":
Код:
[dcc32 Error] Unit1.pas(456): E2033 Types of actual and formal var parameters must be identical
Пожалуйста помогите, заранее благодарю
cybernewbie вне форума Ответить с цитированием
Старый 04.10.2022, 02:47   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,811
По умолчанию

Найдите в исходниках вашей Дельфи описание функции WriteProcessMemory и объявите переменные в соответствии с описанием. Нарытый на форуме код устарел. Устарел только в типах переменных.
northener вне форума Ответить с цитированием
Старый 04.10.2022, 09:14   #3
cybernewbie
Пользователь
 
Регистрация: 01.10.2022
Сообщений: 25
По умолчанию

Большое спасибо за помощь.
cybernewbie вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос о TDateTimePicker - как поместить дату в TEdit Афанасий[vedma] Компоненты Delphi 2 26.06.2012 10:48
Изменить дату комментариев на сайте GaJIbI4 Помощь студентам 0 16.12.2009 11:15
Как в профиле изменить дату рождения? Cj_ О форуме и сайтах клуба 2 16.11.2009 17:08
Help! Как изменить дату создания... Bigi Microsoft Office Excel 1 01.05.2008 14:59
Как изменить системную дату? Dude_first Win Api 1 23.10.2007 15:53