如何知道目前電腦的解析度,顏色位色數和掃描頻率 |
尚未結案
|
saam
初階會員 發表:61 回覆:75 積分:27 註冊:2003-03-03 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
解析度 :
API :
X := GetSystemMetrics(SM_CXSCREEN);
Y := GetSystemMetrics(SM_CYSCREEN);
TScreen :
X := Screen.Width
Y := Screen.Height 顏色位bit數 :
var
HDC1 : HDC HDC1 := CreateIC('DISPLAY',NIL,NIL,NIL);
if GetDeviceCaps(Hdc1, PLANES) = 4 then
Bit := 16
else
Bit := GetDeviceCaps(Hdc1, BITSPIXEL);
DeleteDC(HDC1); 掃描頻率 :
不知道
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
1.Screen.Width/Screen.Height 就是解析度
2.
var h: HDC; Bits: integer ; begin h := GetDC(0); Bits := GetDeviceCaps(h, BITSPIXEL); case Bits of 1: ShowMessage('Monochrome'); 4: ShowMessage('16 color'); 8: ShowMessage('256 color'); 16: ShowMessage('16-bit color'); 24: ShowMessage('24-bit color'); end ; ReleaseDC(0, h); end;--- 每個人都是一本書 |
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
saam
初階會員 發表:61 回覆:75 積分:27 註冊:2003-03-03 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
你是打算用 EnumDisplaySettings 取得合用的 DEVMODE 然後用 ChangeDisplaySettings 來改變解拆度嗎 ? 若是的話,其實跟本就不是你的程式主動設定甚麼,而是被動的檢查 EnumDisplaySettings 傳過來的然後決定要不要。雖然較被動,但卻安全因為傳過來的都是系統支援的。 由於低解像度支援的 Refresh Rate 高解像度未必支援,所以一般來說都是接受附合其他條件的第一個回傳值的,而那一般會是該解像度的預設值。 一點貼示 :
你可用
ChangeDisplaySettings(PDeviceMode(Nil)^,0)
快速地回來原來的設定。 發表人 - Justmade 於 2003/05/10 14:43:51
|
gg3166@163.com
一般會員 發表:0 回覆:1 積分:0 註冊:2003-05-05 發送簡訊給我 |
我在写一个程序的时候,用的是这样的方法:被动适应,首先取出原来的分辨率,刷新率,色深,保存在一个矩形变量里面,还原时候用: 其他我不说了。有人回答了。
下面是刷新率:
var DeviceMode:tdevicemode;
begin
EnumDisplaySettings(nil, Cardinal(-1), DeviceMode); seting.Left:=getsystemmetrics(sm_cxscreen);
seting.Right:=getsystemmetrics(sm_cyscreen);
seting.Top := DeviceMode.dmDisplayFrequency; if not resolution(1024,768,75) then
exit;
end; --------------------------------------
Resolution(X, Y,z: word): boolean;
var
DevMode:TDeviceMode;
begin
Result:=EnumDisplaySettings(nil,0,DevMode);
if Result then
begin DevMode.dmFields:=DM_PELSWIDTH Or DM_PELSHEIGHT or dm_displayfrequency; DevMode.dmPelsWidth:=X;
DevMode.dmPelsHeight:=Y;
devmode.dmDisplayFrequency :=z;
Result:=ChangeDisplaySettings(DevMode,0)=DISP_CHANGE_SUCCESSFUL;
end;
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
引言: EnumDisplaySettings(nil, Cardinal(-1), DeviceMode);Help 中說第二個參數是由 0 開始的,全沒提出可用 -1 iModeNum Index value that specifies the graphics mode for which information is to be obtained. Graphics mode indexes start at zero. To obtain information for all of a display device's graphics modes, make a series of calls to EnumDisplaySettings, as follows: Set iModeNum to zero for the first call, and increment iModeNum by one for each subsequent call. Continue calling the function until the return value is FALSE. When you call EnumDisplaySettings with iModeNum set to zero, the operating system initializes and caches information about the display device. When you call EnumDisplaySettings with iModeNum set to a non-zero value, the function returns the information that was cached the last time the function was called with iModeNum set to zero. 但實質測試真的可以用 - 1 來取得現在的參數 又學到一招秘招了 但你沒有遂個檢對 EnumDisplaySetting 的回傳值而直接修改內容去 ChangeDisplaySetting, 是不大安全的,因為你設定的有可能是顯示卡不支援的。大多數顯示卡是會拒絕轉換,但有些較舊的顯示卡會在轉換後使畫面死掉,使用者必須在安全模式將之轉回後才能用。 |
saam
初階會員 發表:61 回覆:75 積分:27 註冊:2003-03-03 發送簡訊給我 |
|
x803198
一般會員 發表:8 回覆:28 積分:17 註冊:2002-12-06 發送簡訊給我 |
雖然你已經找到答案了
這是我以前寫的,希望能大家方便 Type
TDevmode = record
DW : DWORD;
DH : DWORD;
DV : DWORD;
DBit : DWORD;
end; // 檢查我要的w,h,bit
function CheckDeviceMode(w,h,bit:Integer):Boolean;
Var
i : Integer;
DevMode : TDeviceMode;
begin
i:=0;
Result := False;
while EnumDisplaySettings(nil,i,DevMode) do
if (DevMode.dmPelsWidth = w) and
(DevMode.dmPelsHeight = h) and
(DevMode.dmBitsperPel = bit) then
begin
Result := True;
Exit;
end else inc(i);
end; // 取得目前的 w ,h ,bit ,更新頻率
function GetDeviceMode(Hd:Hwnd):TDevmode;
Var
dc : Cardinal;
begin
dc := GetWindowDC(Hd);
with Result do
begin
DW := GetDeviceCaps(dc, HORZRES);
DH := GetDeviceCaps(dc, VERTRES);
DV := GetDeviceCaps(dc, VREFRESH);
DBit := GetDeviceCaps(dc, BITSPIXEL);
end;
ReleaseDC(Hd, dc);
end; // 設定我要的 w ,h ,bit ,更新頻率
function SetDeviceMode(Dev:TDevmode):Boolean;
Var
i : Integer;
DevMode : TDeviceMode;
begin
i := 0;
Result := False;
while EnumDisplaySettings(nil,i,DevMode) do
if (DevMode.dmPelsWidth = Dev.DW) and
(DevMode.dmPelsHeight = Dev.DH) and
(DevMode.dmDisplayFrequency = Dev.DV) and
(DevMode.dmBitsperPel = Dev.DBit) then
begin
ChangeDisplaySettings(DevMode,0);
Result := True;
Exit;
end else inc(i);
end; 程式是一條不歸路
|
saam
初階會員 發表:61 回覆:75 積分:27 註冊:2003-03-03 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |