由於工程需要在多個顯示器上顯示不同類容,故查詢了一些資料來滿足這個功能。在vc中分為三步來操作:檢測顯示器個數;讀取螢幕解析度和其他引數;設定程式的顯示座標。
第一步:檢測螢幕個數
網上查詢到的通用方法有兩個:enumdisplaydevicess和getsystemmetrics,下面分別介紹一下:
函式功能:該函式可得到系統中顯示裝置的資訊。
函式原型:bool enumdisplaydevices (pvoid unused, dword idevnum, pdisplay_device lpdisplaydevice,
dword dwflags);
其中第乙個引數和最後乙個引數現在都還沒用到,主要是第二個引數和第三個,這裡簡要介紹一下
idevnum:指定感興趣的顯示裝置的索引值,作業系統通過索引值確定每乙個顯示裝置。索引值是連續的整數。從0開始,例如:如果乙個系統有三個顯示裝置,那麼它們的索引值為0、1、2。
lpdisplaydevice:display_device結構的指標,該結構檢索由idevnum指定的顯示裝置的資訊,在呼叫enumdisplaydevices之前,必須以位元組為單位把display_device結構中cb元素初始化為display_device結構的大小。
示例**:
int inumber=0;bool bflag
=true
;display_device dd
;zeromemory
(&dd
,sizeof(dd
));dd
.cb
=sizeof(dd
);devmode devmode
;zeromemory
(&devmode
,sizeof
(devmode
));devmode
.dmsize
=sizeof
(devmode
);do
while
(bflag
);
其中inumber中就為系統所帶顯示器的數量,網上很多地方都沒有紅色這一行,這樣檢測的結果並不準確,我用的筆記本不管是不是有外接顯示器,檢測出的數字始終為5,檢視了這篇日誌(後新增了紅色語句後,執行結果就正常了。猜想enumdisplaydevices只是檢測系統中存在的顯示裝置,並不一定是當前一定在用的裝置。新增設定語句後,就可以檢測到正在使用的裝置了。
b.int winapi getsystemmetrics( __in int nindex)
(msdn連線:
只要設定nindex為sm_cmonitors即可,msdn的解釋為:the number of display monitors on a desktop.
示例**:int inumber=getsystemmetrics
(sm_cmonitors
);cstring
csnum
;csnum
.format(_t
("%d"
),inumber
);messagebox
(csnum,_t
("顯示器數量"
),mb_ok
);
相比a中的設定,這個簡單多了,推薦使用此函式。
第二步,讀取顯示器引數及其他引數
該過程使用前面的兩個api函式:enumdisplaydevices和enumdisplaysettings。
//初始化
bool bflag;
display_device dd;
zeromemory
(&dd
,sizeof(dd
));dd
.cb
=sizeof(dd
);devmode devmode
;zeromemory
(&devmode
,sizeof
(devmode
));devmode
.dmsize
=sizeof
(devmode
);bflag
=enumdisplaydevices
(bull
,inumber
,&dd,0
);if
(bflag
)return
flase
;bflag
=enumdisplaydevices(dd
.devicename
,enum_current_settings
,&devmode
);
inumber為要查詢的顯示器編號,從0開始,主屏為0,然後1,2,3....一直下去。查詢為enumdisplaysettings(),查詢的資料儲存在devmode中,常用的為dmposition(為當前顯示器的座標位置),dmpelswidth,dmpelsheight(為當前顯示器的解析度),其餘根據自己需要參見msdn(
第三步:設定當前程式的顯示位置
在前兩步的基礎上,根據自己的需要來設定當前程式的顯示座標(ps:如果對系統虛擬座標不了解的可以去檢視一下相關資料)
示例**:這段**新增在mfc程式中的oninitdialog()中,這樣程式一開始執行就可以在你想要顯示的螢幕中執行.crect
retemp
;retemp
.bottomright
()=cpoint
(devmode
.dmpelswidth
+devmode
.dmposition.x
,devmode
.dmpelsheight
);retemp
.topleft
()=cpoint
(devmode
.dmposition.x
,devmode
.dmposition.y
);movewindow
(&retemp
);
vc獲得顯示螢幕大小
int with getsystemmetrics sm cxfullscreen int heigh getsystemmetrics sm cyfullscreen 通過上邊兩個函式獲取的是顯示螢幕的大小,及不包括工作列等區域。int cx getsystemmetrics sm cxscree...
Winform程式實現多顯示屏 多螢幕顯示的方法
winform視窗實現多顯示屏顯示的2種方法,本文直接給出了實現 並對其中的一些重要引數做了解釋,需要的朋友可以參考下。一台主機連線了2臺顯示器 2個顯示卡 要求乙個程式的兩個窗體在不同的顯示器上顯示 顯示器1 顯示from1,顯示器2 顯示from2。及說明如下 form1不需要變更 from2新...
C 多螢幕顯示器程式設計
在視窗的中間有乙個system.windows.forms.picturebox控制項 該控制項區域的面積為所在視窗的1 4 當該控制項的大部分區域落在其中一台顯示器時,在另一台顯示器將不顯示該控制項,該picturebox控制項將移動到主顯示器所在的視窗區域 實現方法 using system u...