google關鍵字"mirrordriver",大部分的可以看到一些應用層的**,但是驅動層的**寥寥無幾,實際上只有mirrordriver vnc和qemu的顯示卡驅動有相關**。但實際上從微軟的sample code修改一下就可以很快實現乙個自己的mirrordrivermirrordriver在xp時代是最有效的轉屏方式,原理是直接從gdi桌面混合器中直接獲取影象資料。那麼如果獲取影象資料又有兩種方式嗎,一種是使用檔案,另外一種是客戶端先分配一段記憶體然後通過驅動程式讓mirrordriver在這段記憶體中寫入影象資料。
1、在檔案driver.h中新增
pvoid pvtmpbuffer;
// ptr to mirrsurf bits for screen su***ce
2、在drvenablesu***ce函式中 flhooks |= ***lobalhooks 後的**替換成一下**,實際上,engcreatedevicesu***ce和engcreatebitmap從文件上看沒有什麼差別,都可以。
mirrorsize =
(ulong)
(ppdev-
>cxscreen * ppdev-
>cyscreen * bitsperpel)
;ppdev-
>pvtmpbuffer =
engmapfile
(l"\\??\\c:\\video.dat"
, mirrorsize,
&ppdev-
;hsurf =
(hsurf)
engcreatebitmap
(sizl,
ppdev-
>ldeltascreen,
ulbitmaptype,0,
(pvoid)
(ppdev-
>pvtmpbuffer));
if(hsurf ==
(hsurf)0)
if(!engassociatesu***ce
(hsurf, ppdev-
>hdeveng, flhooks)
)return
(hsurf)
;
3、參考原始碼,修改drvcopybits、drvbitblt、drvtextout等函式,直接呼叫底層eng*函式,讓驅動直接往下執行。
4、修改sreen.c檔案,整體替換就行了。原理可能需要了解gdi內部繪圖方式了。
5、編譯安裝重啟後,驅動會在c盤下新建檔案video.dat檔案,檔案內容就是桌面的映象畫面,實際上就是rgba資料
1、獲取共享記憶體檔案的內容的指標。
pchar videomemory_getsharedmemory
(void
)closehandle
(hfile);}
return pvideomemory;
}
void
capturescreenframe
(int width,
int height,rect cropregin, pchar myframebuffer,
int index)
**已開源 從0開擼C (四) 函式過載和運算子過載
本期主題 c 中的函式過載和運算子過載 2.過載加號運算子 person person person person string name person person intmain void gary ubuntu workspaces cpp study 2.6.operator overloa...
從0開始 二
slam是指當某種移動裝置 如機械人 無人機 手機等 從乙個未知環境裡的未知地點出發,在運動過程中通過感測器 如雷射雷達 攝像頭等 觀測定位自身位置 姿態 運動軌跡,再根據自身位置進行增量式的地圖構建,從而達到同時定位和地圖構建的目的。sfm structure from motion 是一種和sl...
從settings檔案建立django開發索引
新增的配置 django專案的開發過程中,在對整個框架不夠了解之前,內容僅靠模糊的記憶可能會導致一系列的未知問題 例如乙個字母寫錯 全域性配置檔案settings中的配置,往往可以對映整個專案所需要的內容。django版本1.11 其實不算是預設的,只是在建立專案之後,已經為我們寫了一些配置 當然,...