VC多螢幕顯示

2021-07-03 02:30:44 字數 3093 閱讀 9434

由於工程需要在多個顯示器上顯示不同類容,故查詢了一些資料來滿足這個功能。在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:如果對系統虛擬座標不了解的可以去檢視一下相關資料)
示例**:

crect

retemp

;retemp

.bottomright

()=cpoint

(devmode

.dmpelswidth

+devmode

.dmposition.x

,devmode

.dmpelsheight

);retemp

.topleft

()=cpoint

(devmode

.dmposition.x

,devmode

.dmposition.y

);movewindow

(&retemp

);

這段**新增在mfc程式中的oninitdialog()中,這樣程式一開始執行就可以在你想要顯示的螢幕中執行.

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...