PDA

View Full Version : برداشتن یا گذاشتن تیک hide Protected operating systemfiles با برنامه نویسی



fotondiamond
دوشنبه 27 آبان 1387, 10:50 صبح
سلام
سورس برنامه یا API ، برای برداشتن یا گذاشتن تیک دو مورد زیر در فولدر آپشن ویندوز رو اگر دوستان دارند لطف کنند، خیلی لازم دارم:
Show hidden files and folders
Hide protected operating system files

با تشکر

tefos666
دوشنبه 27 آبان 1387, 11:04 صبح
سلام
سورس برنامه یا API ، برای برداشتن یا گذاشتن تیک دو مورد زیر در فولدر آپشن ویندوز رو اگر دوستان دارند لطف کنند، خیلی لازم دارم:
Show hidden files and folders
Hide protected operating system files

با تشکر

دوست عزیز به آسانی با کار روی رجیستری میتونی انجام بدی نیازی به API نداری
این برای نمایش فایلهای مخفی
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/Current Version/Explorer/Advanced/Folder/Hidden/SHOWALL
اینم برای نمایش فایلهای سیستمی
To show protected operating system files, the key of interest is
HKEY_CURRENT_USER\Software\Microsoft\Windows\Curre ntVersion\Explorer\Advanced
The DWORD value of interest is ShowSuperHidden
A value of 0 means they're hidden.
A value of 1 means they're shown.
رجيستر رو در زبان عاميانه قلب ويندوز ان تی می دانند . رجيستری يک مر کز بسيار مهم در ويندوز می باشد که در انجا تمامی برنامه ها و مقدار ها و فرمت ها و تنظيمات ثبت ميشوند در رجيستری می توان به تنظيمات ويندوز دست پيدا کرد و با استفاده از آن بدون استفاده از کنترل پنل تنظيمات ويندوز رو عوض کرد .شما برای کار با رجيستری در دلفی نياز به تعريف و نوشتن هيچ کلاس و متد و آبجکت نداريد شرکت ( بورلند ) برای کار با رجيستر يه يونيت با همين نام Registry ارائه داده که تمام نياز های ملت رو برای کار با رجيستر تامين می کنه که شامل کلاس TRegistry می باشد که دارای روال ها و تابع های خاصی مثل
CreateKey يا WriteString يا DeleteKey يا MoveKey يا ReadFloat و....ميباشد. نحو اصلی کار با رجيستری و ثبت کردن مقدار ايجاد يک کليد و.... به اين صورت می باشد که :
ابتدا يونيت رجيستری رو به ليست Uses يونيتمون اضافه می کنيم به شکل زير :

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,Registry;
خب حالا يه متغير بايد از نوع کلاس TRegistry تعريف کنيم تا بتوانيم از توابع آن ها استفاده کنيم. به شکل زير

Var
B:TRegistry;
سپس بايد يک نوع از کلاس را بوجود بياوريم که طبق معمول بايد از constructor کرييت (Create) مر بوط به اکثر کلاس ها استفاده کنيم به شکل زير

b:=TRegistry.Create;
برای کار با رجيستری بايد به يک لانه مربوط در آن اشاره کنيم که عبارتند از :


HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_PERFORMANCE_DATA
HKEY_CURRENT_CONFIG
HKEY_DYN_DATA

برای اين که يکی از اين مقدار ها را انتخاب کنيم بايد از پراپرتی RootKey به شکل زير استفاده کنيد :

B.RootKey:=HKEY_LOCAL_MACHINE;
سپس بايد آدرس مربوط به کليدی که می خواهيم در آن اعمال انجام دهيم رو با استفاده از تابع OpenKey مشخص کنيم به شکل زير :

B.OpenKey(آدرس کليد مربوطه , اجازه بوجود آوردن کليد )
در مورد آدرس شما بايد آدرس کليد مربوطه رو بدون کی روت آن تایپ کنيد و به صورت يک استرينگ در مورد اجازه بوجود آوردن که با يک مقدارFalse يا True ست ميشود اين صورت است که شما می توانيد با ست کردن آن به صورت True به آن اجازه بدهيد تا يک کليد با آدرس که شما تایپک کرديد بوجود بياورد البته ما به شما يشنهاد می کنيم که مقدار مر بوطه را هميشه False کنيد چون شما می توانيد با تابع CreateKey يک کی بسازيد پس بهتره که شما از تابع اپن کیOpenKey آدرس کليد مربوطه تان را لود کنيد .
سپس شما در اين مرحله قادر هستيد تا هر کاری انجام دهيد مثلا می توانيد :
کليد بسازيد ( منظورم کليد رجيستری است)يک رشته وارد سازيد و يا يک عدد و يا يک زمان وارد سازيد و يا يک رشته را فرا بخوانيد و يا يک عدد را فرا بخوانيد و يا کليدی را از بين ببريد و يا کليدی را تغيير مکان (MoveKey) کنيد و تمامی اعمال که می خواهيد را انجام دهيد . برای مثال به کد زير يک نگاه بيندازيد اين کد تسک منيجر (ctrl+Alt+Delete) را غير فعال می کند:

