PDA

View Full Version : دريافت و تغيير Resolution و Refresh Rate صفحه نمايش



pandco
سه شنبه 31 اردیبهشت 1387, 11:10 صبح
با سلام خدمت دوستان ارجمند
من ميخواهم كه Resolution و Refresh Rate صفحه نمايش را دريافت كنم و اونو به مقدار دلخواه تغيير بدم و بعد از خارج شدن از برنامه به رزوليشن اولي باز گردد.
دستور Screen اطلاعات را دريافت مي كنه ولي Refresh Rate رو دريافت نمي كنه.
با تشكر از كمك و توجه دوستان.
--------------------------------------------------------------
به جاي اينكه سعي كني جاي كسي را بگيري ، سعي كن جاي واقعي خود را بيابي.

pandco
سه شنبه 31 اردیبهشت 1387, 13:27 عصر
در صورت امکان کمک کنید واقعا ضروری است.مچکرم

taha
سه شنبه 31 اردیبهشت 1387, 14:09 عصر
سلام
اگه جستجو می کردی...!
http://barnamenevis.org/forum/showthread.php?t=52234

pandco
سه شنبه 31 اردیبهشت 1387, 18:04 عصر
با سلام خدمت دوست عزيز كد زير Resolutoin را تغيير مي ده

procedure SetResolution(ResX, ResY: DWord);
var
lDeviceMode : TDeviceMode;
begin
EnumDisplaySettings(nil, 0, lDeviceMode);
lDeviceMode.dmFields:=DM_PELSWIDTH or DM_PELSHEIGHT;
lDeviceMode.dmPelsWidth :=ResX;
lDeviceMode.dmPelsHeight:=ResY;
ChangeDisplaySettings(lDeviceMode, 0);
end;

ولي من بغير از Resolution ، مي خواهم كه Refresh Rate مثلا 85HZ را نيز تغيير دهم در صورت امكان كمك نماييد.
با تشكر از دوستان گرامي.
------------------------------------------------------------------------------------
به جاي اينكه سعي كنيد جاي كسي را بگيريد ، سعي كنيد جاي واقعي خود را بيابيد.

taha
سه شنبه 31 اردیبهشت 1387, 18:44 عصر
سلام
تغییر Resolution و Refresh Rate


function TForm1.DisplaySettings(const ScreenWidth, ScreenHeight, RefreshRate: integer): integer;
var
DevMode: TDeviceMode;
begin
with DevMode do
begin
dmSize := SizeOf(DevMode);
dmPelsWidth := ScreenWidth;
dmPelsHeight := ScreenHeight;
dmDisplayFrequency := RefreshRate;
dmFields := DM_BITSPERPEL or DM_PELSWIDTH or DM_PELSHEIGHT or DM_DISPLAYFREQUENCY;
end;
Result := ChangeDisplaySettings(DevMode, CDS_UPDATEREGISTRY);

case Result of
DISP_CHANGE_SUCCESSFUL:; {'The settings change was successful.'}
DISP_CHANGE_RESTART : MessageDlg('The computer must be restarted in order for the graphics mode to work.', mtInformation, [mbOK], 0);
DISP_CHANGE_BADFLAGS : MessageDlg('An invalid set of flags was passed in.', mtInformation, [mbOK], 0);
DISP_CHANGE_FAILED : MessageDlg('The display driver failed the specified graphics mode.', mtInformation, [mbOK], 0);
DISP_CHANGE_BADMODE : MessageDlg('The graphics mode is not supported.', mtInformation, [mbOK], 0);
DISP_CHANGE_NOTUPDATED: MessageDlg('Unable to write settings to the registry.', mtInformation, [mbOK], 0);
end;
end;

pandco
سه شنبه 31 اردیبهشت 1387, 19:15 عصر
با سلام خدمت دوست گرامي
من وقتي 60و600و800 را وي دم پيغام زير را ميدهد :

The graphics mode is not supported

لطفا در صورت امكان مشكل را بگوييد.

pandco
سه شنبه 31 اردیبهشت 1387, 19:28 عصر
با سلام
در خط پايين

dmFields := DM_BITSPERPEL or DM_PELSWIDTH or DM_PELSHEIGHT or DM_DISPLAYFREQUENCY;

گزينه DM_BITSPERPEL or رو حذف كردم درست شد و بخوبي عمل مي كند

