View Full Version : سوال: تغییر تاریخ سیستمی
ATULICUS
سه شنبه 29 بهمن 1392, 19:03 عصر
سلام به همگی !
اول بگم که تو سایت جستجو کردم ، جواب من نبودند !
میخوام تاریخ سیستمی که برنامه روش اجرا میشه رو تغییر بدم (حالا با هر روشی)
من خودم از ShellExecute به این صورت استفاده کردم
صفحه cmd رو میاره مه باید تاریخ رو توش وارد کنی و اینتر بزنی اما من میخوام که کاربر درگیر این کار نشه و خودکار انجام بشه
میخواستم از دوستان که ایراد این روش رو بگیرند و روش های خودشونو پیشنهاد بدن
ShellExecute(0,PChar('open'),PChar('cmd.exe'),PCha r('/k date 18-02-2004'),nil,SW_SHOWNORMAL) ;
________
ممنون !
یوسف زالی
سه شنبه 29 بهمن 1392, 21:36 عصر
سلام.
سر هر کاری که نمی رن سراغ CMD.
var
SystemTime: TSystemTime;
NewTime, NewDate: string;
begin
NewTime := '10:21:00';
DateTimeToSystemTime(DateOf(Date) + StrToTime(NewTime), SystemTime);
SetLocalTime(SystemTime);
PostMessage(HWND_BROADCAST, WM_TIMECHANGE, 0, 0); // *
end;
ATULICUS
چهارشنبه 30 بهمن 1392, 05:38 صبح
سلام
ممنون یوسف جان اما ...
من یه همچین سورسی پیدا کردم ، به این شکل :
procedure TForm1.Button1Click(Sender: TObject);
var
SystemTime: TSystemTime;
NewTime, NewDate: string;
begin
NewTime := '13:58:00';
NewDate := '02.02.2001'; // or '02/02/01'
DateTimeToSystemTime(StrToDate(NewDate) + StrToTime(NewTime), SystemTime);
SetLocalTime(SystemTime);
// Tell windows, that the Time changed!
PostMessage(HWND_BROADCAST, WM_TIMECHANGE, 0, 0); // *
end;
اما یه همچین توضیحی داده در ادامه اش :
Windows 2000 and later: An application should not broadcast the WM_TIMECHANGE message because the system will broadcast this message when the application changes the system time.
و بعدش هم ، این کد مگه زمان رو تغییر نمیده ؟
من با زمان و روز و ماه کاری ندارم فقط میخوام سال سیستم رو بگیرم (مثلا 2014) و روش محاسبات کنم (مثلا 10 تا ازش کم کنم) و تاریخ جدید رو که فقط سال تغییر کرده تو سیستم مشتری ست کنم
سر هر کاری که نمی رن سراغ CMD
دیوار کوتاه تر از cmd گیر نیاوردیم ما
حالا جدای از شوخی ، میشه همون ورود تاریخ و اینتر زدن رو با کد شبیه سازی کرد که کاربر درگیر نشه !؟
_____________
پیشاپیش تشکر !
ATULICUS
چهارشنبه 30 بهمن 1392, 05:50 صبح
اینم الان دیدم
اما اینم واسه تغییر زمان سیستم هست
میشه تغییرش داد به تاریخ یا من برداشتم اشتباهه ؟
function SetPCSystemTime(dDateTime: TDateTime): Boolean;
const
SE_SYSTEMTIME_NAME = 'SeSystemtimePrivilege';
var
hToken: THandle;
ReturnLength: DWORD;
tkp, PrevTokenPriv: TTokenPrivileges;
luid: TLargeInteger;
dSysTime: TSystemTime;
begin
Result := False;
if (Win32Platform = VER_PLATFORM_WIN32_NT) then
begin
if OpenProcessToken(GetCurrentProcess,
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
try
if not LookupPrivilegeValue(nil, SE_SYSTEMTIME_NAME, luid) then Exit;
tkp.PrivilegeCount := 1;
tkp.Privileges[0].luid := luid;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if not AdjustTokenPrivileges(hToken, False, tkp, SizeOf(TTOKENPRIVILEGES),
PrevTokenPriv, ReturnLength) then Exit;
if (GetLastError <> ERROR_SUCCESS) then begin
raise Exception.Create(SysErrorMessage(GetLastError));
Exit;
end;
finally
CloseHandle(hToken);
end;
end;
DateTimeToSystemTime(dDateTime, dSysTime);
Windows.SetLocalTime(dSysTime);
end;
end;
_______
ممنون !
یوسف زالی
چهارشنبه 30 بهمن 1392, 13:19 عصر
اون هم همون کده شماست. همون کدی رو که دادم بخونید، به جای زمان تاریخ رو بدید. در حقیقت اون کد هم زمان و هم تاریخ رو هم زمان عوض می کنه. من برای تست کردن تایم رو عوض کردم.
اون ارسال مسیج هم به همه برنامه های باز خبر می ده که زمان سیستم عوض شده. همین.
ATULICUS
چهارشنبه 30 بهمن 1392, 21:34 عصر
سلام دوستان !
بازم تشکر از یوسف به خاطر جوابش !
من به جواب سوالم رسیدم.
برای آیندگان می نویسم :
ساده ترین کد و روش این روش هست :
DateTimeToSystemTime(local_date + local_time, SystemTime);
SetLocalTime(SystemTime);
PostMessage(HWND_BROADCAST, WM_TIMECHANGE, 0, 0);
من این روش رو برای هدفی که در پست های بالا تشریح کرده بودم ، به این شکل به کار بردم :
program Project2;
{$APPTYPE CONSOLE}
{$R *.res}
uses
Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,windows,StrUtils;
var
SystemTime: TSystemTime;
local_time:TTime;
local_date,new_date :TDate;
temp_date:string;
str_y,str_m,str_d:string;
begin
local_time := Time;
local_date := Date;
temp_date := DateToStr(local_date);
str_y := Copy(temp_date,0,4); // 2014/02/19
str_m := Copy(temp_date,6,2);
str_d := Copy(temp_date,9,2);
if ( StrToInt(str_y)<> 2004 ) then
begin
str_y := '2004';
local_date := StrToDate(str_y+'/'+str_m+'/'+str_d);
//--
DateTimeToSystemTime(local_date + local_time, SystemTime);
SetLocalTime(SystemTime);
PostMessage(HWND_BROADCAST, WM_TIMECHANGE, 0, 0);
end
else
begin
DateTimeToSystemTime(local_date + local_time, SystemTime);
SetLocalTime(SystemTime);
PostMessage(HWND_BROADCAST, WM_TIMECHANGE, 0, 0);
end;
end.
___________
موفق باشید !
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.