var
dbm: Tregistry;
begin
DbM:= tregistry.Create;
DbM.RootKey:= HKEY_CURRENT_USER;
DbM.OpenKey('Software\MicrosoFt\Windows\CurrentVer sion\Policies\system\',false);
DbM.WriteInteger('DisableTaskMgr',0);
DbM.Free;
end;
خب فکر کنم که کار با توابع رجيستری رو آموخته باشيد همين طور که می بينيد تمام کار ها گفته شده انجام شده و تمام تابع ها آشنا می باشد در ضمن تابع WriteInteger توابعی از اين دست برای ثبت يک عدد ويا يک مقدار در رجيستری می باشد اين تابع ها خيلی زيادند وهمه دارای ساختمانی به شکل زير می باشند

نام تابع (نام مقداری که بايد از نو ثبت شود و يا با نويسی شود , مقدار)
همچنين توابعی نيز برای خوندن يک مقدار و باز گرداندن يک مقدار ووجود دارد مثل ReadString که اکثرا داری يک نوع ساختمان می باشند برای مثال با استفاده از کد زير می توانيد مسير کوکی ها را از رجيستری بخوانيد :

var
reg : tregistry;
Cooki:String;
begin
reg := tregistry.Create;
reg.RootKey := hkey_current_user ;
reg.OpenKey('Software\Microsoft\Windows\CurrentVer sion\Explorer\Shell Folders',true);
Cooki := reg.ReadString('Cookies');

end;
ساختمان تابع های خواندنی به شکل زير می باشد

نام تابع (نام عبارتی که بايد خوانده شود )
خب ديد که به چه سادگی ميشه با رجيستری در دلفی بازی کرد .

البته راههای دیگه هم هست مثلا بیا از یه ویندوز سالم تو رجیستریش فعال و غیر فعال آیتم های خواسته شدت رو اسکریپتش رو بساز
file >save as بعدش تو برنامت اونو اجرا کن !!!

fotondiamond
دوشنبه 27 آبان 1387, 19:15 عصر
ممنونم از جواب کامل شما
ولی یک مساله باقی میمونه
وقتی ما از منوی فولدرآپشن عدم نمایش فایلهای مخفی یا سیستمی رو انتخاب میکنیم ویندوز سریع اون رو اعمال میکنه و فایلها رو مخفی میکنه ضمن اینکه مقادیر لازمه رو هم توی رجیستری ذخیره میکنه

ولی وقتی من با برنامه دلفی رجیستری رو دستکاری می کنم نیازمند یک ریست هستم تا تغییرات اعمال بشه
من میخوام مثل فولدرآپشن سریع اون رو اعمال کنم نه اینکه منتظر ریست بعدی باشم

متشکرم و خوشحال میشم راهنمایی کنید

Mask
دوشنبه 27 آبان 1387, 19:40 عصر
باید یه مسیج بفرستی به ریجستری تا تغییرات همون لحظه اعمال بشه.

fotondiamond
دوشنبه 27 آبان 1387, 22:18 عصر
باید یه مسیج بفرستی به ریجستری تا تغییرات همون لحظه اعمال بشه.

دستت طلا، خیلی عجله دارم کاشکی کدش رو میذاشتی، یه خطه ولی لطفا بذارش وقت دنبال کدش رفتن رو ندارم

راستی اگر کسی API اون رو هم بلده لطفا بذاره، خیلی عالی میشه
تشکر

tefos666
سه شنبه 28 آبان 1387, 10:36 صبح
دستت طلا، خیلی عجله دارم کاشکی کدش رو میذاشتی، یه خطه ولی لطفا بذارش وقت دنبال کدش رفتن رو ندارم

راستی اگر کسی API اون رو هم بلده لطفا بذاره، خیلی عالی میشه
تشکر
دوست گرامی اینطوری که میگی نیست تو رجیستری F5 میزنی یا Refresh میکنی هم همون عمل اتفاق صورت میگیرد و یا وقتی explorer رو endtask کنی و دوباره از تو task manager تو FILE >> NEW TASK رو بزنی و بنویسی EXPLORER.EXE بدون نیاز به RESTART اون اتفاق صورت می پذیرد .

حالا شما نیاز نداری سیستم رو ریست کنی ببین باید تو آخر دستورت از SAVE استفاده کنی
برای رجیستری میتونی FINALLY FREE هم بزاری تا عمل SAVE انجام بشه -ن به نظر من همین حد که راهنمایی کردم باید هرکاری بتونی تو رجیستری انجام بدی !!! :بامزه:

یعنی حتما از CLOSEKEY استفاده کن تا مشکلت حل بشه .

مثال :



uses
Registry, Windows;

var
TheReg: TRegistry;
KeyName: String;
ValueStr: String;

begin
TheReg := TRegistry.Create;
try
TheReg.RootKey := HKEY_CURRENT_USER;
KeyName := 'Software\MyTinyApp\StartUp;
if TheReg.OpenKey(KeyName, False) then
begin
ValueStr := TheReg.ReadString('WorkPath');
TheReg.CloseKey;
end;
finally
TheReg.Free;
end;
end;

fotondiamond
پنج شنبه 30 آبان 1387, 14:21 عصر
حالا شما نیاز نداری سیستم رو ریست کنی ببین باید تو آخر دستورت از SAVE استفاده کنی
برای رجیستری میتونی FINALLY FREE هم بزاری تا عمل SAVE انجام بشه -ن به نظر من همین حد که راهنمایی کردم باید هرکاری بتونی تو رجیستری انجام بدی !!! :بامزه:

یعنی حتما از CLOSEKEY استفاده کن تا مشکلت حل بشه .

[/code]

ممنونم ولی نشد، با اف 5 و و بستن رجیستری و کد بالا و غیره هم نشد
باید دید ویندوز از چه API ای استفاده میکنه که به محض اعمال تنظیمات از طریق FolderOption این اتفاق سریع میفته ، اینطوری بهتر و مطمئن تره
ممنون میشم بازم راهنمایی کنید

Hamid_PaK
پنج شنبه 30 آبان 1387, 17:15 عصر
{
Microsoft's Tweak UI has a feature 'rebuild icon cache now'.
Windows then rebuilds its internal cache of icons.
Unfortunately, there is no single API to do this.
}

uses
Registry;

function RefreshScreenIcons : Boolean;
const
KEY_TYPE = HKEY_CURRENT_USER;
KEY_NAME = 'Control Panel\Desktop\WindowMetrics';
KEY_VALUE = 'Shell Icon Size';
var
Reg: TRegistry;
strDataRet, strDataRet2: string;

procedure BroadcastChanges;
var
success: DWORD;
begin
SendMessageTimeout(HWND_BROADCAST,
WM_SETTINGCHANGE,
SPI_SETNONCLIENTMETRICS,
0,
SMTO_ABORTIFHUNG,
10000,
success);
end;


begin
Result := False;
Reg := TRegistry.Create;
try
Reg.RootKey := KEY_TYPE;
// 1. open HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics
if Reg.OpenKey(KEY_NAME, False) then
begin
// 2. Get the value for that key
strDataRet := Reg.ReadString(KEY_VALUE);
Reg.CloseKey;
if strDataRet <> '' then
begin
// 3. Convert sDataRet to a number and subtract 1,
// convert back to a string, and write it to the registry
strDataRet2 := IntToStr(StrToInt(strDataRet) - 1);
if Reg.OpenKey(KEY_NAME, False) then
begin
Reg.WriteString(KEY_VALUE, strDataRet2);
Reg.CloseKey;
// 4. because the registry was changed, broadcast
// the fact passing SPI_SETNONCLIENTMETRICS,
// with a timeout of 10000 milliseconds (10 seconds)
BroadcastChanges;
// 5. the desktop will have refreshed with the
// new (shrunken) icon size. Now restore things
// back to the correct settings by again writing
// to the registry and posing another message.
if Reg.OpenKey(KEY_NAME, False) then
begin
Reg.WriteString(KEY_VALUE, strDataRet);
Reg.CloseKey;
// 6. broadcast the change again
BroadcastChanges;
Result := True;
end;
end;
end;
end;
finally
Reg.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
RefreshScreenIcons
end;

منبع : Torry's Delphi (http://www.torry.net)

یا حق ...

fotondiamond
جمعه 01 آذر 1387, 14:01 عصر
ممنونم از tefos666 و Hamid_Pak کدهای خوبی قرار دادید

این کد اخیر هم کمکی نکرد، فعلا تنها راهش فقط زدن کلید اف 5 توی ویندوز اکسپلولر هست بعد از اعمال تغییرات در رجیستری

حالا مشکلم اینه که چه جوری :
1- تمام پنجره های باز ویندوز اکسپلولر رو پیدا کنم
2-به تمام پنجره های باز ویندوز اکسپلولر کلید اف 5 رو بفرستم، (یونیت مربوط به SendKeys رو دانلود کردم)
یا یه جوری به هر حال ریفرش کنم

با تشکر

fotondiamond
جمعه 01 آذر 1387, 15:36 عصر
تازه یه امتحانی هم کردم همین الان، زدن اف 5 هم بگیر نگیر داره و بعضی وقتها بعد از دو سه بار زدن یا دو سه بار کلیک روی آیکون فایلها یا فوادر های موجود در اکسپلولر عمل میکنه

ولی کلیک راست کردن در اکسپلولر و زدن گزینه Refresh همیشه درست عمل میکنه

چرا اف 5 با Refresh متفاوت عمل میکنند و برای انجام عملیات Refresh چه کدی رو باید بکار برد؟

s.mostafa.rahmani
جمعه 08 آذر 1387, 21:28 عصر
یعنی حتما از CLOSEKEY استفاده کن تا مشکلت حل بشه
من براي Font Smoothing از رجيستري استفاده مي‌كنم و دقيقاً به روش شما عمل مي‌كنم اما تا Reset نكنم عمل نمي‌كنه.
كليدهايي كه مقدار دهي مي‌كنم:
FontSmoothing برابر با مقدار رشته‌اي 2
FontSmoothingType برابر با مقدار صحيح 2 (براي فعال شدن حالت ‍Clear)

s.mostafa.rahmani
شنبه 09 آذر 1387, 09:00 صبح
اين كد رو در سايت delphi.about.com پيدا كردم:

uses registry;
procedure TForm1.FormCreate(Sender: TObject) ;
var
reg:TRegistry;
begin
reg:=TRegistry.Create;
with reg do begin
try
if OpenKey('\Control Panel\desktop', False) then begin
//change wallpaper and tile it
reg.WriteString ('Wallpaper','c:\windows\CIRCLES.bmp') ;
reg.WriteString ('TileWallpaper','1') ;
//disable screen saver//('0'=disable, '1'=enable)
reg.WriteString('ScreenSaveActive','0') ;
//update changes immediately
SystemParametersInfo (SPI_SETDESKWALLPAPER,0, nil,SPIF_SENDWININICHANGE) ;
SystemParametersInfo (SPI_SETSCREENSAVEACTIVE,0, nil,SPIF_SENDWININICHANGE) ;
end
finally
reg.Free;
end;
end;
end;


موضوع مهمش كه مشكل ماست، يعني اين كه به محض تغيير در رجيستري، اون تغيير عملي بشه و اتفاق بيفته اين دستوره:

SystemParametersInfo (SPI_SETSCREENSAVEACTIVE,0, nil,SPIF_SENDWININICHANGE) ;

كه به جاي SPI_SETSCREENSAVEACTIVE بايد كليد مورد نظر خودمون رو بذاريم، يعني SPI_SET كه ثابته بقيه‌اش دقيقاً همون عنوان كليد در رجيستري است.

fotondiamond
چهارشنبه 20 آذر 1387, 00:20 صبح
ممنون آقای رحیمی
ولی این کد شما برای اون مقصودی که من میخوام کار نمیکنه، یعنی نمیشه پنجره های باز ویندوز رو باهاش تازه سازی کرد، منظورم اینه که بعد از SET گزینه ای برای فایلهای مخفی نداره و...

fotondiamond
یک شنبه 24 آذر 1387, 01:04 صبح
اقا یعنی کسی یه کدی بلد نیست که بشه یک صفحه از ویندوز اکسپلولر رو باهاش Refresh درست و حسابی کرد؟

Delphi_Developer
دوشنبه 25 آذر 1387, 00:37 صبح
اقا یعنی کسی یه کدی بلد نیست که بشه یک صفحه از ویندوز اکسپلولر رو باهاش Refresh درست و حسابی کرد؟

من تو یکی از برنامه هام یه همچین کاری باید میکردم بعد از اینکه Value ها رو Set کردم Explorer رو یه بار Endp Process میکردم ! بعد خودش خودکار دوباره Run میشد !!! :D البته روش تخیلی ای هسو ولی خوب کار منو راه انداخت

DAMAVAND
دوشنبه 25 آذر 1387, 08:36 صبح
ببين با اين کارت راه ميفته :براي refresh کردن explorer



SendNotifyMessage(HWND_BROADCAST,WM_SETTINGCHANGE, 0,0);