dmFields := DM_PELSWIDTH or DM_PELSHEIGHT or DM_DISPLAYFREQUENCY;

با تشكر از دوست گرامي كه مرا راهنمايي و كمك كرد.
------------------------------------------------------------------------------------------------
بجاي اينكه سعي كنيد جاي كسي را بگيريد ، سعي كنيد جاي واقعي خود را بيابيد.

pandco
چهارشنبه 01 خرداد 1387, 16:20 عصر
من با تابع بالا صفحه نمایش را تغییر می دهم ولی باید resolution قبلی را ذخیره نماییم تا از برنامه خارج شد به حالت قبلی باز گردد با کد پایین فقط resolution را می توانم دخیره کنم ولی Refresh Rate را نمی توانم.

a:=Screen.Width;
b:=Screen.Height;

خوب حالا چطوری Refresh Rate را بخونم.
لطفا راهنماییم کنید.

taha
چهارشنبه 01 خرداد 1387, 17:26 عصر
خواندن Refreshrate صفحه نمایش:

procedure TForm1.Button1Click(Sender: TObject);
var
DevMode:_devicemodea;
begin
EnumDisplaySettings( nil, Cardinal(-1), DevMode);
ShowMessage(IntToStr(DevMode.dmDisplayFrequency));
end;اگه دقت کنی با فراخونی تابع EnumDisplaySettings مقادیر مرتبط در DevMode که از نوع _devicemodea قرار می گیره که نوع _devicemodea بصورت زیره:


_devicemodeA = packed record
dmDeviceName: array[0..CCHDEVICENAME - 1] of AnsiChar;
dmSpecVersion: Word;
dmDriverVersion: Word;
dmSize: Word;
dmDriverExtra: Word;
dmFields: DWORD;
dmOrientation: SHORT;
dmPaperSize: SHORT;
dmPaperLength: SHORT;
dmPaperWidth: SHORT;
dmScale: SHORT;
dmCopies: SHORT;
dmDefaultSource: SHORT;
dmPrintQuality: SHORT;
dmColor: SHORT;
dmDuplex: SHORT;
dmYResolution: SHORT;
dmTTOption: SHORT;
dmCollate: SHORT;
dmFormName: array[0..CCHFORMNAME - 1] of AnsiChar;
dmLogPixels: Word;
dmBitsPerPel: DWORD;
dmPelsWidth: DWORD;
dmPelsHeight: DWORD;
dmDisplayFlags: DWORD;
dmDisplayFrequency: DWORD;
dmICMMethod: DWORD;
dmICMIntent: DWORD;
dmMediaType: DWORD;
dmDitherType: DWORD;
dmICCManufacturer: DWORD;
dmICCModel: DWORD;
dmPanningWidth: DWORD;
dmPanningHeight: DWORD;
end;یعنی شما می تونی خیلی دیگه از مقادیر مربوط به صفحه نمایش خودته بدست بیاری مثل Resolution, RefreshRate, ColorBits و ...
مثلا

DevMode.dmPelsWidth;
DevMode.dmPelsHeight;
DevMode.dmDisplayFrequency;
DevMode.dmBitsPerPel;
...
برای تغییر دادن هم فقط لازم مثل تابع که قبلا گفتم فیلدهای مختلف رکورد DevMode را مقدار مناسب بدی.

[برای اینکه بحث کامل تر بشه] اینم برای اینه که اگر بخوای در برنامت ایجاد تغییرات در تنظیمات صفحه نمایشت را دیتکت کنی

type
TForm1 = class(TForm)

...
private
procedure WMDisplayChange(var Message:TMessage) ; message WM_DISPLAYCHANGE;
...



procedure ;TForm1.WMDisplayChange(var Message: TMessage) ;
begin
ShowMessage('Changes in display Detected!') ;
inherited;
end;

pandco
چهارشنبه 01 خرداد 1387, 18:06 عصر
با تشكر از دوست گرامي ممنون كه كمك كردي. مشكل ذخيره و تغيير Resolutionn به كلي حل شد.
ممنون.

nassim_20
سه شنبه 20 فروردین 1392, 13:49 عصر
من هم همین مشکل رو دارم ولی چیزی متوجه نشدم میشه واضحتر توضیح بدهید
کد مربوط به تغییر رزولوشن رو دارم ولی تغییر رفرش رو ندارم
اگه ممکنه کد مربوط به تغییر رفرش رو بزارید